tensorflow KerasRl值错误:检查输入时出错:input_3应有3个维度,但得到的数组形状为(1,1,9,9)

hmae6n7t  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(135)

我用Gym做了一个数独游戏的env,我想用KerasRL训练一个AI。我用一个Flatten和3个密集层做我的模型,用Adam编译它。当我试图编译它的时候,我得到了一个错误,因为形状不正确,我不知道为什么:

from gym import Env
     from gym.spaces import Discrete, Box
     import numpy as np
     import random
     
     from tensorflow.keras.models import Sequential
     from tensorflow.keras.layers import Dense, Flatten, Input
     from tensorflow.keras.optimizers import Adam
     from numpy.linalg.linalg import double
     from numpy.core.numeric import ones
     
     class Sudoku(Env):
           #Fonction d'initialisaion
     def __init__(self):
               #Soit on met une case fixé et il y a 9 actions possibles (mettre un num de 1 à 9), sur la grille générale il y a 81 cases disponibles et 9 numéros possibles par case ->729
     self.action_space = Discrete(729)
     
               #81 cases qui prennent des valeurs entres 0 (case vide pour 0) et 9, le produit cartésien des deux donnent bien le nombre de grilles possibles au sudoku je pense
               #chaque case est représenté par une case de tableau, le premier array correspond a la borne inferieur prise par chaque case (0) et le deuxieme par la borne sup 9, ça fait enormément d'état possibles
     self.observation_space = Box(low= 0,high= 9, shape=(9,9),dtype=int)
     
               #definition de l'état de départ que des zeros dans les 81 cases (vides)
     self.state = np.zeros((9,9),dtype=int)
     
     
             #fonction application d'action
     def step(self,action):
     return self.state , reward , done , info
     
     def render(self, mode):      
     
     def reset(self):
     return self.state
     
     def build_model(states,actions):
     model=Sequential()
     model.add(Input(shape=states))
     model.add(Flatten())
     model.add(Dense(100,activation='relu'))
     model.add(Dense(100,activation='relu'))
     model.add(Dense(actions,activation='linear'))
     return model
     
     from rl.agents import DQNAgent
     from rl.policy import BoltzmannQPolicy
     from rl.memory import SequentialMemory
     
     def build_agent(model,actions):
     policy= BoltzmannQPolicy()
     memory= SequentialMemory(limit=50000,window_length=1)
     agent= DQNAgent(model=model,memory=memory,policy=policy,nb_actions=actions,nb_steps_warmup=10,target_model_update=1e-2)
     return agent
     
     env=Sudoku()
     states=env.observation_space.shape
     print(states)
     actions=env.action_space.n
     model = build_model(states,actions)
     model.summary()
     agent = build_agent(model,actions)
     agent.compile(Adam(lr=1e-3),metrics=['mae'])
     agent.fit(env,nb_steps=20000,visualize=False,verbose=1)

我得到这个错误:
Training for 20000 steps ... Interval 1 (0 steps performed) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) in 1 agent.compile(Adam(lr=1e-3),metrics=['mae']) ----> 2 agent.fit(env,nb_steps=20000,visualize=False,verbose=1)
7 frames/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/engine/training_utils. py在标准化输入数据(数据,名称,形状,检查批处理轴,异常前缀)中569形状=形状[i] 570 if len(数据形状)!= len(形状):- -〉571引发ValueError('检查'+异常前缀+572 '时出错:应为"+ names [i]+"具有"+573 str(len(shape))+"维度,但得到的是数组"

ValueError: Error when checking input: expected input_3 to have 3 dimensions, but got array with shape (1, 1, 9, 9)
uz75evzq

uz75evzq1#

我在代码中发现了一个错误,缺少return self.mode。我只对修改后的代码做了一个检查模块,没有语法错误。

def render(self, mode):    
    return self.mode

相关问题