使用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 *# 定义训练集输入数组inputInA = []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"))# 合并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])# 同时合并InCFullConcat = Concatenate()(MergeList)# 放入全连接网络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)

问题是,要么我得到一个“无张量”错误,要么根本不起作用。有人有解决这个问题的想法吗?


回答:

使用问题作者回答中的代码:

ActInA = Input(shape=(4,), dtype='int32')ActInB = Input(shape=(4,), dtype='int32')ActInC = Input(shape=(1,), dtype='int32')NetA = Dense(4, activation="relu")(ActInA)NetA = Dense(3, activation="relu")(NetA)NetB = Dense(4, activation="relu")(ActInB)NetB = Dense(3, activation="relu")(NetB)NetAB = concatenate([NetA, NetB])NetAB = Dense(1, activation="relu")(NetAB)

现在我们为这个网络子集构建一个模型:

mymodel = Model([ActInA, ActInB], NetAB)

现在从keras文档中重要的一部分是:

所有模型都是可调用的,就像层一样

这意味着你可以简单地做如下操作:

for i in range(100):   NetMergeABC.append(mymodel([ActInA_array[i], ActInB_array[i]]))

因为你重用了层,所以权重将被共享。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注