"""卷积神经网络:
Dense层从输入空间中学到的是全局模式(全局模式就是涉及所有像素)
Conv层学到的是局部模式,卷积小窗口中发现的模式
卷积网络具有的性质:
1.平移不变性:
比如:在图像右下角学习到这种模式,在图像的其他任何位置都可以识别这个模式
2.可以学习到模式的空间层次结构:
后一层卷积可以将前一层卷积学习到的较小局部特征组合成更大的特征,从微小--宏观
池化操作:
池化操作是对图像进行下采样,通常有最大池化和平均池化
常见池化操作起始就是将图像尺寸缩小一倍,此时池化层相当于卷积核大小为(2,2),步长为2的卷积操作
为什么要使用池化操作:
①对图像进行下采样,可以减少需要处理特征图元素的个数,减小模型参数,使其不容易发生过拟合
②可以让连续卷积层观察的窗口越来越大(即窗口覆盖原始输入的比例越来越大),从而引入空间过滤器的层级结构
如不加池化层,卷积核大小假设为3*3,则第三层3*3的窗口只会覆盖原始输入7*7的窗口包含的信息
"""
"""keras构建卷积神将网络用于手写数字识别"""
from tensorflow.keras import layers
from tensorflow.keras import models
model=models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(28,28,1)))
model.add(layers.MaxPool2D((2,2)))
model.add(layers.Conv2D(64,(3,3),activation="relu"))
model.add(layers.MaxPool2D((2,2)))
model.add(layers.Conv2D(64,(3,3),activation="relu"))
model.add(layers.Flatten())
model.add(layers.Dense(64,activation="relu"))
model.add(layers.Dense(10,activation="softmax"))
"""数据加载,keras自带的手写数字识别"""
from tensorflow.keras.datasets import mnist
import numpy as np
from tensorflow.keras.utils import to_categorical
(train_data,train_labels),(test_data,test_labels)=mnist.load_data()
"""数据预处理:
数据输入格式转化为[num,h,w,c],数据类型转为float,并将灰度值归一化
数据标签进行one-hot编码,如果损失函数采用categorical_crossentropy"""
train_data=train_data.reshape(60000,28,28,1)
train_data=train_data.astype("float32")/255.0
test_data=test_data.reshape(10000,28,28,1)
test_data=test_data.astype("float32")/255.0
train_labels=to_categorical(train_labels)
test_labels=to_categorical(test_labels)
"""配置学习过程"""
from tensorflow.keras import optimizers
from tensorflow.keras import losses
model.compile(optimizer=optimizers.RMSprop(),loss="categorical_crossentropy",metrics=["acc"])
model.fit(train_data,train_labels,batch_size=64,epochs=5)
test_loss,test_acc=model.evaluate(test_data,test_labels)
print("test_acc:",test_acc)