在 CIFAR10 数据集上使用多层感知器网络精度低?

数据挖掘 机器学习 神经网络 喀拉斯 图像分类 过拟合
2022-03-08 08:10:06

我使用 keras 训练了 Muti 层感知器来对 cifar-10 数据集进行分类,我得到的结果表明代码中有问题,因为所有的时代都是相同的,这里是代码:在这我将数据从 32x32x3 展平为 3072 数组。

   #nn layers 
import numpy
from keras.datasets import cifar10
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from matplotlib import pyplot
from scipy.misc import toimage

#load data
(Xt,Yt),(Xts,Yts)=cifar10.load_data()

num_pix=Xt.shape[1]*Xt.shape[2]*Xt.shape[3]
X_tr=Xt.reshape(-1,3072).astype('float32')
X_ts=Xts.reshape(-1,3072).astype('float32')
#feature scaling
X_tr= X_tr / 255
X_ts = X_ts / 255
#one hot encoding
from keras.utils import np_utils
Ytr=Yt.reshape(-1,50000)
Yt=np_utils.to_categorical(Ytr)
Yts=Yts.reshape(-1,10000)
Yts=np_utils.to_categorical(Yts)
num_class=Yts.shape[1]


def base_model():
    model=Sequential()
    #build layers Dense(10, init="normal", activation="relu"
    model.add(Dense(num_pix,input_dim=num_pix,activation='relu'))#input layer
    model.add(Dense(num_class,activation='softmax'))#output layer
    #compile model
    model.compile(loss='squared_hinge',optimizer='adam',metrics=['accuracy'])
    return model
    #build the model
model=base_model()
#Fit model
model.fit(X_tr,Yt,validation_data=(X_ts,Yts),epochs=10,batch_size=200,verbose=2)
#Final assesment
score=model.evaluate(X_ts,Yts,verbose=0)
print("Baseline Error: %.2f%%" % (100-score[1]*100))

  Results :

 Train on 50000 samples, validate on 10000 samples
    Epoch 1/10
    134s - loss: 0.9900 - acc: 0.1000 - val_loss: 0.9900 - val_acc: 0.1000
    Epoch 2/10
    97s - loss: 0.9900 - acc: 0.1000 - val_loss: 0.9900 - val_acc: 0.1000
    Epoch 3/10
    99s - loss: 0.9900 - acc: 0.1000 - val_loss: 0.9900 - val_acc: 0.1000
    Epoch 4/10
    96s - loss: 0.9900 - acc: 0.1000 - val_loss: 0.9900 - val_acc: 0.1000
    Epoch 5/10
    96s - loss: 0.9900 - acc: 0.1000 - val_loss: 0.9900 - val_acc: 0.1000
    Epoch 6/10
    96s - loss: 0.9900 - acc: 0.1000 - val_loss: 0.9900 - val_acc: 0.1000
    Epoch 7/10
    96s - loss: 0.9900 - acc: 0.1000 - val_loss: 0.9900 - val_acc: 0.1000
    Epoch 8/10
    95s - loss: 0.9900 - acc: 0.1000 - val_loss: 0.9900 - val_acc: 0.1000
    Epoch 9/10
    95s - loss: 0.9900 - acc: 0.1000 - val_loss: 0.9900 - val_acc: 0.1000
    Epoch 10/10
    95s - loss: 0.9900 - acc: 0.1000 - val_loss: 0.9900 - val_acc: 0.1000
    Baseline Error: 90.00%

任何帮助将不胜感激。我的模型可以过拟合吗?

1个回答

CIFAR10 有 10 个类标签。所以通过随机猜测,你应该达到 10% 的准确率。这就是你得到的。这意味着您的算法根本没有学习。最常见的问题是你的学习率。通过更换线路来降低学习率,

model.fit(X_tr,Yt,validation_data=(X_ts,Yts),epochs=10,batch_size=200,verbose=2)

optimizer = keras.optimizers.Adam(lr=1e-4)
model.compile(loss='squared_hinge',optimizer=optimizer,metrics=['accuracy'])

我刚刚做了一个测试运行,它正在慢慢学习。