一、CNN(Convolution Neural Networks)
卷積神經網絡基本思想:識別物體的特征,來進行判斷物體
卷積Convolution:過濾器filter中的數值與圖片像素值對應相乘再相加,6 * 6卷積一次(步數為1)變成4 * 4
Max Pooling:對卷積之后的4 * 4圖像,分區選取最大值(2*2選取),變成 2 * 2;
Max Pooling作用是增強特征,減少數據
Ⅰ卷積
原圖
豎直過濾器最終效果
垂直過濾器最終效果
ⅡMax Pooling
Max Pooling之后尺寸減小為原來的一半
ⅢCNN卷積神經網絡就是卷積+Max Pooling
二、全連接和卷積網絡比較
傳統的全連接網絡
全連接網絡 loss: 0.2400 - acc: 0.9113
from tensorflow import keras
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as npfashion_mnist = keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels) = fashion_mnist.load_data()
model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(128,activation=tf.nn.relu))
model.add(keras.layers.Dense(10,activation=tf.nn.softmax))train_images_y = train_images/255
#model.compile(optimizer=tf.optimizers.Adam(),loss=tf.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
#optimizer="adam",loss="sparse_categorical_crossentropy",metrics=[`'accuracy']
model.compile(optimizer="adam",loss="sparse_categorical_crossentropy",metrics=['accuracy'])model.fit(train_images_y,train_labels,epochs=10)
"""
Epoch 1/10
60000/60000 [==============================] - 2s 38us/sample - loss: 0.4977 - acc: 0.8257
Epoch 2/10
60000/60000 [==============================] - 2s 41us/sample - loss: 0.3779 - acc: 0.8637
Epoch 3/10
60000/60000 [==============================] - 2s 39us/sample - loss: 0.3390 - acc: 0.8762
Epoch 4/10
60000/60000 [==============================] - 2s 39us/sample - loss: 0.3158 - acc: 0.8847
Epoch 5/10
60000/60000 [==============================] - 2s 39us/sample - loss: 0.2971 - acc: 0.8899
Epoch 6/10
60000/60000 [==============================] - 2s 39us/sample - loss: 0.2829 - acc: 0.8963
Epoch 7/10
60000/60000 [==============================] - 2s 39us/sample - loss: 0.2702 - acc: 0.8999
Epoch 8/10
60000/60000 [==============================] - 2s 38us/sample - loss: 0.2584 - acc: 0.9035
Epoch 9/10
60000/60000 [==============================] - 2s 39us/sample - loss: 0.2507 - acc: 0.9059
Epoch 10/10
60000/60000 [==============================] - 2s 39us/sample - loss: 0.2400 - acc: 0.9113
"""
卷積神經網絡
卷積神經網絡 loss: 0.0964 - acc: 0.9640
from tensorflow import keras
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as npfashion_mnist = keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels) = fashion_mnist.load_data()
model = keras.Sequential()model.add(keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(28,28,1)))
model.add(keras.layers.MaxPooling2D(2,2))
model.add(keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(28,28,1)))
model.add(keras.layers.MaxPooling2D(2,2))model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(128,activation=tf.nn.relu))
model.add(keras.layers.Dense(10,activation=tf.nn.softmax))train_images_y = train_images/255
#model.compile(optimizer=tf.optimizers.Adam(),loss=tf.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
#optimizer="adam",loss="sparse_categorical_crossentropy",metrics=[`'accuracy']
model.compile(optimizer="adam",loss="sparse_categorical_crossentropy",metrics=['accuracy'])model.fit(train_images_y.reshape(-1,28,28,1),train_labels,epochs=10)
"""
Epoch 1/10
60000/60000 [==============================] - 43s 710us/sample - loss: 0.4380 - acc: 0.8408
Epoch 2/10
60000/60000 [==============================] - 41s 682us/sample - loss: 0.2923 - acc: 0.8920
Epoch 3/10
60000/60000 [==============================] - 41s 680us/sample - loss: 0.2485 - acc: 0.9082
Epoch 4/10
60000/60000 [==============================] - 41s 681us/sample - loss: 0.2164 - acc: 0.9190
Epoch 5/10
60000/60000 [==============================] - 41s 681us/sample - loss: 0.1886 - acc: 0.9297
Epoch 6/10
60000/60000 [==============================] - 41s 680us/sample - loss: 0.1654 - acc: 0.9376
Epoch 7/10
60000/60000 [==============================] - 41s 686us/sample - loss: 0.1462 - acc: 0.9446
Epoch 8/10
60000/60000 [==============================] - 41s 681us/sample - loss: 0.1254 - acc: 0.9525
Epoch 9/10
60000/60000 [==============================] - 42s 706us/sample - loss: 0.1115 - acc: 0.9579
Epoch 10/10
60000/60000 [==============================] - 47s 780us/sample - loss: 0.0964 - acc: 0.9640
"""
很明顯,CNN要比傳統的全連接網絡正確率高,損失函數值小,但訓練時間長
三、分析卷積神經網絡
在卷積神經網絡訓練的基礎上,看下網絡結構
七層!!!
Output Shape
原始圖像像素為28 * 28,這里的過濾器為3 * 3的卷積核,故
第一層圖像變成了26 * 26,64為64個卷積核(過濾器),經過一次卷積之后,一張圖像就變成了64張圖像了
第二層,將圖像變為原來的四分之一,長寬各減半,變成了13 * 13
第三層,卷積層,卷積核3 * 3,去掉2個像素點,變成11 * 11的圖像
第四層,將圖像變為原來的四分之一,長寬各減半,變成了5 * 5
第五層,flatten將所有像素進行展平,5 * 5 * 64=1600
Param參數
第一層,33的卷積核(過濾器)有64個,33*64=576,每一個都還有一個bias,故576+64=640個參數
第二層沒有調整參數,只是變化了尺寸,故參數為0
第三層,接第一層的576個參數,與本身的64個卷積核連接,576 * 64=36864,再加上每一個的bias,36864 + 64=36928
第四層沒有調整參數,只是變化了尺寸,故參數為0
第五層,展平操作,就是把所有的像素點值都展成一行,沒有調整參數,只是尺寸變化了而已,故參數為0
第六層,代碼設置的就是128個神經元,故與上一層進行全連接操作,1600 * 128=204800,再加上每一個都有一個bias,故204800 + 128 = 204928
第七層,就是10分類而已,上一層128個神經元與這10個神經元全排列,128 * 10 =1280,在加上每個的bias,1280+10=1290
model.summary()
"""
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_2 (Conv2D) (None, 26, 26, 64) 640
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 13, 13, 64) 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 11, 11, 64) 36928
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 5, 5, 64) 0
_________________________________________________________________
flatten_2 (Flatten) (None, 1600) 0
_________________________________________________________________
dense_4 (Dense) (None, 128) 204928
_________________________________________________________________
dense_5 (Dense) (None, 10) 1290
=================================================================
Total params: 243,786
Trainable params: 243,786
Non-trainable params: 0
_________________________________________________________________
"""
四、詳細查看各層網絡
對測試集中第一張圖像進行七層網絡分析
test_images_y = test_images/255#因為前面訓練的時候對訓練圖像進行了歸一化操作,故測試的時候也需要對測試圖像進行歸一化操作
layer_outputs = [layer.output for layer in model.layers]
activation_model = tf.keras.models.Model(inputs=model.input,outputs=layer_outputs)
pred = activation_model.predict(test_images_y[0].reshape(1,28,28,1))#這里對第一張圖像進行測試
pred
預測的結果包括七層網絡的結果
len(pred)
"""
7
"""
pred[第幾層網絡0-6一共七層][0,:,:,第幾個卷積核1-64一共64個卷積核]
第一層網絡,卷積層的shape
pred[0].shape
"""
(1, 26, 26, 64)
"""
第一個0表示第一層,卷積層
第二個0是畫圖用的,必須為0
:,:表示展示圖片的所有信息
第一個1表示第一個卷積核(過濾器)
pred[0][0,:,:,1]
第一層—卷積層
看下第一層的使用第一個卷積核(共64個卷積核),生成的圖像
plt.imshow(pred[0][0,:,:,1])
看下第一層的使用第二個卷積核(共64個卷積核),生成的圖像
plt.imshow(pred[0][0,:,:,2])
第二層—Max Polling層
看下第二層的使用第一個卷積核(共64個卷積核),生成的圖像
plt.imshow(pred[1][0,:,:,1])
看下第二層的使用第二個卷積核(共64個卷積核),生成的圖像
plt.imshow(pred[1][0,:,:,2])
總結
卷積層26*26,到Max Polling層變成了13 * 13
且Max Polling層物體的特征更加明顯了