使用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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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