Как исправить 'ValueError: вход 0 несовместим со слоем simple_rnn_1: ожидаемая форма = (нет, нет, 20), найденная форма = (нет, нет, 2, 20)' - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть несколько матриц, которые проходят через несколько слоев, последний - плотный слой, чтобы создать вектор для каждой матрицы.Теперь я хочу передать эти матрицы в RNN из keras, и именно здесь я сталкиваюсь с этой ошибкой.

Я попытался сложить векторы вместе, чтобы передать их в RNN.Вот фрагмент кода для этой идеи:

input1 = Dense(20, activation = "relu")(input1)
input2 = Dense(20, activation = "relu")(input2)
out = Lambda(lambda x: tf.stack([x[0], x[1]], axis=1), output_shape=(None, 2, 20))([input1, input2])
out = SimpleRNN(50, activation="relu")(out)

И я получаю:

>Traceback (most recent call last):
  >>File "model.py", line 106, in <module>
    model = make_model()

  >>File "model.py", line 60, in make_model
    out = SimpleRNN(50, activation="relu")(out) 

  >>File "/home/yamini/.local/lib/python3.6/site-packages/keras/layers/recurrent.py", line 532, in __call__
    return super(RNN, self).__call__(inputs, **kwargs)

  >>File "/home/yamini/.local/lib/python3.6/site-packages/keras/engine/base_layer.py", line 440, in __call__
    self.assert_input_compatibility(inputs)

  >>File "/home/yamini/.local/lib/python3.6/site-packages/keras/engine/base_layer.py", line 368, in assert_input_compatibility
    str(x_shape))

>>ValueError: Input 0 is incompatible with layer simple_rnn_1: expected shape=(None, None, 20), found shape=(None, None, 2, 20)

И если я изменяю output_shape=(None, None, 20) в лямбда-слое, я получаю:

Traceback (most recent call last):
 >> File "model.py", line 107, in <module>
    model.fit([input1, input2], y_train, epochs = 15, batch_size = 20, verbose = 2)

  >>File "/home/yamini/.local/lib/python3.6/site-packages/keras/engine/training.py", line 952, in fit
    batch_size=batch_size)

  >>File "/home/yamini/.local/lib/python3.6/site-packages/keras/engine/training.py", line 789, in _standardize_user_data
    exception_prefix='target')

  >>File "/home/yamini/.local/lib/python3.6/site-packages/keras/engine/training_utils.py", line 138, in standardize_input_data
    str(data_shape))

>>ValueError: Error when checking target: expected simple_rnn_1 to have shape (50,) but got array with shape (1,)

1 Ответ

0 голосов
/ 27 декабря 2018

Вы можете изменить output_shape, который не должен содержать batch_size.

from keras.layers import Dense,Lambda,SimpleRNN,Input
import tensorflow as tf

input1 = Input(shape=(20,))
input2 = Input(shape=(20,))
input1 = Dense(20, activation = "relu")(input1)
input2 = Dense(20, activation = "relu")(input2)
out = Lambda(lambda x: tf.stack([x[0], x[1]], axis=1), output_shape=(2, 20))([input1, input2])
out = SimpleRNN(50, activation="relu")(out)
...