在 CIFAR 10 数据集中

数据挖掘 喀拉斯 毫升
2022-03-13 11:29:49

在使用建立 mlp 之后

## building a mlp model
model=Sequential()
model.add(Dense(25,input_shape=(10,),activation='relu'))
model.add(Dense(100,input_shape=(10,),activation='relu'))
model.add(Dense(150,input_shape=(16,),activation='relu'))
model.add(Dense(10,input_shape=(10,),activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='Adam',metrics=['accuracy'])

当我尝试使用以下方法拟合模型时:

model.fit(x_train, y_train, epochs=10,validation_data=(x_test,y_test))`

我收到此错误:

ValueError Traceback (most recent call last) in 1 # 在 2D 数据上训练 MLP ----> 2 model.fit(x_train, y_train, epochs=10,validation_data=(x_test,y_test))

~\anaconda\lib\site-packages\keras\engine\training.py 适合(self,x,y,batch_size,epochs,verbose,callbacks,validation_split,validation_data,shuffle,class_weight,sample_weight,initial_epoch,steps_per_epoch,validation_steps, **kwargs) 950 sample_weight=sample_weight, 951 class_weight=class_weight, --> 952 batch_size=batch_size) 953 # 准备验证数据。第954章

~\anaconda\lib\site-packages\keras\engine\training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size) 749 feed_input_shapes, 750 check_batch_axis=False, # 不强制批量大小. --> 751 exception_prefix='input') 752 753 如果 y 不是 None:

~\anaconda\lib\site-packages\keras\engine\training_utils.py in standardize_input_data(数据,名称,形状,check_batch_axis,exception_prefix)136':预期'+名称[i]+'具有形状'+ 137 str( shape) + ' 但得到了 shape ' + --> 138 str(data_shape)) 139 返回数据 140 的数组

ValueError:检查输入时出错:预期的dense_29_input具有形状(10,)但得到的数组具有形状(3072,)

有人可以帮我找出错误吗?

1个回答

这里的问题是input_shape您使用的参数,首先是错误的形状,您应该只为第一层提供输入形状。

例如

让我们从 Keras 导入 CIFAR 10 数据

from __future__ import print_function
import keras
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
import os

num_classes = 10

# The data, split between train and test sets:
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# Convert class vectors to binary class matrices.
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

input_shape = x_train.shape[1:]
print('input_shape: ', input_shape)

x_train shape: (50000, 32, 32, 3)
50000 个训练样本
10000 个测试样本
input_shape: (32, 32, 3)

现在我们可以定义我们的模型了。请注意,我只在第一层中使用 input_shape,此外,如果您想使用 Dense 层作为第一层,那么您应该首先展平您的输入。

model=Sequential()
model.add(Flatten(input_shape=input_shape))
model.add(Dense(25,activation='relu'))
model.add(Dense(100,activation='relu'))
model.add(Dense(150,activation='relu'))
model.add(Dense(10,activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='Adam',metrics=['accuracy'])

您可以使用它来查看您的模型

model.summary()

现在你可以适应你的模型

model.fit(x_train, 
          y_train, 
          epochs=10,
          validation_data=(x_test,y_test))

由于 CIFAR 10 由图像数据组成,我不建议您在模型的早期使用密集层。您应该使用卷积神经网络 (CNN)。这些层充当过滤器,从图像的邻域区域中提取特征。这减少了模型参数的数量,从而提高了性能。从这里找到的 Keras 文档

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))