InvalidArgumentError: Несовместимые фигуры: [10,2856,2856] и [10,2856] - PullRequest
0 голосов
/ 06 апреля 2020

Это скорее концептуальное недоразумение, но когда я go через слой внедрения, мой 2-D x_train превращается в 3-D матрицу. Тем не менее, как я могу приспособить его к моей модели с y_train, который все еще 2-D? Я попытался выполнить 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]

1 Ответ

0 голосов
/ 19 апреля 2020

Вам нужно указать input_shape вместо batch_input_shape , так как вы уже упоминали размер пакета в model.fit (). Добавьте выравнивание перед плотным слоем.

Попробуйте следующий код.

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
...