mnist数据集为keras库中自带数据集,可直接导入数据,本文使用pycharm作为主要工具
?1、导入相应库文件(主要使用keras库)
from keras.datasets import mnist #导入数据集
from keras import regularizers #layers表示层,regularizers表示正则化
from keras.models import Sequential#神经网络模型库
from keras.utils import np_utils#数据处理库
from keras.layers import Dense,Dropout
import matplotlib.pyplot as plt
2、探索数据基本参数,输出数据大小,并打印第一个图像像素数据,每个图像大小均为长28*宽28
(train_images,train_labels),(test_images,test_labels) = mnist.load_data() #下载数据集 第二次运行不用重新下载
print(train_images.shape,test_images.shape) #打印训练和测试图像的大小信息
print(train_images[0]) #打印图像的像素信息
print(train_labels[0]) #打印图像对应的标签
?3、直观的查看图像
plt.imshow(train_images[0]) #查看图像
plt.show()
4、训练前数据处理
train_images = train_images.reshape(60000,28*28).astype("float") #reshape函数表示将二维数值转化成一维数值
test_images = test_images.reshape(10000,28*28).astype("float")
train_labels = np_utils.to_categorical(train_labels)#进行onehot编码,便于进行分类
test_labels = np_utils.to_categorical(test_labels)
?5、神经网络构建(使用Dense表示全连接层)
model = Sequential()#将所有层连接
#
# 方法一:只有一个隐藏层,测试学习率不理想
model.add(Dense(15, activation='relu',input_shape=(28*28,))) #隐藏层15个神经元,使用relu激活函数,
model.add(Dense(10, activation='softmax'))#输出层10个神经元,激活函数使用softmax,二分类问题使用Sigmund
6、网络参数选择及训练(每次训练其准确率不同,选择最高)
model.compile(optimizer='rmsprop',#梯度下降算法
loss='categorical_crossentropy',#损失函数会不断下降,交叉熵函数
metrics=['accuracy'])#准确率会不断上升
model.fit(train_images,train_labels,epochs = 20,batch_size = 128,verbose = 2)#训练20轮,每次训练128个数据,
y_pre= model.predict(test_images)#导入测试集进行训练进行验证
?7、查看搭建神经网络
print(model.summary())#对搭建是神经网络进行可视化显示
?
8、 测试集训练
y_pre= model.predict(test_images)#导入测试集进行训练进行验证
9、测试集评价
test_loss,test_accuracy = model.evaluate(test_images,test_labels)#使用evaluate评价函数对测试集的损失函数和准确率进行测试
print("test_loss:",test_loss,"test_accuraccy:",test_accuracy)
?注:使用单层神经网络时,训练集准确率和测试集准确率存在较大差距,这一现象叫过拟合,解决方法是使用正则化,同时Dropout函数随机消除神经元,能够有效解决过拟合现象
10、使用正则化及Dropout对模型进行优化(每次运行时其结果均不同,选择最佳准确率及最佳拟合)
#方法二:优化模型,增加隐藏层,提高学习率
model.add(Dense(128,activation="relu",input_shape=(28*28,)))#出现过拟合问题,使用kernel_constraint进行正则化,降低过拟合程度
model.add(Dense(32,activation="relu"))
regularizers.l1(0.0001)
model.add(Dropout(0.01))#以多少概率让神经元消失功能
model.add(Dense(10,activation="softmax"))
|