我一直在寻找具体问题的答案,但没有发现任何问题,因此请在此处发布。任何帮助将不胜感激!
关于合并喀拉拉邦中的图层,我有两个问题。我建立了一个在输出之前将两个模型之间的层连接起来的模型。由于我的数据的性质,双方的输入(样本大小)将有所不同,但是合并层将是有益的,因为两个数据源都属于数据中的同一类,因此很高兴看到当两个模型在输出之前共享数据时,如何进行分类。
我想知道是否有一种方法可以从两侧使用不同的样本大小,因为如果数据大小不同,在拟合模型时会出现数组长度错误。
我解决这个问题的方法是通过简单地复制数据直到达到正确的尺寸,使模型的左分支(其输入样本大小小于右侧数据)与右侧的长度相同。 ,
左列: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多标签问题,因此样本内部数据集的顺序不会完全重叠。例如,行是左分支的器官1年龄1,而右分支的第一个样本是器官2年龄2。这有关系吗?还是该模型根据单点编码数据按类工作,因为这实际上应该正确吗?它存在的类与顺序相反... model.predict函数实际上获取两个数据集的数据正确,因此,大概对于左右分支中相同的数据,合并层使用权重从两个分支中查找相似性和功能以改善分类:
最后,我对合并图层的模型摘要有疑问。
对此将提供任何帮助和建议!到目前为止,我对性能感到满意,但我想绝对确定订单和重复数据是解决此问题的有效方法。
谢谢!
答案 0 :(得分:0)
似乎您的问题是如何连接具有不同形状的张量。这是一个可以在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()
关键是要连接的“轴”参数。
我不确定我是否理解你的第二个问题。左右分支中的特征根本不需要关联。这些可能完全不同。