用TensorFlow搭建卷积神经网络识别数字0~9

入门深度学习,用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:\MyDownloads\PyCharm 5.0.3\mnist.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,卷积,深度学习,机器学习)