2 回答
TA贡献2039条经验 获得超7个赞
问题是,categorical_crossentropy期望单热编码标签,这意味着,对于每个样本,它期望一个长度张量,num_classes其中label第 th 个元素设置为 1,其他所有元素都为 0。
另一方面,sparse_categorical_crossentropy直接使用整数标签(因为这里的用例是大量的类,所以单热编码标签会浪费大量零的内存)。我相信,但我无法证实这一点,它categorical_crossentropy比它的稀疏对应物运行得更快。
对于您的情况,对于 26 个类,我建议使用非稀疏版本并将您的标签转换为单热编码,如下所示:
def getData(filename):
images = []
labels = []
with open(filename) as csv_file:
file = csv.reader(csv_file, delimiter = ",")
next(file, None)
for row in file:
label = row[0]
data = row[1:]
img = np.array(data).reshape(28,28)
images.append(img)
labels.append(label)
images = np.array(images).astype("float64")
labels = np.array(labels).astype("float64")
return images, tf.keras.utils.to_categorical(labels, num_classes=26) # you can omit num_classes to have it computed from the data
旁注:除非你有理由使用float64图像,否则我会切换到float32(它将数据集所需的内存减半,并且模型可能会将它们转换为float32第一个操作)
TA贡献1859条经验 获得超6个赞
很简单,对于输出类为整数的分类问题,使用 sparse_categorical_crosentropy,对于标签在一个热编码标签中转换的问题,我们使用 categorical_crosentropy。
添加回答
举报