卷積神經網絡 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'))
可以看出這個神經網絡的構造和參數個數:
準確率作圖: