卷积核: 一个n×n的矩阵
感受野: 一个神经元所接受并响应的刺激区域
卷积神经网络(Convolutional Neural Networks): 借助卷积核提取特征后,送入全连接网络
注:
神经网络结构: 多层前馈型神经网络[划分为:特征提取阶段、分类识别阶段]
特征提取阶段[卷积、标准化、激活、池化]
卷积层: 特征提取层
每个卷积层包含多个卷积核,用于提取不同特征,每个卷积核都输出一张特征图
常用ReLU函数做激活函数
池化层: 特征映射层
减少数据处理量的同时,保留有用信息。进一步抽象了信息,提高了泛化性,防止过拟合
最大值池化可以提取图片纹理
均值池化可以保留背景特征
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")