【问题标题】:ValueError: Input 0 of layer lstm_28 is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, 50, 21, 8]ValueError: 层 lstm_28 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:[None, 50, 21, 8]
【发布时间】:2021-03-22 05:57:21
【问题描述】:

输入尺寸

train_ohe :(95036, 50, 21)
y_train :(95036,)
val_ohe :(9911, 50, 21)
y_val :(9911,)

型号

x_input = Input(shape=(50,))
emb = Embedding(21, 8, input_length=50)(x_input)
bi_rnn = LSTM(50, input_shape=(50,20,50), return_sequences=False)(emb)
x = Dropout(0.3)(bi_rnn)
x_output = Dense(1, activation='relu')(x)
model1 = Model(inputs=x_input, outputs=x_output)
model1.compile(optimizer='adam', loss='mse', metrics=['mse'])

history1 = model1.fit(
    train_ohe, y_train,
    epochs=1, batch_size=256,validation_data=(val_ohe, y_val),callbacks=[es]
    )

注意

Vocab size=20, input_length=50 

我尝试将 return_sequences 更改为 True/False,还尝试了 (50, 20)/(50,20,50)LSTM 层的尺寸,但仍然出现相同的错误。

【问题讨论】:

    标签: tensorflow keras lstm recurrent-neural-network one-hot-encoding


    【解决方案1】:

    看起来您正在向嵌入层提供单热向量。您应该提供整数序列。形状应为 (95036, 50)。

    如果您真的需要输入 one-hot 向量 - 您必须将 one-hot 转换为整数才能将它们输入嵌入层。试试这样的:

    x_input = Input(shape=(50, 21))
    x = tf.argmax(x_input, axis=-1)
    emb = Embedding(21, 8, input_length=50)(x)
    

    【讨论】:

    • 我的输入是蛋白质序列,我想按顺序捕获字符的位置/顺序。我认为输入整数编码序列可能无济于事,因为它会有值(模型可以赋予值权重)例如:整数编码序列 - [ 2, 7, 11, 4, 4, 2, 10, 6, 6, 3, 2、6、4、6、4、5、5]。
    • 你为什么这么认为?喂食 [1, 0, 1] 和 [[0, 1], [1, 0], [0, 1]] 有什么区别?为什么你认为第一次丢失订单,第二次保存?
    • 这与顺序无关,也与序列中的值的权重有关,因为整数编码序列具有值,而 one-hot 表示具有 0 和 1,所以我想喂一个-热向量。
    • @veenapulicherla 仍然不明白,但我更新了答案,以便您可以提供一个热向量
    • 你说得对,我没看清楚,我现在去掉了embedding layer,给LSTM喂了一个hot vector。谢谢,你的回答有帮助。
    猜你喜欢
    • 2021-04-09
    • 2020-08-01
    • 2020-11-15
    • 2020-03-20
    • 1970-01-01
    • 2020-09-01
    • 2021-01-14
    • 2020-08-13
    • 2020-08-11
    相关资源
    最近更新 更多