卷积神经网络 CNN(Convolutional Neural Network)是一种前馈型的神经网络,通过卷积运算识别图像边缘和纹理,再通过不断的卷积提取出抽象的特征,最终实现图像识别,其在大型图像处理方面有出色的表现,广泛应用到图像分类、定位等领域中,相比于其他神经网络结构,卷积神经网络需要的参数相对较少,被广泛应用。
目录
CNN网络的一般架构
卷积层完成数据的边缘和纹理分析,提取图像特征,假如使用3×3的卷积核对图像进行处理,9个像素点会被转换成1个像素点,非线性变换层即是神经元的激活层,设定神经元传递阈值,池化层是降采样的过程,把图像的像素点变小,全连接层是线性变换层,把有用的特征提取输出,卷积层+非线性变换层+池化层是将图像变小变厚的过程;
卷积层三个重要参数:ksize,strides,padding,分别是卷积核的大小(一般是3*3或者5*5的方阵),卷积核移动的跨度,卷积的边缘处理规则,在notebook中使用shift+tab键查看tensorflow.keras.layers.Cov2d()函数的参数:
Init signature:
tf.keras.layers.Conv2D(
filters,
kernel_size,
strides=(1, 1),
padding='valid',
data_format=None,
dilation_rate=(1, 1),
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs,
)
池化层是一个降采样操作,使得图像变小,有最大化池化,有平均池化等,最大化池化使用MaxPooling2D()函数,函数的参数如下:
Init signature:
tf.keras.layers.MaxPooling2D(
pool_size=(2, 2),
strides=None,
padding='valid',
data_format=None,
**kwargs,
)
CNN实现fashion_MNIST分类
一般cpu无法完成CNN网络计算,这里使用kaggle提供的GPU搭建CNN网络实现fashion_MNIST的分类模型,kaggle是一个数据竞赛平台,里面包含了很多数据挖掘和深度学习的实例和解答方法,是一个极佳的学习平台:https://www.kaggle.com/notebooks/welcome,创建一个notebook,选择GPU加速:
确认开启GPU加速:
卷积神经网络的输入图像是4维,分别是batch个数,图像的长,图像的高,通道数;
import tensorflow as tf
from tensorflow import keras
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
(train_image,train_lable),(test_image,test_lable)=tf.keras.datasets.fashion_mnist.load_data()
train_image.shape
# 将图像维度扩张到4维数据
train_images=np.expand_dims(train_image,-1)
test_images=np.expand_dims(test_image,-1)
train_images.shape
model=tf.keras.Sequential([tf.keras.layers.Conv2D(32,(3,3),input_shape=train_images.shape[1:],activation="relu"),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Conv2D(32,(3,3),activation="relu"),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.GlobalMaxPooling2D(),
tf.keras.layers.Dense(10,activation="softmax")
])
model.summary()
model.compile(optimizer="adam",loss="sparse_categorical_crossentropy",metrics=["acc"])
history=model.fit(train_images,
train_lable,
epochs=5,
validation_data=(test_images,test_lable)
)
model.evaluate(test_images,test_lable)
#plt.plot(history.epoch,history.history.get('loss'))
plt.plot(history.epoch,history.history.get('acc'))
可以看出这个神经网络的构造和参数个数:
准确率作图: