MNIST识别分类网络实现
程序员文章站
2023-12-30 19:08:52
...
MNIST识别分类程序
本文
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
#载入数据
(x_train, y_train),(x_test, y_test) = mnist.load_data('/home/n3/PycharmProjects/keras_study/mnist.npz')
#(60000, 28, 28)
print(x_train.shape)
#(60000,)
print(y_train.shape)
#数据格式转换->(60000, 784),使用-1表示可以定为任意值,除以255.0是为了进行归一化
x_train =x_train.reshape(x_train.shape[0], -1)/255.0
x_test =x_test.reshape(x_test.shape[0], -1)/255.0
#将label转换为 one hot 格式
y_train =np_utils.to_categorical(y_train, num_classes=10)
y_test =np_utils.to_categorical(y_test, num_classes=10)
#创建模型,输入为784个神经元,输出为10个神经元
model = Sequential([Dense(units=10, input_dim=784, bias_initializer='one', activation='softmax')])
#定义优化器
sgd = SGD(lr= 0.2)
#metrics可以用来在编译过程中计算准确率
model.compile(optimizer=sgd, loss='mse',metrics=['accuracy'])
#使用model.fit进行训练
model.fit(x_train, y_train, batch_size=32, epochs=10)
# 评估模型
loss , accuracy = model.evaluate(x_test,y_test)
print('loss:',loss)
print('accuracy:',accuracy)
结果
loss: 0.013015691758366301
accuracy: 0.9186000227928162
交叉熵
将loss函数变为categorical_crossentropy,交叉熵其收敛速率比较快
结果比较有了少量的提升
loss: 0.28222181722521783
accuracy: 0.9215999841690063
Dropout
在程序中需要添加隐藏层层数才能使用Dropout
#创建模型,要使用Dropout,需要添加隐藏层层数,softmax一般出现在网络最后一层
#包含两个隐藏层
model = Sequential([Dense(units=200, input_dim=784, bias_initializer='one', activation='tanh'),
Dense(units=100, bias_initializer='one', activation='tanh'),
Dense(units=10, bias_initializer='one', activation='softmax')
])
最后结果,出现过拟合:
1:loss: 0.05595934414237272
1:accuracy: 0.9817000031471252
2:loss: 0.005265787925516876
2:accuracy: 0.9993500113487244
#创建模型,要使用Dropout,需要添加隐藏层层数,softmax一般出现在网络最后一层
#包含两个隐藏层
model = Sequential([Dense(units=200, input_dim=784, bias_initializer='one', activation='tanh'),
Dropout(0.4),
Dense(units=100, bias_initializer='one', activation='tanh'),
Dropout(0.4),
Dense(units=10, bias_initializer='one', activation='softmax')
])
结果:此例子没有提升效果,虽然准确率降低,但是两个准确率比较接近,防止了过拟合
1:loss: 0.10907337165195495
1:accuracy: 0.9699000120162964
2:loss: 0.07446787966905782
2:accuracy: 0.977649986743927
正则化
在keras中,层级设置包括kernel_regularizer(权值正则化项),bias_regularizer(偏置值正则化项),activity_regularizer(**函数正则化项),一般设置kernel_regularizer
可以部分防止过拟合,当数据比较复杂时,可以添加正则化项,来进行归一处理,可以得到更好的值
#创建模型,要使用Dropout,需要添加隐藏层层数,softmax一般出现在网络最后一层
#包含两个隐藏层
model = Sequential([Dense(units=200, input_dim=784, bias_initializer='one', activation='tanh',kernel_regularizer=l2(0.0003)),
Dense(units=100, bias_initializer='one', activation='tanh'),
Dense(units=10, bias_initializer='one', activation='softmax')
])
结果:
1:loss: 0.11881063914299012
1:accuracy: 0.9772999882698059
推荐阅读
-
MNIST识别分类网络实现
-
基于muist数据集的maxout网络实现分类 ----代码分享
-
BP神经网络手写数字识别软件EasyOCR 1.2.0发布,新增MNIST数据集图片和宽幅数字识别 神经网络人工智能BP神经网络手写数字识别OCR
-
无法访问 您可能没有权限使用网络资源 帖几个PHP的无限分类实现想法~
-
使用PyTorch实现MNIST手写体识别代码
-
人脸检测识别opencv+python实现(Haar分类器)
-
PyTorch上搭建简单神经网络实现回归和分类的示例
-
(sklearn:Logistic回归)和(keras:全连接神经网络)完成mnist手写数字分类
-
Python通过TensorFlow卷积神经网络实现猫狗识别
-
tensorflow使用神经网络实现mnist分类