動手學深度學習TF2 0第九課 二維卷積神經網路

2021-10-23 01:57:29 字數 3382 閱讀 5431

卷積神經網路: 含卷積層,有寬和高兩個維度,常用來處理影象資料。

'''

二維互相關運算:

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 在函式中遇...