python - 使用 Keras 编程多输入神经网络架构

标签 python tensorflow machine-learning neural-network keras

我想编写一个神经网络程序,并且正在使用 Keras 库。一个数据集被分为随机数量的子集 (1-100)。未使用的子集设置为零。一个子集由 2*4+1 个二进制输入值组成。架构应如下所示(所有子集网络的权重应共享):

.   InA1(4) InB1(4)   _
.       \     /        \
.     FCNA  FCNB       |
.         \ /          |
.      Concatinate     |
.          |           \ 100x (InA2, InB2, InC2, InA3, ...)
.         FCN          /
.InC(1)    |           |
.     \   /            |
.      \ /            _/
.  Concatinate
.       |
.      FCN
.       |
.     Out(1)

我已经浏览了许多教程和示例,但没有找到实现该网络的正确方法。这是我到目前为止所尝试过的:

from keras import *

# define arrays for training set input
InA = []
InB = []
InC = []
for i in range(100):
    InA.append( Input(shape=4,), dtype='int32') )
    InB.append( Input(shape=4,), dtype='int32') )
    InC.append( Input(shape=1,), dtype='int32') )

NetA = Sequential()
NetA.add(Dense(4, input_shape(4,), activation="relu"))
NetA.add(Dense(3, activation="relu"))

NetB = Sequential()
NetB.add(Dense(4, input_shape(4,), activation="relu"))
NetB.add(Dense(3, activation="relu"))

NetMergeAB = Sequential()
NetMergeAB.add(Dense(1, input_shape=(3,2), activation="relu"))

# merging all subsample networks of InA, InB
MergeList = []
for i in range(100):
    NetConcat = Concatenate()( [NetA(InA[i]), NetB(InB[i])] )
    MergedNode = NetMergeAB(NetConcat)
    MergeList.append(MergedNode)
    MergeList.append(InC[i])

# merging also InC
FullConcat = Concatenate()(MergeList)

# put in fully connected net
ConcatNet = Sequential()
ConcatNet.add(Dense(10, input_shape(2, 100), activation="relu"))
ConcatNet.add(Dense(6, activation="relu"))
ConcatNet.add(Dense(4, activation="relu"))
ConcatNet.add(Dense(1, activation="relu"))

Output = ConcatNet(FullConcat)

问题是,要么我收到“无张量”错误,要么它根本不起作用。有人知道如何正确解决这个问题吗?

最佳答案

您可以使用 functional API 轻松实现该网络架构并且根本不使用Sequential:

InA, InB, InC = [Input(shape=(4,), dtype='int32') for _ in range(3)]

netA = Dense(4, activation="relu")(InA)
netA = Dense(3, activation="relu")(netA)

netB = Dense(4, activation="relu")(InB)
netB = Dense(3, activation="relu")(netB)

netMergeAB = concatenate([netA, netB])
netMergeAB = Dense(1, activation="relu")(netMergeAB)

fullConcat = concatenate([netMergeAB, InC])

out = Dense(10, activation="relu")(fullConcat)
out = Dense(6, activation="relu")(out)
out = Dense(4, activation="relu")(out)
out = Dense(1, activation="relu")(out)

model = Model([InA, InB, InC], out)

您可能需要稍微调整一下,但总体思路应该很清晰。

关于python - 使用 Keras 编程多输入神经网络架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50876172/

相关文章:

machine-learning - Keras 模型为 make_moons 数据创建线性分类

python - Keras 中的 LSTM : Number of parameters differs between sequential and functional API

python - 如何在启动 Google App Engine Launcher 时禁用自动检查更新?

python - PyQt5 中的 QTableView clicked.connect() 键盘滚动等效

python - 打印排序列表

python 多线程用于继续循环直到用户输入。帮助理解所要求的示例

python - 如何在Tensorflow中实现预训练?如何部分使用检查点文件中保存的权重?

python - tensorflow 中的批量标准化: variables and performance

TensorFlow 2 和 Keras :

python3 ValueError : shapes (4, 1) 和 (4,3) 未对齐 : 1 (dim 1) ! = 4 (dim 0)