2 回答

TA貢獻2039條經驗 獲得超8個贊
問題是,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。
添加回答
舉報