前言:记录一下自己写的第一个神经网络,相当于人工智能的hello world程序吧,也是记录一下Keras的基本用法,方便以后查阅也希望对深度学习初学者有所帮助!
手写数字识别
导入模块
from keras.models import Sequential
from keras.layers.core import Dense,Activation
from keras.optimizers import Adam,SGD
from keras.datasets import mnist
from keras.utils import np_utils
导入手写数字识别数据集
(x_train, y_train),(x_test, y_test) = mnist.load_data() #从Keras自带的数据集里面下载mnist手写数字数据集
x_train = x_train.reshape(x_train.shape[0],28*28).astype('float32') #把28*28的图片矩阵数据转换为向量
x_test = x_test.reshape(x_test.shape[0],28*28).astype('float32')
y_train = np_utils.to_categorical(y_train, 10) #把y转换为长为10的向量,手写数字是什么第几个就为1,其他元素为0
y_test = np_utils.to_categorical(y_test, 10)
x_train = x_train / 255 #降低图片数据的灰度值,便于训练
x_test = x_test /255
print(y_test)
[[0. 0. 0. ... 1. 0. 0.]
[0. 0. 1. ... 0. 0. 0.]
[0. 1. 0. ... 0. 0. 0.]
...
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]]
建立Sequential模型
- Sequential是一系列网络层按顺序构成的栈
model = Sequential()
通过 .add方法构建网络层
##首先添加第一个输入层,要指定层类型:Dense(全连接),输入个数:input_dim,输出个数:units,激活函数:activation
model.add(Dense(input_dim=28*28, units=500, activation='relu')) #第一层
##添加隐藏层,从第二层开始不需要指定输入个数,只需要输出个数就行,也需要指定激活函数
model.add(Dense(units=500, activation='relu'))
##如果隐藏层添加完了就可以添加最后的输出层了,指定输出个数,由于是分类问题,这里可以使用softmax作为激活函数
model.add(Dense(units=10, activation='softmax')) #建立输出层
使用.compile()方法来编译模型
- 当构建完模型后,我们需要使用.compile()方法来编译模型
- loss:定义一个损失函数,常用交叉熵categorical_crossentropy,均方误差mse等
- optimizer:优化器,常用随机梯度下降法SGD、Adam等
model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
使用 .fit( )方法训练数据
- x_train,y_train :训练数据集
- batch_size :指定一个size表示每次更新一次参数需要从训练集中随机抽取多少个样本,一般越大速度越快
- epochs :每次使用完所有的训练数据集表示一次epoch
model.fit(x_train, y_train, batch_size=500, epochs=5)
Epoch 1/5
60000/60000 [==============================] - 6s 105us/step - loss: 0.0021 - acc: 0.9998
Epoch 2/5
60000/60000 [==============================] - 7s 112us/step - loss: 0.0017 - acc: 0.9999
Epoch 3/5
60000/60000 [==============================] - 6s 98us/step - loss: 0.0014 - acc: 0.9999
Epoch 4/5
60000/60000 [==============================] - 6s 99us/step - loss: 0.0012 - acc: 1.0000
Epoch 5/5
60000/60000 [==============================] - 6s 101us/step - loss: 0.0010 - acc: 1.0000
<keras.callbacks.History at 0xe82b550>
可以看到结果acc表示在training data上准确度达到100%
使用 .evaluate( )方法计算模型在测试数据集上的效果
result_test = model.evaluate(x_test, y_test, batch_size=500)
print('\nTest Acc:', result_test[1])
10000/10000 [==============================] - 0s 37us/step
Test Acc: 0.9867000043392181
在测试数据集的准确度也达到了98.67%,说明没有过拟合,模型效果不错