TensorFlow(8)卷积神经网络实战(2)手写卷积池化
生活随笔
收集整理的這篇文章主要介紹了
TensorFlow(8)卷积神经网络实战(2)手写卷积池化
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
一、獲取并繪制圖像
二、手寫卷積
1、設(shè)置卷積核及權(quán)重
2、卷積
2-1、卷積實現(xiàn)
2-2、 限值
2-3、圖像賦值
2-4、顯示
?卷積代碼
三、手寫池化
1、創(chuàng)建圖像
2、遍歷池化
3、顯示圖像
池化代碼
總代碼
一、獲取并繪制圖像
import cv2
import numpy as np# 從scipy庫中獲取名為"上升"的圖像。這是一張漂亮的內(nèi)置圖片,有很多角度和線條
from scipy import misc
image = misc.ascent() #獲取圖像
width,height = image.shape #獲取圖像寬高# 繪制圖像(灰度圖)
import matplotlib.pyplot as plt
plt.imshow(image)
plt.gray()
plt.show()
?
二、手寫卷積
1、設(shè)置卷積核及權(quán)重
如果過濾器中的所有數(shù)字加起來不是0或1,那么就應(yīng)該設(shè)置權(quán)重,讓過濾器的總和為0或1。
例如,如果過濾器是1,1,1,1,2,1,1,1,1。
它們加起來是10,所以可以設(shè)置0.1的權(quán)重,使它標(biāo)準(zhǔn)化。??
# 設(shè)置卷積核及權(quán)重
filter = [ [-1, -2, -1], [0, 0, 0], [1, 2, 1]]
weight = 1
?
2、卷積
# 卷積
# 對圖像每行每列分別卷積(除去最外層)
for x in range(1, width-1):for y in range(1, height-1):
2-1、卷積實現(xiàn)
# 實現(xiàn)卷積# convolution += 圖像列元素*卷積核行元素convolution = 0.0for i in range(3):for j in range(3):convolution += image[x-1+j, y-1+i]*filter[i][j]convolution *= weight
2-2、 限值
# 限值if convolution > 255:convolution = 255elif convolution <0:convolution = 0
?
2-3、圖像賦值
注:不能直接對原圖賦值:被賦值后,原圖會發(fā)生改變,后面還要用原圖做卷積。?
# 圖像賦值copy[x][y] = convolution
如果直接對原圖賦值,得到的就是這種圖像:
?
2-4、顯示
# 顯示灰度圖
plt.imshow(copy)
plt.show()
?
?卷積代碼
# 手寫實現(xiàn)圖像卷積
# 設(shè)置卷積核及權(quán)重
copy = image.copy()
filter = [ [-1, -2, -1], [0, 0, 0], [1, 2, 1]]
weight = 1
# 如果過濾器中的所有數(shù)字加起來不是0或1,那么就應(yīng)該設(shè)置權(quán)重,讓過濾器的總和為0或1。
# 例如,如果過濾器是1,1,1,1,2,1,1,1,1。
# 它們加起來是10,所以可以設(shè)置0.1的權(quán)重,使它標(biāo)準(zhǔn)化。# 卷積
for x in range(1, width-1):for y in range(1, height-1):# 實現(xiàn)卷積(圖像對應(yīng)位置 分別乘 卷積核對應(yīng)位置)convolution = 0.0for i in range(3):for j in range(3):# 列和行分別對應(yīng)相乘convolution += image[x-1+j, y-1+i]*filter[i][j]convolution *= weight# 限值if convolution > 255:convolution = 255elif convolution <0:convolution = 0# 圖像賦值copy[x][y] = convolution# 顯示灰度圖
plt.gray()
plt.grid(False)
plt.imshow(copy)
#plt.axis('off')
plt.show()
三、手寫池化
在減小圖像數(shù)據(jù)量的同時,保留圖像的特征。?
1、創(chuàng)建圖像
# 創(chuàng)建圖像(大小為原圖的1/4)
new_image2 = np.zeros((int(width/2), int(height/2)))
2、遍歷池化
在:本像素、右像素、下像素、右下像素等四個像素中,選取一個最大值,作為縮小后的新圖像當(dāng)前位置值。?
# 遍歷池化(步長為2)
for x in range(0, width, 2):for y in range(0, height, 2):# 選取最大像素pixels = []pixels.append(new_image[x][y])pixels.append(new_image[x+1][y])pixels.append(new_image[x][y+1])pixels.append(new_image[x+1][y+1])new_image2[int(x/2)][int(y/2)] = max(pixels)
3、顯示圖像
# 顯示圖像
plt.gray()
plt.imshow(new_image2)
plt.show()
可以發(fā)現(xiàn)圖像大小減半的同時,特征也得以保留。?
?
?
池化代碼
# 池化(最大值)
import numpy as np# 創(chuàng)建圖像(大小為原圖的1/4)
new_image2 = np.zeros((int(width/2), int(height/2)))# 遍歷池化(步長為2)
for x in range(0, width, 2):for y in range(0, height, 2):# 選取最大像素pixels = []pixels.append(new_image[x][y])pixels.append(new_image[x+1][y])pixels.append(new_image[x][y+1])pixels.append(new_image[x+1][y+1])new_image2[int(x/2)][int(y/2)] = max(pixels)# 顯示圖像
plt.gray()
plt.imshow(new_image2)
plt.show()
總代碼
import cv2
from scipy import misc
image = misc.ascent()import matplotlib.pyplot as plt
plt.grid(False)
plt.gray()
plt.imshow(image)
plt.show()# 圖像尺寸
width, height = image.shape# 手寫實現(xiàn)圖像卷積
# 設(shè)置卷積核及權(quán)重
new_image = image.copy()
filter = [ [-1, -2, -1], [0, 0, 0], [1, 2, 1]]
weight = 1
# 如果過濾器中的所有數(shù)字加起來不是0或1,那么就應(yīng)該設(shè)置權(quán)重,讓過濾器的總和為0或1。
# 例如,如果過濾器是1,1,1,1,2,1,1,1,1。
# 它們加起來是10,所以可以設(shè)置0.1的權(quán)重,使它標(biāo)準(zhǔn)化。# 卷積
for x in range(1, width-1):for y in range(1, height-1):# 實現(xiàn)卷積(圖像對應(yīng)位置 分別乘 卷積核對應(yīng)位置)convolution = 0.0for i in range(3):for j in range(3):# 列和行分別對應(yīng)相乘convolution += image[x-1+j][y-1+i]*filter[i][j]convolution *= weight# 限值if convolution > 255:convolution = 255elif convolution <0:convolution = 0# 圖像賦值new_image[x][y] = convolution# 顯示灰度圖
plt.gray()
plt.grid(False)
plt.imshow(new_image)
plt.show() # 池化(最大值)
import numpy as np# 創(chuàng)建圖像(大小為原圖的1/4)
new_image2 = np.zeros((int(width/2), int(height/2)))# 遍歷池化(步長為2)
for x in range(0, width, 2):for y in range(0, height, 2):# 選取最大像素pixels = []pixels.append(new_image[x][y])pixels.append(new_image[x+1][y])pixels.append(new_image[x][y+1])pixels.append(new_image[x+1][y+1])new_image2[int(x/2)][int(y/2)] = max(pixels)# 顯示圖像
plt.gray()
plt.imshow(new_image2)
plt.show()
總結(jié)
以上是生活随笔為你收集整理的TensorFlow(8)卷积神经网络实战(2)手写卷积池化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow(7)卷积神经网络实
- 下一篇: TensorFlow(9)(项目)人马图