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

3,488次阅读
没有评论

共计 1321 个字符,预计需要花费 4 分钟才能阅读完成。

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

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

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

Keras从零学习-函数式多输入与多输出-0x05从上图也可以这么去理解,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函数在之前 的文章模型定义有过说明,在这里就使用到了。

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

 

正文完
请博主喝杯咖啡吧!
post-qrcode
 
admin
版权声明:本站原创文章,由 admin 2019-08-11发表,共计1321字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码