深度学习笔记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=(2502503))   
right_input = Input(shape=(2502503))

# 对相同的视觉模型调用两次
left_features = xception_base(left_input)   
right_input = xception_base(right_input) 

#合并后的特征包含来自左右
# 两个视觉输入中的信息
merged_features = layers.concatenate( 
    [left_features, right_input], axis=-1

分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!

瓦力人工智能 - 扫码上车


以上是关于深度学习笔记36_函数式API之共享层(模型)的应用的主要内容,如果未能解决你的问题,请参考以下文章

深度学习笔记33_函数式API及多输入模型的建立

深度学习笔记34_函数式API之多输出模型构建

如何使用Keras函数式API进行深度学习?

如何使用 Keras Function API 进行深度学习

Keras学习手册,开始使用 Keras 函数式 API

深度学习-Tensorflow Keras使用函数式API构建复杂模型