【问题标题】:InvalidArgumentError: Incompatible shapes: [10,2856,2856] vs. [10,2856]InvalidArgumentError:不兼容的形状:[10,2856,2856] 与 [10,2856]
【发布时间】:2020-04-06 03:17:36
【问题描述】:

这更像是一个概念上的误解,但是当我通过嵌入层时,我的 2-D x_train 变成了 3-D 矩阵。但是,如何使用仍然是二维的 y_train 将其拟合到我的模型中?我尝试将 flatten() 转换为二维矩阵,但没有成功。

这是我的代码:

def biDirectRNN (vocab_size, embedding_dim, batch_size, subcat, file):
    x_train, x_test, y_train, y_test = preprocess (subcat,file)
    x,y = y_train.shape
    model = tf.keras.Sequential()
    model.add(keras.layers.Embedding(input_dim = vocab_size, output_dim = embedding_dim, batch_input_shape=[batch_size, None]))
    forward_layer = keras.layers.LSTM(64, return_sequences = True)
    backward_layer = keras.layers.LSTM(32, activation='relu', return_sequences=True,
                       go_backwards=True)
    model.add(tf.keras.layers.Bidirectional(forward_layer, backward_layer = backward_layer))

    #model.add(keras.layers.Flatten())
    model.add(keras.layers.Dense(y, activation = tf.nn.softmax))
    model.compile(optimizer = 'adam',
          loss='mean_squared_error',
        metrics=['accuracy'])
    model.fit(x_train, y_train, batch_size=batch_size, epochs = 1)
    test_loss, test_acc = model.evaluate(x_test, y_test, epochs=10, batch_size=32)
    return test_loss, test_acc

函数调用:

biDirectRNN (2856, 100, 10, 'Crime', 'Crime14' )

我的错误是: InvalidArgumentError:不兼容的形状:[10,2856,2856] 与 [10,2856]

【问题讨论】:

    标签: python tensorflow keras nlp lstm


    【解决方案1】:

    您需要提供 input_shape 而不是 batch_input_shape,因为您已经在 model.fit() 中提到了批量大小。在 Dense 层之前添加 flatten。

    试试下面的代码。

    x,y = y_train.shape
    model = tf.keras.Sequential()
    model.add(keras.layers.Embedding(input_dim = 100, output_dim = 20, input_shape=(50,)))
    forward_layer = keras.layers.LSTM(64, return_sequences = True)
    backward_layer = keras.layers.LSTM(64, activation='relu', return_sequences=True,
                        go_backwards=True)
    model.add(tf.keras.layers.Bidirectional(forward_layer, backward_layer = backward_layer))
    
    model.add(keras.layers.Flatten())
    model.add(keras.layers.Dense(y, activation = tf.nn.softmax))
    model.compile(optimizer = 'adam',
          loss='mean_squared_error',
        metrics=['accuracy'])
    model.summary()
    model.fit(x_train, y_train, batch_size=12, epochs = 1)
    test_loss, test_acc = model.evaluate(x_test, y_test,  batch_size=32)
    

    输出:

    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    embedding (Embedding)        (None, 50, 20)            2000      
    _________________________________________________________________
    bidirectional (Bidirectional (None, 50, 128)           43520     
    _________________________________________________________________
    flatten (Flatten)            (None, 6400)              0         
    _________________________________________________________________
    dense (Dense)                (None, 2)                 12802     
    =================================================================
    Total params: 58,322
    Trainable params: 58,322
    Non-trainable params: 0
    _________________________________________________________________
    WARNING:tensorflow:From /tensorflow-1.15.2/python3.6/tensorflow_core/python/ops/math_grad.py:1424: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
    Instructions for updating:
    Use tf.where in 2.0, which has the same broadcast rule as np.where
    Train on 6851 samples
    6851/6851 [==============================] - 48s 7ms/sample - loss: 0.2080 - acc: 0.6754
    762/762 [==============================] - 0s 630us/sample - loss: 0.1944 - acc: 0.7139
    

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 2021-09-18
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      相关资源
      最近更新 更多