數據挖掘算法和實踐(十四):kaggle上搭建卷積神經網絡(CNN)實現fashion_MNIST

卷積神經網絡 CNN(Convolutional Neural Network)是一種前饋型的神經網絡,通過卷積運算識別圖像邊緣和紋理,再通過不斷的卷積提取出抽象的特徵,最終實現圖像識別,其在大型圖像處理方面有出色的表現,廣泛應用到圖像分類、定位等領域中,相比於其他神經網絡結構,卷積神經網絡需要的參數相對較少,被廣泛應用。

目錄

 CNN網絡的一般架構

CNN實現fashion_MNIST分類


 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'))

可以看出這個神經網絡的構造和參數個數:

準確率作圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章