首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在keras中同时使用sparse_categorical_crossentropy和categorical_crossentropy时出错

在keras中同时使用sparse_categorical_crossentropy和categorical_crossentropy时出错
EN

Stack Overflow用户
提问于 2021-08-04 13:02:18
回答 1查看 204关注 0票数 0

我已经开始对从这里获取的MNIST数据进行基本的MLP模型的培训。下面是我实现该模型的代码。

代码语言:javascript
复制
train = pd.read_csv(r"train.csv")
test = pd.read_csv(r"test.csv")
train_img_path = "./Images/train/"
test_img_path = "./Images/test/"
代码语言:javascript
复制
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)
代码语言:javascript
复制
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)

当我试图在这些数据上拟合我的模型时,我用loss='sparse_categorical_crossentropy'获得了错误的loss='sparse_categorical_crossentropy'

有人建议在有一个热编码值之后尝试使用loss='categorical_crossentropy',这也会给出错误的ValueError: Shapes (None, 10) and (None, 28, 28, 10) are incompatible

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

编辑:我修改了下面的代码,以便从keras for_from_dataframe中选择数据。但我还是会犯同样的错误。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2021-08-05 12:56:11

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

代码语言:javascript
复制
model = Sequential()
model.add(Dense(10, activation = 'relu'))
model.add(Dense(10, activation = 'relu'))
model.add(Dense(10, activation = 'softmax'))

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

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

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68651735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档