我同时遇到了两个不同的问题。
我在使用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