【问题标题】:Error while using both sparse_categorical_crossentropy and categorical_crossentropy in keras在 keras 中同时使用 sparse_categorical_crossentropy 和 categorical_crossentropy 时出错
【发布时间】:2021-10-09 14:04:16
【问题描述】:

我已经开始使用来自here 的 MNIST 数据训练一个基本的 MLP 模型。下面是我实现模型的代码。

train = pd.read_csv(r"train.csv")
test = pd.read_csv(r"test.csv")
train_img_path = "./Images/train/"
test_img_path = "./Images/test/"
train_img = []
for img in train['filename']:
    img_path = train_img_path+img
    image = imread(img_path)
    
    image = image/255
    train_img.append(image)
    
train_img = np.array(train_img) 

batch_size = 64
y_train = train['label']

from tensorflow.keras.utils import to_categorical
#y_train = to_categorical(y_train)
model = Sequential()
model.add(Dense(10, activation = 'relu'))
model.add(Dense(10, activation = 'relu'))
model.add(Dense(10, activation = 'softmax'))

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(train_img, y_train, epochs=20, batch_size=batch_size)

在尝试根据这些数据拟合我的模型时,我收到错误 InvalidArgumentError: logits and labels must have the same first dimension, got logits shape [50176,10] and labels shape [64]loss='sparse_categorical_crossentropy'

有人建议在获得 one-hot 编码值后尝试使用 loss='categorical_crossentropy',这也会给出错误 ValueError: Shapes (None, 10) and (None, 28, 28, 10) are incompatible

我对如何在错误中获得形状 [50176,10](尽管示例为 49000)感到困惑。 我想我在形状上遗漏了一些东西。有人可以指导我哪里做错了以及如何解决这个问题。

编辑:我已经修改了我的代码,以从kerasfor_from_dataframe 中选择数据。但我仍然遇到同样的错误。

train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_data = train_datagen.flow_from_dataframe(
    dataframe=train,
    directory='./Images/train',
    x_col='filename',
    y_col='label',
    weight_col=None,
    target_size=(28,28),
    color_mode='grayscale',
    class_mode='categorical',
    batch_size=64
)

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
#model.summary()
model.fit(train_data, epochs=20)

【问题讨论】:

  • 您是否尝试将Flatten() 层作为第一层添加到您的模型中?
  • 谢谢。只需添加Flatten() 层就可以了。那是因为我正在传递图像数据,因此应该使用它吗?
  • 是的,因为您的数据是 3 维的,包括图像的深度。

标签: python keras reshape tf.keras


【解决方案1】:

主要问题在于您的模型构建代码:

model = Sequential()
model.add(Dense(10, activation = 'relu'))
model.add(Dense(10, activation = 'relu'))
model.add(Dense(10, activation = 'softmax'))

您正在尝试将图像及其标签提供给 ANN,这显然会出错。您的模型中也没有任何输入。

对于图像,应使用 CNN 而不是 ANN。

import tensorflow as tf
model = Sequential()
model.add(tf.keras.layers.Conv2D(32, activation = 'relu', input_shape=(28,28,3)))
model.add(tf.keras.layers.MaxPooling2D((2,2))
model.add(tf.keras.layers.Conv2D(64, activation = 'relu'))
model.add(tf.keras.layers.MaxPooling2D((2,2))
model.add(tf.keras.layers.Conv2D(128, activation = 'relu'))
model.add(tf.keras.layers.MaxPooling2D((2,2))
model.add(tf.keras.layers.Flatten())
model.add(Dense(10, activation = 'relu'))
model.add(Dense(20, activation = 'relu'))
model.add(Dense(10, activation = 'softmax'))

如果您对标签进行一次性编码,请使用 categorical_crossentropy。如果您的标签是数字,请使用sparse_categorical_crossentropy

【讨论】:

  • 感谢您的回答。在Dense() 工作之前只包括Flatten() 层。我希望图像数据也可以输入到 MLP 模型中。
  • @mockash CNN 在图像分类方面的性能优于 MLP。更好地使用 CNN
猜你喜欢
  • 2020-11-22
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多