我已经开始对从这里获取的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)当我试图在这些数据上拟合我的模型时,我用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中选择数据。但我还是会犯同样的错误。
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)发布于 2021-08-05 12:56:11
主要问题在于您的模型构建代码:
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
https://stackoverflow.com/questions/68651735
复制相似问题