Я получаю ValueError с ndim при запуске model.predict (X) - PullRequest
0 голосов
/ 10 апреля 2020

Я использую этот код для обучения моей модели своим данным

tf.keras.backend.clear_session()
tf.random.set_seed(50)
np.random.seed(50)
train_set = windowed_dataset(x_train, window_size=30, batch_size=15, shuffle_buffer=shuffle_buffer_size)
model = tf.keras.models.Sequential([
  tf.keras.layers.Conv1D(filters=100, kernel_size=5,
                      strides=1, padding="causal",
                      activation="relu",
                      input_shape=[None, 1]),
  tf.keras.layers.LSTM(100, return_sequences=True),
  tf.keras.layers.LSTM(100, return_sequences=True),
  #tf.keras.layers.Dense(30, activation="relu"),
  #tf.keras.layers.Dense(30, activation="relu"),
  tf.keras.layers.Dense(1),
  tf.keras.layers.Lambda(lambda x: x * 400)
])


optimizer = tf.keras.optimizers.Adam(
    learning_rate=0.00001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, amsgrad=True,
    name='Adam'
)
model.compile(loss=tf.keras.losses.Huber(),
              optimizer=optimizer,
              metrics=["mae"])
history = model.fit(train_set,epochs=100)

вот модель.summary ()

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d (Conv1D)              (None, 30, 100)           600       
_________________________________________________________________
lstm (LSTM)                  (None, 30, 100)           80400     
_________________________________________________________________
lstm_1 (LSTM)                (None, 30, 100)           80400     
_________________________________________________________________
dense (Dense)                (None, 30, 1)             101       
_________________________________________________________________
lambda (Lambda)              (None, 30, 1)             0         
=================================================================
Total params: 161,501
Trainable params: 161,501
Non-trainable params: 0
_________________________________________________________________
None

Я пытаюсь запустить этот код

model.predict(
    x_valid, batch_size=None, verbose=0, steps=None, callbacks=None, max_queue_size=10,
    workers=1, use_multiprocessing=False
)

и выдает это сообщение об ошибке:

ValueError: Вход 0 последовательного слоя несовместим со слоем: ожидаемый ndim = 3, найденный ndim = 2. Получена полная форма: [Нет, 1]

Я попытался изменить форму x_valid с помощью этой функции np.array(x_valid).reshape(300,1), но это не сработало.

Я решил проблему, расширив трижды

    test_input = x_valid[425]
    test_input = np.expand_dims(test_input,axis=0)
    test_input = np.expand_dims(test_input,axis=0)
    test_input = np.expand_dims(test_input,axis=0)

    print(model.predict(test_input))
    # OUTPUT [[[71.46894]]]

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Проблема возникает из-за неправильной размерности тестовых данных. X_input имеет форму (15,30,1), поэтому из этого следует, что данные теста также должны иметь 3-мерную форму (например, [1,1,1]). В вашем коде данные теста представляют собой массив с 1 димом, поэтому вы должны расширить dims ДВАЖДЫ, чтобы получить массив с 3 димами, используя 'test_input = np.expand_dims (test_input, axis = 0)'

1 голос
/ 10 апреля 2020

Ваша проблема связана с тем, что вам нужно добавить batch_dimension для прогнозирования по одной точке данных.

Это необходимо при работе с TensorFlow и Keras, даже если вы прогнозируете по одной выборке, вы необходимо добавить batch_size 1. 1. 1003 *

Что вам нужно сделать:

  1. Получить один элемент из вашего тестового набора (скажем, test_input = x_valid[0])
  2. Построить batch_size = 1, т.е. test_input = np.expand_dims(test_input,axis=0)
  3. Теперь прогнозируем с помощью модели, т.е. prediction = model.predict(test_input)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...