• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

Keras从零学习-函数式多输入与多输出-0x05

Keras admin 1周前 (08-11) 44次浏览 0个评论 扫描二维码

在工程实践中单输入的场景还是比较少的,这种单输入的理解仅是单个 Input,并不是特征为 1 哈。

关于多输入这块还是有点歧义,比如我们有多种类型的特征,那么每一种特征处理的方式不一样,在工程实现也是使用多个 Input 来实现,可以参考我之前写的这篇文章keras 多输入

官网给了一个例子,tweet 预测赞数的一个例子,在给出的模型中是定义了两个单独的输入。

从上图也可以这么去理解,main_input 在经过 embedding 和 lstm 只是经过特征的编码然后与 aux_input 构成一个 Input,那么此时就与我之前提到的不同特征的构成多输入是相同的。

举个例子:

现在的 category 特征都是要经过 embedding 处理,但是 numerical 特征一般进行拼接即可,当然也存在离散化处理,这个在此不多探讨仅作为对比说明。

这样一对比好像可以与官网给出的例子解释到一点上。下面看下这个例子:

from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model

# 标题输入:接收一个含有 100 个整数的序列,每个整数在 1 到 10000 之间。
# 注意我们可以通过传递一个 "name" 参数来命名任何层。
main_input = Input(shape=(100,), dtype='int32', name='main_input')

# Embedding 层将输入序列编码为一个稠密向量的序列,
# 每个向量维度为 512。
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)

# LSTM 层把向量序列转换成单个向量,
# 它包含整个序列的上下文信息
lstm_out = LSTM(32)(x)
auxiliary_input = Input(shape=(5,), name='aux_input')
x = keras.layers.concatenate([lstm_out, auxiliary_input])

# 堆叠多个全连接网络层
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)

# 最后添加主要的逻辑回归层
main_output = Dense(1, activation='sigmoid', name='main_output')(x)

两个 Input 的输入一定要 concat 之后再输入到定义的网络中去,实际上就是特征的拼接而已。

多输入与多输出的场景中 loss 优化是一起去优化的即优化总的 loss,上面这个模型有两个输出,所以我们看看这个 loss 的优化

model.compile(optimizer='rmsprop', loss='binary_crossentropy',
              loss_weights=[1., 0.2])

可以看到参数 loss_weights 的定义,这个 compile 函数在之前 的文章模型定义有过说明,在这里就使用到了。

综上所述多输入这种情况是在实际工程中经常遇到的情况,熟能生巧。

 


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Keras 从零学习-函数式多输入与多输出-0x05
喜欢 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!