卷積神經網路: 含卷積層,有寬和高
兩個維度,常用來處理影象資料。
'''
二維互相關運算:
1. 卷積視窗(又被稱卷積核或過濾器(filter))從輸入陣列的最左上方開始,按從左往右、從上往下的順序, 依次在輸入陣列上滑動;
2. 當卷積視窗滑動到某一位置時,視窗中的輸入子陣列與核陣列按元素相乘並求和,得到輸出陣列中相應位置的元素;
實現二維互相關運算函式如下:
'''def
corr2d
(x,k)
: h,w = k.shape ## 獲取卷積核的尺寸(寬,高)
y = tf.variable(tf.zeros(
(x.shape[0]
- h +
1, x.shape[1]
- w +1)
))for i in
range
(y.shape[0]
):for j in
range
(y.shape[1]
):y[i,j]
.assign(tf.cast(tf.reduce_sum(x[i:i+h, j:j+w]
* k)
, dtype=tf.float32)
)return y
'''測試例項: '''
x = tf.constant([[
0,1,
2],[
3,4,
5],[
6,7,
8]])
k = tf.constant([[
0,1]
,[2,
3]])
corr2d(x, k)
類似於: y = k*x+b (k–卷積核, b–偏差)
卷積層的乙個應用: 檢測影象中物體的邊緣,即找到畫素變化的位置;
'''
為實現檢測影象的中物體的邊緣,需要構造乙個頁數的卷積核k;
當它與輸入做互相關運算時,如果橫向相鄰元素相同,輸出為0; 否則輸出為非0;
'''k = tf.constrant([[
-1,1
]], dtype=tf.float32)
在這裡使用卷積的方式來獲取權重係數,但忽略偏差.
#!/bin/bash
# -*-coding:utf-8-*-
import tensorflow as tf
print
(tf.__version__)
# 二維卷積計算函式
defcorr2d
(x, k)
: h, w = k.shape
y = tf.variable(tf.zeros(
(x.shape[0]
- h +
1, x.shape[1]
- w +1)
))for i in
range
(y.shape[0]
):for j in
range
(y.shape[1]
):y[i, j]
.assign(tf.cast(tf.reduce_sum(x[i:i+h, j:j+w]
* k)
, dtype=tf.float32)
)return y
x = tf.variable(tf.ones((6
,8))
)x[:,
2:6]
.assign(tf.zeros(x[:,
2:6]
.shape)
)# 輸入資料
k = tf.constant([[
1,-1
]], dtype = tf.float32)
# 卷積核
y= corr2d(x, k)
# 輸出資料
x = tf.reshape(x,(1
,6,8
,1))
# 重置尺寸
y = tf.reshape(y,(1
,6,7
,1))
# 重置尺寸
# print("x = ", x)
# 根據上一步測試中獲取的x-y值, 從而反推算其核心k;
conv2d = tf.keras.layers.conv2d(1,
(1,2
))# print(tf.reshape(conv2d.get_weights()[0], (1, 2)))
print
('y.shape = '
, y.shape)
y_hat = conv2d(x)
# print(y_hat)
for i in
range(10
):with tf.gradienttape(watch_accessed_variables=
false
)as tt:
tt.watch(conv2d.weights[0]
) y_hat = conv2d(x)
m_error =
(abs
(y_hat - y))**
2 dl = tt.gradient(m_error, conv2d.weights[0]
) lr =3e-
2 update = tf.multiply(lr, dl)
update_weights = conv2d.get_weights(
) update_weights[0]
= conv2d.weights[0]
- update
conv2d.set_weights(update_weights)
if(i +1)
%2==0
:print
('batch %d, loss %.4f'
%(i +
1, tf.reduce_sum(m_error)))
print
(tf.reshape(conv2d.get_weights()[
0],(
1,2)
))
問: 卷積層為何能使用互相關運算替代卷積運算?
`特徵圖:` 二維卷積層輸出的二維陣列可以看作是輸入在空間維度(寬和高)上某一級的表徵,也叫特徵圖(feature map);
'感受野:' 影響元素x(陣列)的前向計算的所有可能輸入區域(可能大於輸入的實際尺寸)叫做x的感受野(receptive field)
動手學深度學習TF2 0第六課 多層感知機
前面介紹的線性回歸和softmax回歸都是單層神經網路.然而在深度學習中,大多數是多層模型.以下以多層感知機為例,介紹多層神經網路.多層感知機在單層神經網路的基礎上引入了 個隱藏層 hidden layer 隱藏層位於輸入層和輸出層之間 上圖中含有乙個隱藏層,該層中有 個隱藏單元 輸入層不參與計算,...
Python學習第九課 匿名函式
匿名函式 func lambda x x 1 x表示引數 x 1表示處理邏輯 print func 10 輸出結果為11 例 如何將name hanhan 改為 hanhan shuai的形式 普通函式寫法 name hanhan def change name x return name shua...
Python全棧 第九課 學習筆記
函式的結構與呼叫 函式什麼時候執行?函式的返回值 s1 fsjkdafshdjfsdhafjksda l1 1,2,3,4,5,6 def my len s count 0 for i in s count 1 print count my len s1 my len l1 return 在函式中遇...