Keras:不能为具有形状'(?,)'的Tensor提供形状值(64,1)

时间:2018-04-29 16:15:35

标签: python-3.x tensorflow keras

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

嘿,我不知道您是否还有这个问题。我只是混合使用tensorflowkeras而已。最后,规定最后一个lambda层的output_shape就解决了它。 对您来说,将是:Lambda(eucl_dist,,output_shape = (1,))([out_1, out_2]) (如果我是对的)