我正在尝试使用Keras(tf作为后端)创建一个暹罗网络,以查找重复的问题。但我面临输出层中形状不匹配的问题,输出形状显示为(64,1),即使输出是形状(64,)。
这就是我的模型的样子:
inp_layer_1 = Input((maxlen,))
embed_1 = Embedding(n_feat_1+1, embed_size, input_length=maxlen)(inp_layer_1)
bi_layer_1 = Bidirectional(LSTM(128, return_sequences=True, dropout=0.2, recurrent_dropout=0.2))(embed_1)
avg_pool_1 = GlobalAveragePooling1D()(bi_layer_1)
drop_1 = Dropout(0.2)(avg_pool_1)
dense_1 = Dense(256, activation='relu')(drop_1)
out_1 = Lambda(lambda x: K.l2_normalize(x, axis=1))(dense_1)
inp_layer_2 = Input((maxlen,))
embed_2 = Embedding(n_feat_2+1, embed_size, input_length=maxlen)(inp_layer_2)
bi_layer_2 = Bidirectional(LSTM(128, return_sequences=True, dropout=0.2, recurrent_dropout=0.2))(embed_2)
avg_pool_2 = GlobalAveragePooling1D()(bi_layer_2)
drop_2 = Dropout(0.2)(avg_pool_2)
dense_2 = Dense(256, activation='relu')(drop_2)
out_2 = Lambda(lambda x: K.l2_normalize(x, axis=1))(dense_2)
lambda_merge = Lambda(eucl_dist)([out_1, out_2])
final_model = Model(inputs=[inp_layer_1, inp_layer_2], outputs=lambda_merge)
所以,基本上我试图找到两个模型的输出之间的欧氏距离,代表两个问题。此外, maxlen = 100 , n_feat_1 和 n_feat_2 分别是所有问题1和问题2的功能(代币)数量。
以下是我创建批量样本的方法:
def _get_train_batch(batch_size=64):
X = []
idx = np.random.choice(404290, batch_size)
X.append(ques1_train[idx])
X.append(ques2_train[idx])
X = np.asarray(X)
y = train_df.iloc[idx, 5].values
return [X[0, :, :], X[1, :, :]], y
在上面的代码中, ques1_train 是一个形状数组(404290,maxlen = 100),由来自训练集的question1的vocab的标记序列组成。类似于 ques2_train 的情况。 train_df 是形状(404290,6)的训练数据帧,我从中取出结果(1或0),表示两个问题是否相同(1)或不是(0)。
这是我的培训代码:
loss = []
for ep in range(1):
for it in range(404290 // 64):
X, y = _get_train_batch()
print (y.shape)
loss.append(final_model.train_on_batch(X, y))
这是我得到的错误(图片): valuerror
你可以看到在第一行打印的形状是我输出的形状,即(64,)。有趣的是,我创建了一个用于图像分类的暹罗网络,使用几乎相似的代码,并且它有效。
我会感激一些见解。
由于 Ankit Paliwal
答案 0 :(得分:0)
嘿,我不知道您是否还有这个问题。我只是混合使用tensorflow
和keras
而已。最后,规定最后一个lambda层的output_shape
就解决了它。
对您来说,将是:Lambda(eucl_dist,,output_shape = (1,))([out_1, out_2])
(如果我是对的)