如何在 numpy 数组中配置数据标签以训练 Keras 模型?
how to configure data labels in a numpy array for training a Keras model?
我第一次尝试实现 Keras(很抱歉问了这个愚蠢的问题),作为一个更广泛的项目的一部分,目的是制作一个学习玩 connect 4 的 AI。作为其中的一部分,我通过了一个 NN一个 6*7 的网格,它输出一个包含 7 个值的数组,给出游戏中每一列的选择概率。下面是 Model.summary() 方法的输出,更详细一点:
______________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 42) 0
_________________________________________________________________
dense (Dense) (None, 20) 860
_________________________________________________________________
dense_1 (Dense) (None, 20) 420
_________________________________________________________________
dense_2 (Dense) (None, 7) 147
=================================================================
Total params: 1,427
Trainable params: 1,427
Non-trainable params: 0
_________________________________________________________________
_________________________________________________________________
当我将形状为 (1, 6, 7) 的 numpy 数组传递给它时,模型将给出(目前随机的)预测,但是,当我尝试使用形状数组 (221, 6) 训练模型时, 7) 对于数据和形状数组 (221, 7) 对于标签我得到这个错误:
ValueError:检查目标时出错:预期 dense_2 具有形状 (1,) 但得到形状为 (7,)
的数组
这是我用来训练模型的代码(输出 (221, 6, 7) 和 (221, 7)):
board_tensor = np.array(full_board_list)
print(board_tensor.shape)
label_tensor = np.array(full_label_list)
print(label_tensor.shape)
self.model.fit(board_tensor, label_tensor)
这是我用来定义模型的代码:
self.model = keras.Sequential([
keras.layers.Flatten(input_shape=(6, 7)),
keras.layers.Dense(20, activation=tf.nn.relu),
keras.layers.Dense(20, activation=tf.nn.relu),
keras.layers.Dense(7, activation=tf.nn.softmax)])
self.model.compile(optimizer=tf.train.AdamOptimizer(),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
(模型是 AI 对象的一部分,因此可以与其他类型的 AI 对象进行比较)
这是成功预测大小为 1 的批次的代码,由代表棋盘的二维列表生成(它输出 (1, 6, 7) 和 (1, 7)):
input_tensor = np.array(board.board)
input_tensor = np.expand_dims(input_tensor, 0)
print(input_tensor.shape)
probability_distribution = self.model.predict(input_tensor)
print(probability_distribution.shape)
我意识到错误可能是由于我对 Keras 中的方法期望给出的内容缺乏理解;作为一个小旁注,有没有人有任何好的、全面的学习资源可以真正让你理解每种方法在做什么(即不只是告诉你输入哪些代码来制作图像识别器)这是可以理解的对于像我这样刚接触 Keras 和 Tensorflow 的人?
非常感谢!
您正在使用 sparse_categorical_crossentropy
损失,它采用整数标签(不是单热编码的标签),而您的标签是单热编码的。这就是您收到错误的原因。
修复它的最简单方法是将损失更改为 categorical_crossentropy
。
我第一次尝试实现 Keras(很抱歉问了这个愚蠢的问题),作为一个更广泛的项目的一部分,目的是制作一个学习玩 connect 4 的 AI。作为其中的一部分,我通过了一个 NN一个 6*7 的网格,它输出一个包含 7 个值的数组,给出游戏中每一列的选择概率。下面是 Model.summary() 方法的输出,更详细一点:
______________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 42) 0
_________________________________________________________________
dense (Dense) (None, 20) 860
_________________________________________________________________
dense_1 (Dense) (None, 20) 420
_________________________________________________________________
dense_2 (Dense) (None, 7) 147
=================================================================
Total params: 1,427
Trainable params: 1,427
Non-trainable params: 0
_________________________________________________________________
_________________________________________________________________
当我将形状为 (1, 6, 7) 的 numpy 数组传递给它时,模型将给出(目前随机的)预测,但是,当我尝试使用形状数组 (221, 6) 训练模型时, 7) 对于数据和形状数组 (221, 7) 对于标签我得到这个错误:
ValueError:检查目标时出错:预期 dense_2 具有形状 (1,) 但得到形状为 (7,)
的数组这是我用来训练模型的代码(输出 (221, 6, 7) 和 (221, 7)):
board_tensor = np.array(full_board_list)
print(board_tensor.shape)
label_tensor = np.array(full_label_list)
print(label_tensor.shape)
self.model.fit(board_tensor, label_tensor)
这是我用来定义模型的代码:
self.model = keras.Sequential([
keras.layers.Flatten(input_shape=(6, 7)),
keras.layers.Dense(20, activation=tf.nn.relu),
keras.layers.Dense(20, activation=tf.nn.relu),
keras.layers.Dense(7, activation=tf.nn.softmax)])
self.model.compile(optimizer=tf.train.AdamOptimizer(),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
(模型是 AI 对象的一部分,因此可以与其他类型的 AI 对象进行比较) 这是成功预测大小为 1 的批次的代码,由代表棋盘的二维列表生成(它输出 (1, 6, 7) 和 (1, 7)):
input_tensor = np.array(board.board)
input_tensor = np.expand_dims(input_tensor, 0)
print(input_tensor.shape)
probability_distribution = self.model.predict(input_tensor)
print(probability_distribution.shape)
我意识到错误可能是由于我对 Keras 中的方法期望给出的内容缺乏理解;作为一个小旁注,有没有人有任何好的、全面的学习资源可以真正让你理解每种方法在做什么(即不只是告诉你输入哪些代码来制作图像识别器)这是可以理解的对于像我这样刚接触 Keras 和 Tensorflow 的人?
非常感谢!
您正在使用 sparse_categorical_crossentropy
损失,它采用整数标签(不是单热编码的标签),而您的标签是单热编码的。这就是您收到错误的原因。
修复它的最简单方法是将损失更改为 categorical_crossentropy
。