TensorFlow(7)卷积神经网络实战(1)(可视化)
生活随笔
收集整理的這篇文章主要介紹了
TensorFlow(7)卷积神经网络实战(1)(可视化)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
基礎理論?
卷積?
卷積核與過濾器的區別
一、獲取數據集
二、設定數據集大小、歸一化
三、構建卷積神經網絡
四、編譯&&訓練
五、模型評估?
六、可視化
1、創建plt圖?
2、獲取各卷積層
3、觀察卷積層
總代碼
卷積神經網絡?
可視化
基礎理論?
????????在實際應用中,攝像頭捕捉到的圖片,主物品往往會偏于一側的位置,甚至有角度的旋轉,這時神經網絡模型對這些圖片的分類就會不準。這時我們引入:卷積神經網絡(CNN)。
????????通過卷積操作縮小了圖像的內容,將模型注意力集中在圖像特定的、明顯的特征上。
????????這種計算對于計算機視覺來說是非常理想的,因為通常情況下,能夠像這樣被突出顯示的特征才是區分一個物品和另一個物品的關鍵。
卷積?
不同的過濾器有不同的效果:
?豎直過濾器(留下豎直線):
?水平過濾器(留下水平線):
卷積核與過濾器的區別
卷積核是二維的,濾波器是三維的(高維,也可能是四維的)
- 卷積核就是由長和寬來指定的,是一個二維的概念。
- 而過濾器是是由長、寬和深度指定的,是一個三維的概念。
- 過濾器可以看做是卷積核的集合。
- 過濾器比卷積核高一個維度——深度。
一、獲取數據集
# 1、獲取數據集
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
二、設定數據集大小、歸一化
卷積期望一個包含所有數據的單一張量,所以要把訓練數據設置為60000x28x28x1的一個4D列表。(如果不這樣做,會在訓練時得到一個錯誤,因為卷積操作將不能識別數據形狀。)?
# 2、設定數據集大小、歸一化
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、構建卷積神經網絡
model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
# Conv2D:卷積層 64:卷積過濾器數量 (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)
?可以發現卷積神經網絡比起前面的DNN神經網絡效果好了不少,但是相應的,時間會比較慢。
六、可視化
1、創建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),觀察神經網絡的前四層(正好對應四個卷積層)(神經網絡共7層)
# test_images[...]:第幾張圖片 x:第幾層
# 第一張圖片卷積神經網絡處理情況f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]a[0,x].imshow(f1[0, : , :, 1]) #1:下標為1的卷積核(第2個卷積核)
# 第二張圖片卷積神經網絡處理情況f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x] a[1,x].imshow(f2[0, : , :, 1])
# 第三張圖片卷積神經網絡處理情況f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]a[2,x].imshow(f3[0, : , :, 1])
總代碼
卷積神經網絡?
import tensorflow as tf
print(tf.__version__)# 1、獲取數據集
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
# 特征訓練集 目標訓練集 特征測試集 目標測試集# 2、設定數據集大小、歸一化
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、構建卷積神經網絡
model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
# Conv2D:卷積層 64:卷積過濾器數量 (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),觀察神經網絡的前四層(正好對應四個卷積層)(神經網絡共7層)
# test_images[...]:第幾張圖片 x:第幾層
# 第一張圖片卷積神經網絡處理情況f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]a[0,x].imshow(f1[0, : , :, 1]) #1:下標為1的卷積核(第2個卷積核)
# 第二張圖片卷積神經網絡處理情況f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x] a[1,x].imshow(f2[0, : , :, 1])
# 第三張圖片卷積神經網絡處理情況f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]a[2,x].imshow(f3[0, : , :, 1])
總結
以上是生活随笔為你收集整理的TensorFlow(7)卷积神经网络实战(1)(可视化)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow(6)神经网络训练(
- 下一篇: TensorFlow(8)卷积神经网络实