keras - 是否可以根据 Keras 中的输入实现层之间的切换?
问题描述
可以在 Keras 中实现具有这样结构的神经网络吗?
思路如下:
在输入中,模型接收一个整数i(标记为红色)和其他一些东西v(在图片中是 0.12345)。接下来,有几个类似的并行层。根据i的值,v进入第i层,忽略其他层,然后该层的输出进入输出层。
换句话说,除了i之外的所有层都被忽略了。
解决方案
如果我正确理解了您的问题,我认为这里最简单的解决方案是根据您的i
.
因此,将您的X_train
并将其拆分为X_train_1
,X_train_2
等。同样将您的X_test
, 拆分为X_test_1
,X_test_2
等。
from keras.models import Sequential, Model
from keras.layers import *
from keras.utils import plot_model
然后设置单独的模型:
model1 = Sequential()
model1.add(Conv2D(32, kernel_size=(3,3), activation="relu", input_shape=(24,24,3)))
model1.add(MaxPooling2D(pool_size=(2,2)))
model1.add(Flatten())
model1.add(Dropout(0.5))
model1.add(Dense(512, activation = "relu"))
model2 = Sequential()
model2.add(Conv2D(32, kernel_size=(3,3), activation="relu", input_shape=(24,24,3)))
model2.add(MaxPooling2D(pool_size=(2,2)))
model2.add(Flatten())
model2.add(Dropout(0.5))
model2.add(Dense(512, activation = "relu"))
您将需要使用功能 API 来组合它们。我已经使用过Concatenate()
,其他选项显示在此处的文档中。
outputs = Concatenate()([model1.output,model2.output])
outputs = Dense(256, activation='relu')(outputs)
outputs = Dropout(.5)(outputs)
outputs = Dense(5, activation='softmax')(outputs)
现在配置您的最终模型,指定输入和输出:
model = Model(inputs=[model1.inputs, model2.inputs], outputs=outputs)
检查model.summary()
,你可以看到每一层是如何连接的:
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
conv2d_input (InputLayer) [(None, 24, 24, 3)] 0
__________________________________________________________________________________________________
conv2d_1_input (InputLayer) [(None, 24, 24, 3)] 0
__________________________________________________________________________________________________
conv2d (Conv2D) (None, 22, 22, 32) 896 conv2d_input[0][0]
__________________________________________________________________________________________________
conv2d_1 (Conv2D) (None, 22, 22, 32) 896 conv2d_1_input[0][0]
__________________________________________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 11, 11, 32) 0 conv2d[0][0]
__________________________________________________________________________________________________
max_pooling2d_1 (MaxPooling2D) (None, 11, 11, 32) 0 conv2d_1[0][0]
__________________________________________________________________________________________________
flatten (Flatten) (None, 3872) 0 max_pooling2d[0][0]
__________________________________________________________________________________________________
flatten_1 (Flatten) (None, 3872) 0 max_pooling2d_1[0][0]
__________________________________________________________________________________________________
dropout (Dropout) (None, 3872) 0 flatten[0][0]
__________________________________________________________________________________________________
dropout_1 (Dropout) (None, 3872) 0 flatten_1[0][0]
__________________________________________________________________________________________________
dense (Dense) (None, 512) 1982976 dropout[0][0]
__________________________________________________________________________________________________
dense_1 (Dense) (None, 512) 1982976 dropout_1[0][0]
__________________________________________________________________________________________________
concatenate (Concatenate) (None, 1024) 0 dense[0][0]
dense_1[0][0]
__________________________________________________________________________________________________
dense_2 (Dense) (None, 256) 262400 concatenate[0][0]
__________________________________________________________________________________________________
dropout_2 (Dropout) (None, 256) 0 dense_2[0][0]
__________________________________________________________________________________________________
dense_3 (Dense) (None, 5) 1285 dropout_2[0][0]
==================================================================================================
Total params: 4,231,429
Trainable params: 4,231,429
Non-trainable params: 0
__________________________________________________________________________________________________
但是使用以下方法更容易可视化模型plot_model(model, to_file='image.png', show_shapes=True)
:
然后为了训练模型,你需要输入不同的输入,不要忘记你的测试(或验证)数据:
model.fit([X_train_1, X_train_2], y_train, validation_data = ([X_test_1, X_test_2], y_val), ...)
注意:子模型(此处model1
为 、model2
等)不必具有相同的结构。它们可以有不同大小的层、不同数量的层和不同类型的层。这也是您可以在模型中包含具有不同类型特征的数据集的方式。
推荐阅读
- algorithm - 如何在保持顺序的同时用较小的值替换条目?
- azure-devops - Azure DevOps:通过连接其他变量的值作为任务输入来获取变量值
- javascript - 如何在没有 jQuery 的情况下使用 JavaScript 使背景图像褪色?
- python - 如何将每个数组存储在一行中
- python - 什么时候可以在 Python 中使用空格来提高可读性?
- intellij-idea - 量角器找不到环境/环境
- excel - 如何在没有 VBA 的情况下使用函数将 Excel 时间解析为不同的格式?
- java - 为候选人挑选弹簧多个级别
- aws-lambda - AWS Pinpoint 自定义通道:无法正确调用挂钩中指定的 Lambda 函数
- amazon-ec2 - 如何将我的 ec2 实例共享给我组织内的其他账户?