TensorFlow(7)卷积神经网络实战(1)(可视化)
目錄
基礎(chǔ)理論?
卷積?
卷積核與過濾器的區(qū)別
一、獲取數(shù)據(jù)集
二、設(shè)定數(shù)據(jù)集大小、歸一化
三、構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)
四、編譯&&訓(xùn)練
五、模型評估?
六、可視化
1、創(chuàng)建plt圖?
2、獲取各卷積層
3、觀察卷積層
總代碼
卷積神經(jīng)網(wǎng)絡(luò)?
可視化
基礎(chǔ)理論?
????????在實際應(yīng)用中,攝像頭捕捉到的圖片,主物品往往會偏于一側(cè)的位置,甚至有角度的旋轉(zhuǎn),這時神經(jīng)網(wǎng)絡(luò)模型對這些圖片的分類就會不準(zhǔn)。這時我們引入:卷積神經(jīng)網(wǎng)絡(luò)(CNN)。
????????通過卷積操作縮小了圖像的內(nèi)容,將模型注意力集中在圖像特定的、明顯的特征上。
????????這種計算對于計算機視覺來說是非常理想的,因為通常情況下,能夠像這樣被突出顯示的特征才是區(qū)分一個物品和另一個物品的關(guān)鍵。
卷積?
不同的過濾器有不同的效果:
?豎直過濾器(留下豎直線):
?水平過濾器(留下水平線):
卷積核與過濾器的區(qū)別
卷積核是二維的,濾波器是三維的(高維,也可能是四維的)
- 卷積核就是由長和寬來指定的,是一個二維的概念。
- 而過濾器是是由長、寬和深度指定的,是一個三維的概念。
- 過濾器可以看做是卷積核的集合。
- 過濾器比卷積核高一個維度——深度。
一、獲取數(shù)據(jù)集
# 1、獲取數(shù)據(jù)集
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
二、設(shè)定數(shù)據(jù)集大小、歸一化
卷積期望一個包含所有數(shù)據(jù)的單一張量,所以要把訓(xùn)練數(shù)據(jù)設(shè)置為60000x28x28x1的一個4D列表。(如果不這樣做,會在訓(xùn)練時得到一個錯誤,因為卷積操作將不能識別數(shù)據(jù)形狀。)?
# 2、設(shè)定數(shù)據(jù)集大小、歸一化
training_images=training_images.reshape(60000, 28, 28, 1)
training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images/255.0
三、構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)
# 3、構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)
model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
# Conv2D:卷積層 64:卷積過濾器數(shù)量 (3,3):卷積核大小tf.keras.layers.MaxPooling2D(2, 2),
# 池化層tf.keras.layers.Conv2D(64, (3,3), activation='relu'),tf.keras.layers.MaxPooling2D(2,2),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(10, activation='softmax')
])
四、編譯&&訓(xùn)練
# 4、編譯&&訓(xùn)練
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
# 輸出模型各層的影響
model.summary()
五、模型評估?
# 5、模型評估
test_loss = model.evaluate(test_images, test_labels)
?可以發(fā)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)比起前面的DNN神經(jīng)網(wǎng)絡(luò)效果好了不少,但是相應(yīng)的,時間會比較慢。
六、可視化
1、創(chuàng)建plt圖?
import matplotlib.pyplot as plt# plt圖
f, a = plt.subplots(3, 4)
# f:子圖像 a:array列表 3:行 4:列
2、獲取各卷積層
# 各卷積層
from tensorflow.keras import models
layer_outputs = [layer.output for layer in model.layers]
print(layer_outputs)
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
# 輸入層 輸出層
3、觀察卷積層
# 抽3個圖片(FIRST、SECOND、THIRD),觀察神經(jīng)網(wǎng)絡(luò)的前四層(正好對應(yīng)四個卷積層)(神經(jīng)網(wǎng)絡(luò)共7層)
# test_images[...]:第幾張圖片 x:第幾層
# 第一張圖片卷積神經(jīng)網(wǎng)絡(luò)處理情況f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]a[0,x].imshow(f1[0, : , :, 1]) #1:下標(biāo)為1的卷積核(第2個卷積核)
# 第二張圖片卷積神經(jīng)網(wǎng)絡(luò)處理情況f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x] a[1,x].imshow(f2[0, : , :, 1])
# 第三張圖片卷積神經(jīng)網(wǎng)絡(luò)處理情況f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]a[2,x].imshow(f3[0, : , :, 1])
總代碼
卷積神經(jīng)網(wǎng)絡(luò)?
import tensorflow as tf
print(tf.__version__)# 1、獲取數(shù)據(jù)集
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
# 特征訓(xùn)練集 目標(biāo)訓(xùn)練集 特征測試集 目標(biāo)測試集# 2、設(shè)定數(shù)據(jù)集大小、歸一化
training_images=training_images.reshape(60000, 28, 28, 1)
training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images/255.0# 3、構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)
model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
# Conv2D:卷積層 64:卷積過濾器數(shù)量 (3,3):卷積核大小tf.keras.layers.MaxPooling2D(2, 2),
# 池化層tf.keras.layers.Conv2D(64, (3,3), activation='relu'),tf.keras.layers.MaxPooling2D(2,2),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(10, activation='softmax')
])# 4、編譯&&運行
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
# 輸出模型各層的影響
model.summary()# 5、模型評估
test_loss = model.evaluate(test_images, test_labels)
可視化
# 卷積、池化過程可視化
import matplotlib.pyplot as plt# plt圖
f, a = plt.subplots(3, 4)
# f:子圖像 a:array列表 3:行 4:列# 隨機選取可視化的圖片
FIRST_IMAGE=0
SECOND_IMAGE=7
THIRD_IMAGE=26# 各卷積層
from tensorflow.keras import models
layer_outputs = [layer.output for layer in model.layers]
print(layer_outputs)
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
# 輸入層 輸出層# 按行可視化
for x in range(0,4):
# 觀察卷積層(7個層輸出,這里只取了四個卷積層)f = activation_model.predict(test_images[0].reshape(1, 28, 28, 1))print(len(f))# 抽3個圖片(FIRST、SECOND、THIRD),觀察神經(jīng)網(wǎng)絡(luò)的前四層(正好對應(yīng)四個卷積層)(神經(jīng)網(wǎng)絡(luò)共7層)
# test_images[...]:第幾張圖片 x:第幾層
# 第一張圖片卷積神經(jīng)網(wǎng)絡(luò)處理情況f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]a[0,x].imshow(f1[0, : , :, 1]) #1:下標(biāo)為1的卷積核(第2個卷積核)
# 第二張圖片卷積神經(jīng)網(wǎng)絡(luò)處理情況f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x] a[1,x].imshow(f2[0, : , :, 1])
# 第三張圖片卷積神經(jīng)網(wǎng)絡(luò)處理情況f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]a[2,x].imshow(f3[0, : , :, 1])
總結(jié)
以上是生活随笔為你收集整理的TensorFlow(7)卷积神经网络实战(1)(可视化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow(6)神经网络训练(
- 下一篇: TensorFlow(8)卷积神经网络实