ValueError: вход 0 несовместим со слоем conv2d_1: ожидаемый ndim=4, найденный ndim=5
Я пытаюсь передать изображение RGB с симулятора в мою пользовательскую нейронную сеть. У источника генерации RGB (симулятора) размер изображения RGB равен (3,144,256)
,
Вот как я строю нейронную сеть:
rgb_model = Sequential()
rgb = env.shape() // this is (3, 144, 256)
rgb_shape = (1,) + rgb
rgb_model.add(Conv2D(96, (11, 11), strides=(3, 3), padding='valid', activation='relu', input_shape=rgb_shape, data_format = "channels_first"))
Now, my rbg_shape is (1, 3, 144, 256).
Это ошибка, которую я получаю:
rgb_model.add(Conv2D(96, (11, 11), strides=(3, 3), padding='valid', activation='relu', input_shape=rgb_kshape, data_format = "channels_first"))
File "/usr/local/lib/python2.7/dist-packages/keras/engine/sequential.py", line 166, in add
layer(x)
File "/usr/local/lib/python2.7/dist-packages/keras/engine/base_layer.py", line 414, in call
self.assert_input_compatibility(inputs)
File "/usr/local/lib/python2.7/dist-packages/keras/engine/base_layer.py", line 311, in assert_input_compatibility
str(K.ndim(x)))
ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=5
Почему keras жалуется, что ожидаемое измерение равно 5, а мое фактическое измерение равно 4?
PS: у меня тот же вопрос, что и этот вопрос. В идеале я хотел прокомментировать этот пост, но мне не хватает репутации.
Редактировать:
Вот код, который имеет дело с ошибкой:
rgb_shape = env.rgb.shape
rgb_model = Sequential()
rgb_model.add(Conv2D(96, (11, 11), strides=(3, 3), padding='valid', activation='relu', input_shape=rgb_shape, data_format = "channels_first"))
rgb_model.add(Conv2D(128, (3, 3), strides=(2, 2), padding='valid', activation='relu', data_format = "channels_first" ))
rgb_model.add(Conv2D(384, (3, 3), strides=(1, 1), padding='valid', activation='relu', data_format = "channels_first"))
rgb_model.add(Conv2D(384, (3, 3), strides=(1,1), padding='valid', activation='relu', data_format = "channels_first"))
rgb_model.add(Conv2D(256, (3,3), strides=(1,1), padding='valid', activation='relu', data_format = "channels_first"))
rgb_model.add(Flatten())
rgb_input = Input(shape=rgb_shape)
rgb = rgb_model(rgb_input)
Это новая ошибка, когда я прохожу env.rgb.shape
как input_shape
в Conv2D
:
dqn.fit(env, callbacks=callbacks, nb_steps=250000, visualize=False, verbose=0, log_interval=100)
File "/usr/local/lib/python2.7/dist-packages/rl/core.py", line 169, in fit
action = self.forward(observation)
File "/usr/local/lib/python2.7/dist-packages/rl/agents/dqn.py", line 228, in forward
q_values = self.compute_q_values(state)
File "/usr/local/lib/python2.7/dist-packages/rl/agents/dqn.py", line 69, in compute_q_values
q_values = self.compute_batch_q_values([state]).flatten()
File "/usr/local/lib/python2.7/dist-packages/rl/agents/dqn.py", line 64, in compute_batch_q_values
q_values = self.model.predict_on_batch(batch)
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1276, in predict_on_batch
x, _, _ = self._standardize_user_data(x)
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 754, in _standardize_user_data
exception_prefix='input')
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training_utils.py", line 126, in standardize_input_data
'with shape ' + str(data_shape))
ValueError: Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (1, 1, 3, 144, 256)
1 ответ
Форма ввода слоя Conv2D (num_channels, width, height)
, Таким образом, вы не должны добавлять другое измерение (на самом деле форма ввода (batch_size, num_channels, width, height)
но вам не нужно устанавливать batch_size
Вот; это будет установлено в fit
метод). Просто пройдите input_shape=env.shape
в Conv2D
и это будет работать нормально.
Редактировать:
Почему вы определяете Input
слой и передать его модели? Это не так, как это работает. Во-первых, вам нужно скомпилировать модель, используя compile
метод, а затем обучить его на данных обучения с помощью fit
метод, а затем использовать predict
метод делать прогнозы. Я настоятельно рекомендую прочитать официальное руководство, чтобы узнать, как эти вещи работают.