深度学习笔记36_函数式API之共享层(模型)的应用
Posted 瓦力人工智能
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习笔记36_函数式API之共享层(模型)的应用相关的知识,希望对你有一定的参考价值。
共享层权重
共享的意义在这里,就是重复使用一个层的实例。
对一个层实例调用两次
而不是每次调用都实例化一个新层
这样就可以实现:几个分支全都共享相同的知识并执行相同的运算,我们做的仅仅是对不同的输入来学习这些表示。
这里有一个实例,来自Keras文档:
来考虑推特推文数据集。我们想要建立一个模型来分辨两条推文是否来自同一个人(例如,通过推文的相似性来对用户进行比较)
第一种方法是:
建立一个模型,将两条推文编码成两个向量,连接向量,然后添加逻辑回归层;这将输出两条推文来自同一作者的概率。模型将接收一对对正负表示的推特数据。
另一种思路是:
由于这个问题是对称的,编码第一条推文的机制应该被完全重用来编码第二条推文(权重及其他全部)。这里我们使用一个共享的 LSTM 层来编码推文。
自然地,一个层实例可能被多次重复使用,它可以被调用任意多次,每次都重复使用一组相同的权重。
import keras
from keras.layers import Input,LSTM,Dense
from keras.models import Model
#将一条推特转换为一个尺寸为 (280, 256) 的矩阵
# 每条推特 280 字符
# 每个字符为 256 维的 one-hot 编码向量
# 取 256 个常用字符
tweet_a = Input((280,256))
tweet_b = Input((280,256))
# 这一层可以输入一个矩阵,并返回一个 64 维的向量
shared_lstm = LSTM(64)
# 当我们调用相同的图层实例多次,
# 图层的权重也会被重用 (它其实就是同一层)
encode_a = shared_lstm(tweet_a)
encode_b = shared_lstm(tweet_b)
# 然后再连接两个向量:
merged_vector = keras.layers.concatenate(
[encode_a,encode_b],
axis=-1)
# 再在上面添加一个逻辑回归层
predictions = Dense(1,
activation='sigmoid')(merged_vector)
# 定义一个连接推特输入和预测的可训练的模型
model = Model(inputs=[tweet_a, tweet_b], outputs=predictions)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit([data_a, data_b], labels, epochs=10)
将模型作为层
将模型作为一个层,其实在函数API中就如同层作为函数一样的道理。只是这里的层升级为Model了,我们输入一个tensor给一个model,同时它也返回一个tensor输出。
Sequential 类和 Model 类都是如此。这意味着你可以在一个输入张量上调用模型,并得到一个输出张量。y = model(x)
多输入输出的模型也是类似 y1, y2 = model([x1, x2])
在调用模型实例时,就是在重复使用模型的权重,正如在调用层实例时,就是在重复使用层的权重。调用一个实例,无论是层实例还是模型实例,都会重复使用这个实例已经学到的表示,这很直观。
这里的一个例子是:
使用双摄像头作为输入的视觉模型:两个平行的摄像头,相距几厘米(一英寸)。这样的模型可以感知深度,这在很多应用中都很有用。你不需要两个单独的模型从左右两个摄像头中分别提取视觉特征,然后再将二者合并。这样的底层处理可以在两个输入之间共享,即通过共享层(使用相同的权重,从而共享相同的表示)来实现。在 Keras 中实现连体视觉模型(共享卷积基)的代码如下所示。
from keras import layers
from keras import applications
from keras import Input
# 图像处理基础模型是
# Xception 网络(只包括卷积基)
xception_base = applications.Xception(weights=None,
include_top=False)
# 输入是 250×250 的 RGB 图像
left_input = Input(shape=(250, 250, 3))
right_input = Input(shape=(250, 250, 3))
# 对相同的视觉模型调用两次
left_features = xception_base(left_input)
right_input = xception_base(right_input)
#合并后的特征包含来自左右
# 两个视觉输入中的信息
merged_features = layers.concatenate(
[left_features, right_input], axis=-1)
分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!
以上是关于深度学习笔记36_函数式API之共享层(模型)的应用的主要内容,如果未能解决你的问题,请参考以下文章