Python 如何在CNN中获得更高的验证准确性?

Python 如何在CNN中获得更高的验证准确性?,python,machine-learning,keras,deep-learning,conv-neural-network,Python,Machine Learning,Keras,Deep Learning,Conv Neural Network,好的,我需要一个99.5%的验证准确率,在一个MNIST数据集上,只有很少的可训练参数(应该小于8000),我已经尝试了大多数方法,比如超参数调优,使用不同的优化器,尝试了图像增强,添加了更多复杂的层,加上退出层和批量标准化,我尝试使用所有这些方法,但它没有给我超过98.89%的验证准确率,有30个时代 我有没有遗漏什么,或者我做得不对 from keras.models import Sequential from keras.datasets import mnist from keras.

好的,我需要一个99.5%的验证准确率,在一个MNIST数据集上,只有很少的可训练参数(应该小于8000),我已经尝试了大多数方法,比如超参数调优,使用不同的优化器,尝试了图像增强,添加了更多复杂的层,加上退出层和批量标准化,我尝试使用所有这些方法,但它没有给我超过98.89%的验证准确率,有30个时代

我有没有遗漏什么,或者我做得不对

from keras.models import Sequential
from keras.datasets import mnist
from keras.layers import Conv2D , MaxPooling2D , Dense , Flatten , Dropout
from keras.optimizers import SGD
from keras.optimizers import adam
from keras.layers.normalization import BatchNormalization
from keras.preprocessing.image import ImageDataGenerator

(x_train , y_train), (x_test, y_test) = mnist.load_data()

#PREPROCESSING IMAGE DATA
x_train = x_train / 255.0
x_test = x_test /255.0

x_train = x_train.reshape(60000,28,28,1)
x_test = x_test.reshape(10000,28,28,1)


model = Sequential()


# CONVOLVING IMAGES
model.add(Conv2D(filters=32, kernel_size=5 , input_shape=(28,28,1), activation="relu"))
model.add(MaxPooling2D(3,3))

model.add(Conv2D(filters=16 ,  kernel_size=3 , activation="relu"))
model.add(MaxPooling2D(3,3))
model.add(BatchNormalization())

model.add(Conv2D(filters=32, kernel_size=2 , activation="relu"))
model.add(Dropout(0.2))

model.add(Flatten())

#MAKING A NEURAL NETWORK
model.add(Dense(units=10 , activation="softmax"))

#COMPILING

#model.compile(optimizer=SGD(learning_rate=0.013 , momentum=0.89) , loss="sparse_categorical_crossentropy" , metrics=["accuracy"])
model.compile(optimizer=adam(learning_rate=0.00142 , beta_1=0.935 ,beta_2=0.999) ,loss= "sparse_categorical_crossentropy" , metrics=["accuracy"])
#model.compile(optimizer="adam",loss= "sparse_categorical_crossentropy" , metrics=["accuracy"])


#IMAGE AUGMENTATION AND TRAINING


# datagen = ImageDataGenerator(rotation_range=10 ,width_shift_range=0.15, height_shift_range=0.15 ,
#                              zoom_range=0.3, shear_range=0.15 )
#
# datagen.fit(x_train)
# model.fit_generator(datagen.flow(x_train , y_train ,batch_size=32) , steps_per_epoch=len(x_train)/60 , epochs=30 ,
#                      validation_data=(x_test, y_test))

# OR USE THE ONE BELOW WITH NO IMAGE AUGMENTATION

model.fit(x= x_train, y=y_train , epochs=30 , validation_data=(x_test,y_test) , batch_size=256)


# MODEL SUMMARY
model.summary()

# SAVING MODEL
model.save("mnist_test.h5")
print("MODEL SAVED")


你有没有试过在conv层上使用spatial dropout?这不是一个真正的问题,这不是一个编程问题,而是一个研究问题。在某个时候,你已经尽了最大的努力,看起来你已经做到了。实际上,由于训练参数的数量有限,您的效果非常好。我见过一些技巧可以减少可训练参数的数量。MobileNet上的论文讨论了基于深度可分离卷积减少模型参数。