我在为keras(tensorflow后端)正确格式化标签方面遇到了一些困难。我的模型将嵌入(128个数字的列表)作为输入,并输出18827个不同数字之一(范围从1到20284),如下所示:
[0.0344733819366,...,0.153029859066] -> 11516
我的训练数据包含316491个嵌入数字对,所以当我尝试使用keras.utils.to_categorical(training_out, num_classes=20284)
将数字标签转换为categorical_crossentropy
的单热矢量时,我收到了一个MemoryError。看起来
sparse_categorical_crossentropy
会解决此问题,因为它看起来只需要一个数字而不是一个大向量作为标签。但是,我不确定如何正确格式化我的标签。目前我的模型是:
self.brain = Sequential()
self.brain.add(Dense(1000, input_dim=128))
self.brain.add(Dense(20284, activation='softmax'))
self.brain.compile(optimizer='adadelta', loss='categorical_crossentropy', metrics=['accuracy'])
当我尝试拟合模型时,我会得到以下错误,具体取决于我如何格式化标签:
ValueError: Error when checking target: expected dense_22 to have shape (None, 18827) but got array with shape (1, 316491)
或
ValueError: Error when checking target: expected dense_20 to have shape (None, 18827) but got array with shape (316491, 1)
18827是我拥有的不同标签的数量,但我认为我在代码中的任何位置都没有指定该数字,所以我不知道这是标签的预期尺寸的方式或原因,特别是如果每个标签不是矢量。
我不确定我是否正确理解了sparse_categorical_crossentropy,如果我这样做,那么如何正确使用它。
答案 0 :(得分:0)
在评论expected dense_20 to have shape (None, 18827) but got array with shape (316491, 1)
中回答来自Keras文档https://keras.io/losses/
注意:当使用categorical_crossentropy损失时,您的目标应该是分类格式(例如,如果您有10个类,则每个样本的目标应该是10维向量,在索引处为1的全0期望值对应于样本的类别)。要将整数目标转换为分类目标,可以使用Keras实用程序to_categorical
在您的情况下,由于内存问题,您无法进行单热编码,因此您需要使用 sparse_categorical_crossentropy 。