ValueError: 层 “max_pooling2d” 的输入 0 与该层不兼容:期望的维度数为4,但发现的维度数为5。接收到的完整形状为:(None, 3, 51, 39, 32)

我同时遇到了两个不同的问题。

我在使用MaxPooling2d时遇到了维度问题,同时在使用DQNAgent时也遇到了相同的维度问题。

问题在于,我可以分别解决它们,但无法同时解决。

第一个问题

我正在尝试构建一个包含多个层的CNN网络。在构建模型后,当我尝试运行它时,它会报错。

!pip install PyOpenGL==3.1.* PyOpenGL-accelerate==3.1.*!pip install tensorflow gym keras-rl2 gym[atari] keras pyvirtualdisplay from tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense, Flatten, Convolution2D, MaxPooling2D, Activationfrom keras_visualizer import visualizer from tensorflow.keras.optimizers import Adam
env = gym.make('Boxing-v0')height, width, channels = env.observation_space.shapeactions = env.action_space.n
input_shape = (3, 210, 160, 3)   ## input_shape = (batch_size, height, width, channels)
def build_model(height, width, channels, actions):  model = Sequential()  model.add(Convolution2D(32, (8,8), strides=(4,4), activation="relu", input_shape=input_shape, data_format="channels_last"))  model.add(MaxPooling2D(pool_size=(2, 2), data_format="channels_last"))  model.add(Convolution2D(64, (4,4), strides=(1,1), activation="relu"))  model.add(MaxPooling2D(pool_size=(2, 2), data_format="channels_last"))  model.add(Convolution2D(64, (3,3), activation="relu"))  model.add(Flatten())  model.add(Dense(512, activation="relu"))  model.add(Dense(256, activation="relu"))  model.add(Dense(actions, activation="linear"))  return model
model = build_model(height, width, channels, actions)

它会报以下错误:

ValueError: 层 “max_pooling2d_12” 的输入 0 与该层不兼容:期望的维度数为4,但发现的维度数为5。接收到的完整形状为:(None, 3, 51, 39, 32)

第二个问题

我的 input_shape(3, 210, 160, 3)。我故意使用前面的3,因为我必须先指定 batch_size。如果我不事先指定它,并将 (210, 160, 3) 传递给 build_model 函数,下面 build_agent 函数会报另一个错误:

def build_agent(model, actions):  policy = LinearAnnealedPolicy(EpsGreedyQPolicy(), attr="eps", value_max=1., value_min=.1, value_test=.2, nb_steps=10000)  memory = SequentialMemory(limit=1000, window_length=3)  dqn = DQNAgent(model=model, memory=memory, policy=policy,                 enable_dueling_network=True, dueling_type="avg",                 nb_actions=actions, nb_steps_warmup=1000)  return dqn
dqn = build_agent(model, actions)dqn.compile(Adam(learning_rate=1e-4))dqn.fit(env, nb_steps=10000, visualize=False, verbose=1)

ValueError: 检查输入时出错:期望 conv2d_11_input 具有4个维度,但得到的数组形状为 (1, 3, 210, 160, 3)

在模型构建阶段删除批量大小数字,可以消除MaxPooling2D的不兼容错误,但会引发DQNAgent的维度错误。将批量大小添加到模型构建阶段可以消除DQNAgent的维度错误,但会引发MaxPooling2D的不兼容错误。

我真的卡住了。


回答:

问题出在input_shape上。input_shape=input_shape[1:]

工作样本代码

from tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense, Flatten, Convolution2D, MaxPooling2D, Activationfrom tensorflow.keras.optimizers import Adaminput_shape = (3, 210, 160, 3)model = Sequential()model.add(Convolution2D(32, (8,8), strides=(4,4), activation="relu", input_shape=input_shape[1:], data_format="channels_last"))model.add(MaxPooling2D(pool_size=(2,2), data_format="channels_last"))model.add(Convolution2D(64, (4,4), strides=(1,1), activation="relu"))model.add(MaxPooling2D(pool_size=(2, 2), data_format="channels_last"))model.add(Convolution2D(64, (3,3), activation="relu"))model.add(Flatten())model.add(Dense(512, activation="relu"))model.add(Dense(256, activation="relu"))model.add(Dense(2, activation="linear"))model.summary()

输出

Model: "sequential_7"_________________________________________________________________ Layer (type)                Output Shape              Param #   ================================================================= conv2d_9 (Conv2D)           (None, 51, 39, 32)        6176                                                                        max_pooling2d_5 (MaxPooling  (None, 25, 19, 32)       0          2D)                                                                                                                               conv2d_10 (Conv2D)          (None, 22, 16, 64)        32832                                                                       max_pooling2d_6 (MaxPooling  (None, 11, 8, 64)        0          2D)                                                                                                                               conv2d_11 (Conv2D)          (None, 9, 6, 64)          36928                                                                       flatten_1 (Flatten)         (None, 3456)              0                                                                           dense_4 (Dense)             (None, 512)               1769984                                                                     dense_5 (Dense)             (None, 256)               131328                                                                      dense_6 (Dense)             (None, 2)                 514                                                                        =================================================================Total params: 1,977,762Trainable params: 1,977,762Non-trainable params: 0

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注