Keras 是否有一种方法可以合并具有不同样本/批次大小的KERA中的层,以及关于合并层的问题

Keras 是否有一种方法可以合并具有不同样本/批次大小的KERA中的层,以及关于合并层的问题,keras,keras-layer,Keras,Keras Layer,我一直在寻找我的具体问题的答案,但没有在这里看到任何这样的帖子。任何帮助都将不胜感激 关于在keras中合并层,我有两个问题。我构建了一个模型,在输出之前将两个模型之间的层连接起来。由于我的数据的性质,来自双方的输入(样本大小)将不同,但是合并层将是有益的,因为两个数据源都属于数据中的同一类,因此很高兴看到当两个模型在输出之前共享数据时,分类是如何进行的 我想知道是否有一种方法可以从两侧使用不同的样本大小,因为如果数据大小不同,在拟合模型时会出现数组长度错误 我解决这个问题的方法是,通过简单地复

我一直在寻找我的具体问题的答案,但没有在这里看到任何这样的帖子。任何帮助都将不胜感激

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

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

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

左列:140个样品,右列180个样品。。。对于train left,我将行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)
模型可以编译和拟合,性能也不错,但是作为一个健全性检查,我想问一下添加样本(通过重复[length required]的方法是否可行?是否有办法忽略来自不同分支的样本大小

由于这是一个二元交叉熵多标签问题,两个数据集中样本的顺序不会完全重叠。例如,对于左分支,行是Organ1 age 1,对于右分支,第一个样本是Organ2 age 2。这有关系吗?或者类是否根据一个热编码数据运行模型,因为这是是否真的很重要?它所在的类与顺序相反…model.predict函数实际上为两个数据集获取了正确的数据,因此,对于左分支和右分支中相同的数据,合并层可能使用两个分支的权重来查找相似性和特征,以改进分类:

最后,我有一个关于合并层的模型摘要的问题

在此方面的任何帮助和建议都将不胜感激!我对迄今为止的性能感到满意,但希望绝对确保订单以及重复数据是解决此问题的有效方法


谢谢!

您的问题似乎是如何连接具有不同形状的张量。这是一个可以在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()
关键点是要连接的“轴”参数


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

非常感谢你的快速响应!实际上我更希望有一个连接层,就像在我的第一篇文章中一样。我对它的形成感到满意。但是当我适合模型中,我必须使两个训练数据集的长度相同,否则会引发错误:因此,我通过复制末尾的行,使最短的训练数据相同,直到它们的长度相同。左侧的训练集和右侧的训练集(在拟合模型时)是真的吗不需要匹配?因此trainleft分支的第一行不必与右侧相同?您可以在一个模型中有多个输入。它们的批量大小形状(尺寸0)必须匹配。其他维度可以不同。只要批量大小相同,您甚至可以混合多个不同维度。例如,具有形状序列(批量大小、序列长度、n特征)和第二个形状输入(批量大小、m特征)的情况并不少见例如,左分支训练中的第1行不必是狗的文字描述,右分支训练数据的第1行也不必是狗的右图像?只要一个热编码正确,因为它是二进制交叉熵,来自两个分支的训练数据的顺序不必匹配?这是正确的JU吗t澄清?非常感谢!!是的,谢谢你,这很有意义!!因此,如果两者不匹配,可以复制数据来解决此问题吗?然后,如上所述,只要一个热编码是正确的,行就不匹配吗?多个输入必须是大约相同的示例。即,左输入的第N行和右输入的第N行正确的输入必须是关于同一个对象的。信息可以是你收集的任何数据,只要它可以表示为张量。