卷积神经网络CNN----mnist数据集识别手写数字图像实现

卷积核: 一个n×n的矩阵
感受野: 一个神经元所接受并响应的刺激区域
卷积神经网络(Convolutional Neural Networks): 借助卷积核提取特征后,送入全连接网络

注:

  1. 卷积神经网络采用局部连接权值共享,与全连接神经网络相比更接近生物神经网络,且同一层神经元的权值相同,可以并行学习。
  2. 卷积核中的权值是从数据中学习得到的
  3. 一个卷积核只能提取一个特征,同时提取多个特征就需要同时使用多个卷积核。

神经网络结构: 多层前馈型神经网络[划分为:特征提取阶段、分类识别阶段]

特征提取阶段[卷积、标准化、激活、池化]
卷积层: 特征提取层
每个卷积层包含多个卷积核,用于提取不同特征,每个卷积核都输出一张特征图
常用ReLU函数做激活函数
池化层: 特征映射层
减少数据处理量的同时,保留有用信息。进一步抽象了信息,提高了泛化性,防止过拟合
最大值池化可以提取图片纹理
均值池化可以保留背景特征


mnist数据集识别手写数字图像

import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #run configuration Params 显示中文标签为黑体
#model.summary()查看信息
model=tf.keras.Sequential([
    #unit1
    #16为卷积核的数目,input_shape(samples,rows,cols,channels) 这里是28*28的图像,通道数为1
    tf.keras.layers.Conv2D(16,kernel_size=(3,3),padding="same",activation=tf.nn.relu,input_shape=(28,28,1)),
    tf.keras.layers.MaxPool2D(pool_size=(2,2)),
    
    #unit2 输入为上一层的输出,无需设置形状
    tf.keras.layers.Conv2D(32,kernel_size=(3,3),padding="same",activation=tf.nn.relu),
    tf.keras.layers.MaxPool2D(pool_size=(2,2)),
    
    #unit3 将上一层的输出的三维张量,输出为一维张量
    tf.keras.layers.Flatten(),
    
    #uint4 
    tf.keras.layers.Dense(128,activation="relu"),
    tf.keras.layers.Dense(10,activation="softmax")
])
#卷积层的参数个数=(卷积核长*卷积核宽*通道数+1)*卷积核个数   +1是偏移量,卷积核个数与要找的特征个数有关
#池化层并未引入参数
#全连接层参数个数=(输入维度+1)*神经元个数
(train_x,train_y),(test_x,test_y)=tf.keras.datasets.mnist.load_data()

#归一化,使取值范围在0-1之间,并转化为tensor张量
X_train=tf.cast(train_x,dtype=tf.float32)/255
X_test=tf.cast(test_x,dtype=tf.float32)/255
Y_train=tf.cast(train_y,dtype=tf.int32)
Y_test=tf.cast(test_y,dtype=tf.int32)

#这里的输入的是灰度图像没有通道数(三维),为匹配input_shape(四维),需要增加一个维度
X_train=tf.reshape(X_train,(60000,28,28,1))
X_test=tf.reshape(X_test,(10000,28,28,1))

#optimizer优化器   metrics评测指标
model.compile(optimizer="adam",
             loss="sparse_categorical_crossentropy",
             metrics="sparse_categorical_accuracy")

history=model.fit(X_train,Y_train,batch_size=64,epochs=5,validation_split=0.2)
#model.evaluate(X_test,Y_test,verbose=2) 评估
#存储迭代结果
pd.DataFrame(history.history).to_csv("mnist_training_log.csv",index=False)
#显示曲线
#loss是训练数据的,val_loss是测试数据的,训练时把训练集的20%用于了测试
graph=pd.read_csv("mnist_training_log.csv")
graph.plot(figsize=(8,5))
plt.grid(1) #网格线
plt.xlim(0,4)
plt.ylim(0,1)
plt.show()

#随机抽样测试
plt.figure()
for i in range(10):
    num=np.random.randint(1,10000)
    
    plt.subplot(2,5,i+1)
    plt.axis('off')
    plt.imshow(test_x[num])
    demo=tf.reshape(test_x[num],(1,28,28,1))
    y_pred=np.argmax(model.predict(demo))
    plt.title("标签值:"+str(test_y[num])+"\n预测值:"+str(y_pred))
plt.show()

#存储训练模型
model.save_weights("mnist.h5")
#调用model.load_weights("mnist.h5")


卷积神经网络CNN----mnist数据集识别手写数字图像实现_第1张图片
卷积神经网络CNN----mnist数据集识别手写数字图像实现_第2张图片

卷积神经网络CNN----mnist数据集识别手写数字图像实现_第3张图片

你可能感兴趣的:(人工智能,逻辑回归,机器学习,算法)