如何为Keras模型正确调整输入层的形状以处理Tensorflow 2.2中的不同输入形状

时间:2020-06-20 00:42:43

标签: python tensorflow machine-learning keras deep-learning

我正在关注有关创建一个神经网络以播放TicTacToe(链接至其仓库)的在线教程:https://github.com/fcarsten/tic-tac-toe/blob/master/tic_tac_toe/DirectPolicyAgent.py

不幸的是,他们的方法是使用tensorflow v1.x,因此在使其在1.x中运行后,我尝试将其自己转换为2.x。在他的程序中,他使用了他编写的TFSessionManager帮助器类来运行预测,并根据所玩游戏来训练模型。在这种情况下,他传递了一个feed_dict,它似乎是tensorflow 1.x所独有的,并允许使用变量输入。为了训练输入,字典具有3个1d数组,在游戏的每个回合中都有移动历史,棋盘状态历史和奖励历史,而dict在预测时仅传递了一个包含当前棋盘状态的1d数组

我已经通过其他教程(主要是关于策略梯度:https://adventuresinmachinelearning.com/policy-gradient-tensorflow-2/)将其中大部分转换为tensorflow 2.2。当我定义输入层的形状时,它可以玩第一个游戏,但是随后尝试使用相同的形状进行学习时,崩溃表明我的形状不兼容。

我的模特:

self.model = tf.keras.Sequential([
            layers.Dense(9, kernel_initializer=keras.initializers.he_normal(), name='input'),
            layers.Dense(81, activation='relu', kernel_initializer=keras.initializers.he_normal(), name='hidden'),
            layers.Dense(9, activation='softmax', name='output')
        ])

self.model.compile(optimizer=keras.optimizers.Adam(learning_rate=0.01),
                           loss='categorical_crossentropy')

在游戏中输入模型时,我的棋盘形状为(9,1),正如我之前所说的那样可以正常工作。

在培训期间,我有3个阵列。第一个是所有棋盘状态的列表,其形状为(x,9,1),取决于游戏的时间。第二个是神经网络再次根据游戏时长进行形状(x,1)的移动的索引。第三是我根据游戏结果在每次移动中生成的奖励值。这也是形状(x,1),具体取决于游戏时间。

我想做的是输入棋盘状态和动作作为输入,奖励值作为输出,但是我不确定用我当前的形状来训练此数据的任何方法,或者如何将输入数据重塑为我的模型会接受的形状。在第二个链接中,我关注的是作者使用train_on_batch而不是fit,但是从我所看到的来看,这里似乎并不重要。

当我只使用状态运行程序并获得奖励时,会出现ValueError:形状(x,1)和(x,9,9)不兼容,这也很好奇,因为我验证了状态为(x, 9,1),所以我不知道为什么会说(x,9,9)。我也不知道这是我应该做的,因为我根本没有输入移动历史记录数组。

任何帮助,将不胜感激,在此先感谢您的宝贵时间。

0 个答案:

没有答案