有没有办法在 keras 中合并具有不同 sample/batch 大小的层以及关于合并层的问题

Is there a way to merge layers in keras with different sample/batch sizes and a question about merged layers

我一直在寻找我的具体问题的答案,但没有遇到任何问题,所以在这里发帖。任何帮助将不胜感激!

我有两个关于在 keras 中合并图层的问题。我建立了一个模型,在输出之前连接两个模型之间的层。由于我的数据的性质,双方的输入(样本大小)将不同,但是合并层将是有益的,因为两个数据源都属于数据中的相同 classes,因此它当两个模型在输出前共享数据时,很高兴看到 classification 是如何发生的。

我想知道是否有一种方法可以从两侧使用不同的样本大小,因为如果数据大小不同,我在拟合模型时会出现数组长度错误。

我解决这个问题的方法是通过简单地复制数据直到达到正确的尺寸,使模型的左分支(其输入样本大小小于右侧数据)与右侧的长度相同,即

向左训练:140 个样本,向右训练 180 个样本...对于向左训练,我将行 1:40 添加到数据底部,使其成为 180 个样本。

这是解决这个问题的充分方法吗?

我的模型代码如下:

left_branch_input = Input(shape=(5078,), name='Left_input')
left_branch_output = Dense(64, activation='relu', name="middle_layer")(left_branch_input)
left_branch_output_2=Dense(32, activation="relu", name="second_layer")(left_branch_output)
left_branch_output_3=Dense(100, activation="relu", name="penultimate_layer")(left_branch_output_2)

right_branch_input = Input(shape=(5078,), name='right_input')
right_branch_output = Dense(64, activation='relu', name="middle_layerR")(right_branch_input)
right_branch_output_2=Dense(32, activation="relu", name="second_layerR")(right_branch_output)
right_branch_output_3=Dense(100, activation="relu", name="penultimate_layerR")(right_branch_output_2)

concat = concatenate([left_branch_output_3, right_branch_output_3], name='Concatenate')

final_model_output = Dense(24, activation='sigmoid')(concat)
final_model = Model(inputs=[left_branch_input, right_branch_input], outputs=final_model_output,
                    name='Final_output' )


final_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=["accuracy"])


sum_vector = np.array(y_train.astype(bool) + y_trainSC.astype(bool), dtype=int)

historyMerged=final_model.fit([X_train, X_trainSC], sum_vector,
          epochs=200,
          verbose=1,
          validation_split=0.15,
          callbacks=[EarlyStopping(monitor='val_loss', patience=5)], shuffle=True)

模型编译和拟合并且性能良好,但是作为完整性检查我只想问一下附加样本的方法(通过复制[需要长度]是否可以?有没有办法忽略来自不同分支的样本量?

由于这是一个binary_crossentropy多标签问题,样本在两个数据集中的顺序并不完全重叠。例如,对于左分支,行是 organ 1 age 1,对于右分支,第一个样本是 organ 2 age 2。这有关系吗?或者模型是否根据单热编码数据由 class 工作,因为这才是真正重要的? class 它的存在与顺序相反...... model.predict 函数实际上为两个数据集获取了正确的数据,所以大概,对于左右分支中相同的数据,合并层使用来自两个分支的权重来寻找改进 classification:

的相似点和特征

最后,我对合并层的模型摘要有疑问。

如有任何帮助和建议,我们将不胜感激!我对目前的表现很满意,但我想绝对确定顺序和重复数据是解决这个问题的有效方法。

谢谢!

看来你的问题是如何拼接不同形状的张量。这是您可以在 Colab 中 运行 的一个简单示例:

import tensorflow as tf
keras = tf.keras

from keras.models import Model
from keras.layers import *

in_a = Input(shape=(10,))
in_b = Input(shape=(20,))
join = Concatenate(axis=1)([in_a, in_b])
h1 = Dense(10)(join)
out = Dense(1, activation='sigmoid')(h1)
model = Model([in_a, in_b], out)
model.compile('adam', 'mse')
model.summary()

关键是连接的 "axis" 参数。

我不确定我是否理解你的第二个问题。左右分支中的特征根本不需要关联。这些可能完全不同。