繁体   English   中英

ValueError:layersequential_5 的输入 0 与 layer 不兼容::预期 min_ndim=4,发现 ndim=2。 收到的完整形状:[无,953]

[英]ValueError: Input 0 of layer sequential_5 is incompatible with the layer: : expected min_ndim=4, found ndim=2. Full shape received: [None, 953]

import pyautogui as pg
from PIL import ImageGrab, ImageOps
import numpy as np
import tensorflow as tf
from tensorflow import keras
from time import sleep
from tensorflow.keras.layers import *
import cv2
import random

box = (0,259,953,428)

def bigjump():
    pg.keyDown('space')
    sleep(0.1)
    pg.keyUp('space')
    
def smalljump():
    pg.press('space')
    
def duck():
    pg.keyDown('down')
    sleep(0.4)
    pg.keyUp('down')
    
def noting():
    sleep(0.1)

screen = ImageGrab.grab(bbox = box)
screen = ImageOps.grayscale(screen)

screen_n = np.array(screen)/255

model = keras.models.Sequential()

model.add(Conv2D(32,(8,8),strides=(2,2)))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Activation('relu'))
model.add(Conv2D(64,(4,4),strides=(2,2),padding= 'same'))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Activation('relu'))
model.add(Conv2D(64,(3,3),strides=(1,1),padding= 'same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(512,activation='relu'))
model.add(Dense(4))

model.compile(optimizer = 'adam',loss = 'mean_square_error',metrics =['accurate']) 

model.build((169,953))
model.summary()

done = 0
count = 0

discount = 0.99

max_episodes = 1000

state_list = list()
q_list = list()

replay_mem = list()

replay_size = 32
replay_limit = 2048

for episode in range(max_episodes):
    while not done:
        
        count += 1
        e = 1 / ((episode / 10) + 1)
    
        screen = ImageGrab.grab(bbox = box)
        screen_n = np.array(ImageOps.grayscale(screen))/255
        
        q = model.predict(screen_n)
    
        if np.random.rand(1)<e:
            action = random.randint(1,4)
        else:
            action = np.argmax(q)

        if action == 1:
            bigjump()
        elif action == 2:
            smalljump()
        elif action == 3:
            duck()
        elif action == 4:
            noting()
        
        screen_next = ImageGrab.grab(bbox = box)
        screen_next_n = np.array(ImageOps.grayscale(screen_next))/255
        
        if screen_next_n == screen_n:
            done = 1
            reward = -100
        else:
            reward = 1
            
        replay_mem.append([screen_n,screen_next_n,action,done,reward])
        
        if len(replay_mem)<replay_size:
            replay_size = len(replay_mem)
        
        for sample in random.sample(replay_mem,replay_size):
            screen_n,screen_next_n,action_dont,reward = sample
            if done:
                q[0,action] = -100
            else:
                q_next = model.predict(screen_next_n)
                q[0,action] = reward + discount*argmax(q_next)
            
            state_list.append(screen_n)
            q_list.append(q)
        hist = model.fit(state_list,q_list,epochs = 5,verbose =0)

我正在制作 Q 学习算法来玩 Chrome 恐龙

我捕获屏幕并转换为二进制图像并转换为 numpy 数组

我使用 model.predict 来查找 q 值但出现错误

有什么方法可以解决这个问题吗?

ValueError:layersequential_5 的输入 0 与 layer 不兼容::预期 min_ndim=4,发现 ndim=2。 收到的完整形状:[无,953]

我认为它与灰度有关,您能否分享 model 的输入层的尺寸。

可能,model 是在 3 通道数据上训练的,这就是为什么它要求 4 个暗淡(batch_size,ch1,ch2,ch3),而您的灰度图像是单通道,因此需要 2 个暗淡(batch_size,ch1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM