如何在numpy数组中配置数据标签以训练Keras模型?

时间:2018-12-21 19:36:01

标签: python numpy tensorflow keras training-data

我尝试将我的Keras第一次实现(对这个愚蠢的问题感到抱歉),这是一个更广泛的项目的一部分,目的是使AI学会玩连接4。在此过程中,我将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:检查目标时出错:预期density_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陌生的人吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

您正在使用sparse_categorical_crossentropy损失,该损失将使用整数标签(而不是一键编码的整数),而标签是一键编码的。这就是为什么您会得到一个错误。

最简单的解决方法是将损失更改为categorical_crossentropy