概述
入门深度学习,用TensorFlow搭建卷积神经网络识别数字0~9,采用mnist数据集,参考了其它两三篇博客的内容。
一些相关内容我写在代码注释里面了:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, optimizers, datasets
# 下面一行是在线加载方式获取mnist数据
# mnist = tf.keras.datasets.mnist
# 下面两行是加载本地的数据集(提前从网上下载好)
datapath = r'F:MyDownloadsPyCharm 5.0.3mnist.npz'
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data(datapath)
# 数据预处理,原来x_train是60000*28*28的数据
# 处理之后x_train是60000*28*28*1的数据(黑白单通道)
# y_train是0~9
x_train = x_train.reshape(x_train.shape[0],28,28,1).astype('float32')
x_test = x_test.reshape(x_test.shape[0],28,28,1).astype('float32')
# 归一化
x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)
'''
建立卷积神经网络结构模型:
建立两层卷积层和两层池化层
第一层卷积核个数为16,大小为5*5,same的填充是指输出图像大小与输入一致
第二层卷积核个数为36,以提取更高维度的信息,大小为5*5
一般来说,最大池化层比平均池化层在分类上表现更好
卷积——>ReLU——>池化(以上3层可以叠加多层)——>全连接(可以叠加多层)
一个卷积核可以提取图像的部分特征,选取若干个卷积核。
反向传播:计算卷积核的参数和全连接的权重
'''
'''
Sequential用于建立序列模型
Flatten层展开张量,把feature map都展开
Dense层是全连接层,输出128个神经元,激活函数用relu
Dropout层使用0.5的失活率
再来一个全连接层,输出10个神经元(对应0~9),激活函数使用softmax,得到对各个类别预测的概率
'''
model = keras.models.Sequential([
layers.Conv2D(filters=16, kernel_size=(5,5), padding='same',
input_shape=(28,28,1), activation='relu'),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(filters=36, kernel_size=(5,5), padding='same',
activation='relu'),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Dropout(0.25),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dropout(0.5),
layers.Dense(10,activation='softmax')
])
#打印模型
print(model.summary())
#模型编译及训练
#损失函数使用交叉熵损失函数,优化器使用adam,训练10个epoch和128的batch_size
'''
随机梯度下降:
batch:更新内部模型参数之前处理的样本数,训练数据集可以划分成一个或者多个batch
1个epoch:训练数据集中的所有样本都有机会参与更新内部模型参数,epoch由一个或者多个batch组成
小例子:
训练数据集有200个样本,令batch_size=5,即每个batch有5个样本,则有40个batch。
处理完一个batch的5个样本之后,更新内部模型参数。
1个epoch由40个batch组成,执行完一次epoch,参数更新40次。
epoch数量一般比较大,允许算法运行直到模型的误差非常小
'''
#训练配置
model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam', metrics=['accuracy'])
#开始训练
model.fit(x=x_train, y=y_train, validation_split=0.2, # validation_split是指将一部分作为验证集使用,0.2代表80%的数据作为训练集,20%作为验证集
epochs=10, batch_size=128, verbose=1) # verbose=1代表显示训练过程
# 测试集验证来评估模型,model.evaluate输出计算的损失值和准确度
val_loss, val_acc = model.evaluate(x_test, y_test)
print('Test Loss:{:.6f}'.format(val_loss))
print('Test Acc:{:.6f}'.format(val_acc))
'''
# 绘制图像,查看loss和accr
import matplotlib.pyplot as plt
history = model.fit(...)
plt.plot(history.epoch,history.history['loss'],color='red',label='loss')
plt.plot(history.epoch,history.history['accr'],color='blur',label='accr')
plt.legend()
plt.show()
'''
最后
以上就是愤怒西牛为你收集整理的用TensorFlow搭建卷积神经网络识别数字0~9的全部内容,希望文章能够帮你解决用TensorFlow搭建卷积神经网络识别数字0~9所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复