嗨大成帶你認識卷積神經(jīng)網(wǎng)絡
動畫
喜歡請關(guān)注我

認識卷積神經(jīng)網(wǎng)絡
首先我們先需要先了解全連接網(wǎng)絡和部分連接網(wǎng)絡的概念。
對于小圖像將每個節(jié)點和隱藏層的每個節(jié)點都是有連接的,小圖像例如8X8的圖像這樣全連接沒有問題。
如果是100X100的那么全連接的輸入特征維10000個輸入單元,?假設我們希望在隱藏層學習100個特征,那么就是10000*100
就是10的6次方的參數(shù),這樣無論是前向和后向傳播都是難以接受。這種方式我們就叫全連接網(wǎng)絡。將這神經(jīng)元全連接的隱藏層叫做全連接網(wǎng)絡(full connect layer),也叫FC層。
為了提升性能,節(jié)省時間,神經(jīng)元之間的連接進行限制,用部分全連接網(wǎng)絡概念。
卷積
CNN,為什么要進行卷積首先,我們把圖像100X100,進行隨機抽取一個小塊,來看看學學這小塊的特征,假設我們抽取的圖像大小為5X5,然后我建立一個更小的3X3的矩陣,3X3的矩陣我們稱為卷積核(kernel),矩陣如圖表示


我們把3X3的卷積核從5X5的第一個位置開始滑動,比如我們將這個卷積放在(1,1)點,然后計算卷積核和圖像的每個像素的值得乘積,并且求和:下面為公式,所以3X3的卷積核在5X5的第一個(1,1)的元素,每個元素的乘積和為4 結(jié)果為,按照卷積核繼續(xù)右移動,乘積的和為3,依次類推所有的卷積核的乘積和的值為4


通過卷積核的運算,100X100的圖像,學習特征維5X5的,假設隱藏層具有100個隱含單元,那么100X100的圖像抽取的卷積特征維96X96,那么卷積到底什么意義?比如辨別一個圖像是否一個人,我們可以判斷人的輪廓,臉,腳身體等,如果都具備這些特征,我們可以確定為一個人,卷積核都是人工事先設定,是經(jīng)過算法設計人員精心設計的,他們發(fā)現(xiàn)這樣就可以設計的卷積核突出某個什么樣的特征。
池化(Pooling)
我們希望對一個圖像100*100進行卷積,如果使用5X5的卷積核進行計算,假設要學習250個特征
(100+5-1)X(100+5-1)的特征,最終特征數(shù)量為96X96*250個,這個計算效率不理想。
為此,我們需要優(yōu)化,可以想到的平時統(tǒng)計分析的時候常用需要一個數(shù)值來計算統(tǒng)計。我們可以用求區(qū)域內(nèi)最大值或者平均值,使用統(tǒng)計特征而不是通過原始特征來降低特征維度,最后還可以改善訓練結(jié)果,防止過擬合,我們把統(tǒng)計聚和的方法叫做‘池化’
卷積神經(jīng)網(wǎng)絡結(jié)構(gòu)圖

首先是輸入層,接著是卷積層,池化層,全連接層,最后是分類器做輸出。卷積神經(jīng)網(wǎng)絡代表就是CNN

代碼
from __future__ import print_function import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras import backend as K import matplotlib.pyplot as plt import tensorflow as tf import datetime batch_size = 128 num_classes = 10 epochs = 12 # input image dimensions img_rows, img_cols = 28, 28 #the data, split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() if K.image_data_format() == 'channels_first': ? ?x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols) ? ?x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols) ? ?input_shape = (1, img_rows, img_cols) else: ? ?x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1) ? ?x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1) ? ?input_shape = (img_rows, img_cols, 1) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 print('x_train shape:', x_train.shape) print(x_train.shape[0], 'train samples') print(x_test.shape[0], 'test samples') # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), ? ? ? ? ? ? ? ? activation='relu', ? ? ? ? ? ? ? ? input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(num_classes, activation='softmax')) model.summary() model.compile(loss=keras.losses.categorical_crossentropy, ? ? ? ? ? ? ?optimizer=keras.optimizers.Adadelta(), ? ? ? ? ? ? ?metrics=['accuracy']) history=model.fit(x_train, y_train, ? ? ? ? ?batch_size=batch_size, ? ? ? ? ?epochs=epochs, ? ? ? ? ?verbose=1, ? ? ? ? ?validation_data=(x_test, y_test)) score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] loss = history.history['loss'] val_loss = history.history['val_loss'] epochs_range = range(epochs) plt.figure(figsize=(8, 8)) plt.subplot(1, 2, 1) plt.plot(epochs_range, acc, label='Training Accuracy') plt.plot(epochs_range, val_acc, label='Validation Accuracy') plt.legend(loc='lower right') plt.title('Training and Validation Accuracy') plt.subplot(1, 2, 2) plt.plot(epochs_range, loss, label='Training Loss') plt.plot(epochs_range, val_loss, label='Validation Loss') plt.legend(loc='upper right') plt.title('Training and Validation Loss') plt.show()
Summary的Model值各個層的參數(shù)
_________________________________________________________________
Layer (type) ? ? ? ? ? ? ? ? Output Shape ? ? ? ? ? ? ?Param # ??
=================================================================
conv2d_1 (Conv2D) ? ? ? ? ? ?(None, 26, 26, 32) ? ? ? ?320 ? ? ? ? ?
_________________________________________________________________
conv2d_2 (Conv2D) ? ? ? ? ? ?(None, 24, 24, 64) ? ? ? ?18496 ? ??
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 12, 12, 64) ? ? ? ?0 ? ? ? ??
_________________________________________________________________
dropout_1 (Dropout) ? ? ? ? ?(None, 12, 12, 64) ? ? ? ?0 ? ? ? ??
_________________________________________________________________
flatten_1 (Flatten) ? ? ? ? ?(None, 9216) ? ? ? ? ? ? ?0 ? ? ? ??
_________________________________________________________________
dense_1 (Dense) ? ? ? ? ? ? ?(None, 128) ? ? ? ? ? ? ? 1179776 ??
_________________________________________________________________
dropout_2 (Dropout) ? ? ? ? ?(None, 128) ? ? ? ? ? ? ? 0 ? ? ? ??
_________________________________________________________________
dense_2 (Dense) ? ? ? ? ? ? ?(None, 10) ? ? ? ? ? ? ? ?1290 ? ? ?
=================================================================
Total params: 1,199,882
Trainable params: 1,199,882
Non-trainable params: 0
訓練和驗證圖
