簡體   English   中英

ValueError:層“max_pooling2d”的輸入 0 與層不兼容:預期 ndim=4,發現 ndim=5。 收到的完整形狀:(無、3、51、39、32)

[英]ValueError: Input 0 of layer "max_pooling2d" is incompatible with the layer: expected ndim=4, found ndim=5. Full shape received: (None, 3, 51, 39, 32)

我有兩個不同的問題同時發生。

我有 MaxPooling2d 的維度問題,並且有 DQNAgent 的相同維度問題。

問題是,我可以單獨修復它們,但不能同時修復。

第一個問題

我正在嘗試構建一個具有多層的 CNN 網絡。 在我構建 model 后,當我嘗試運行它時,它給了我一個錯誤。

!pip install PyOpenGL==3.1.* PyOpenGL-accelerate==3.1.*
!pip install tensorflow gym keras-rl2 gym[atari] keras pyvirtualdisplay 

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Convolution2D, MaxPooling2D, Activation
from keras_visualizer import visualizer 
from tensorflow.keras.optimizers import Adam
env = gym.make('Boxing-v0')
height, width, channels = env.observation_space.shape
actions = 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 與層不兼容:預期 ndim=4,發現 ndim=5。 收到的完整形狀:(無、3、51、39、32)

第二個問題

我的input_shape(3, 210, 160, 3) 我故意使用前 3 個,因為我必須在之前指定batch_size 如果我之前沒有指定它並將其作為(210, 160, 3)傳遞給build_model function,在build_agent function 下面會給我另一個錯誤:

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) 的數組

在 model 構建階段刪除批大小號,消除 MaxPooling2D 不兼容錯誤但會引發 DQNAgent 維度錯誤。 將批量大小添加到 model 構造階段會消除 DQNAgent 維度錯誤,但會引發 MaxPooling2D 不兼容錯誤。

我真的被困住了。

問題在於 input_shape。 輸入形狀=輸入形狀[1:]

工作示例代碼

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Convolution2D, MaxPooling2D, Activation
from tensorflow.keras.optimizers import Adam

input_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()

Output

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,762
Trainable params: 1,977,762
Non-trainable params: 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM