我想编程一个神经网络,并使用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]]))
因为你重用了层,所以权重将被共享。