《Tensorflow深度學(xué)習(xí)》一書(shū)看了2遍送巡,但是仍然有些地方不熟悉若贮,因此決定寫(xiě)博客記錄一下自已的學(xué)習(xí)歷程嗦玖。關(guān)鍵是要用到這些知識(shí)的時(shí)候可以隨時(shí)來(lái)這里復(fù)習(xí)硬梁。
1.Tensorflow的數(shù)據(jù)類(lèi)型
Tensorflow中的基本數(shù)據(jù)類(lèi)型包括數(shù)值類(lèi)型、字符串類(lèi)型和布爾類(lèi)型。
數(shù)值類(lèi)型
- 標(biāo)量:?jiǎn)蝹€(gè)的實(shí)數(shù)涡扼,如1,2,3,4等稼跳,維度數(shù)為0,shape為[]
a = tf.constant(1)
- 向量:向量的形式是這樣的[1,2]壳澳,[1,2,3,4]岂贩。維度數(shù)為1. shape為[n]
a = tf.constan([1,2])
- 矩陣:n行m列實(shí)數(shù)的有序集合茫经,形式如[[1,2],[3,4]]巷波,維度數(shù)為2,shape為[n,m]
a = tf.constant([[1,2],[3,4]]) - 張量:所有維度dim>2的數(shù)組統(tǒng)稱(chēng)為張量卸伞,張量的每個(gè)維度也叫做軸抹镊,一般維度代表了具體的物理含義,比如Shape為[2,32,32,3]的張量共的4維荤傲,如果表示圖片數(shù)據(jù)的話垮耳,每個(gè)維度/軸代表的含義分別是圖片數(shù)量、圖片高度遂黍、圖片寬度终佛、圖片通道數(shù),其中2代表了2張圖片雾家,32代表了高铃彰、寬均為32,3代表了RGB共3個(gè)通道芯咧。
另外牙捉,在Tensorflow中間,為了表達(dá)方便敬飒,一般把標(biāo)量邪铲、向量、矩陣也統(tǒng)稱(chēng)為張量无拗,不作區(qū)分带到。
字符串類(lèi)型
通過(guò)傳入字符串對(duì)象即可創(chuàng)建字符串類(lèi)型的張量。
a = tf.constant('Hello, Deep Learning.')
在tf.strings模塊中英染,提供了常見(jiàn)的字符串類(lèi)型的工具函數(shù)揽惹,如小寫(xiě)化lower()、拼接join()税迷、長(zhǎng)度length()永丝、切分split()等
深度學(xué)習(xí)算法主要還是以數(shù)值類(lèi)型的張量運(yùn)算為主,字符串類(lèi)型的數(shù)據(jù)使用頻率較低箭养。
布爾類(lèi)型
布爾類(lèi)型的標(biāo)量形式如下:
a = tf.constant(True)
布爾類(lèi)型的向量形式如下:
a = tf.constant([True, False])
需要注意的是慕嚷,Tensorflow的布爾類(lèi)型和Python的布爾類(lèi)型并不等價(jià),不能通用。例如:
a = tf.constant(True)
a is True #TF布爾類(lèi)型張量與python布爾類(lèi)型比較
a == True #僅數(shù)值比較
Out[11]:
False #對(duì)象不等價(jià)
<tf.Tensor: id=8, shape=(), dtype=bool, numpy=True> # 數(shù)值比較結(jié)果
2.Tensorflow的數(shù)值精度
Tensorflow常用的精度類(lèi)型有tf.int16喝检、tf.int32嗅辣、tf.int64、tf.float16挠说、tf.float32澡谭、tf.float64等,其中tf.float64即為tf.double
在創(chuàng)建張量時(shí)损俭,可以指定張量的保存精度蛙奖,例如:
tf.constant(123456789, dtype=tf.int16)
tf.constant(123456789, dtype=tf.int32)
<tf.Tensor: shape=(), dtype=int16, numpy=-13035>
<tf.Tensor: shape=(), dtype=int32, numpy=123456789>
可以看到,保存精度過(guò)低時(shí)杆兵,數(shù)據(jù)123456789發(fā)生了溢出雁仲,得到了錯(cuò)誤的結(jié)果,一般使用tf.int32,tf.int64精度琐脏,對(duì)于浮點(diǎn)數(shù)攒砖,高精度的張量可以表示更精準(zhǔn)的數(shù)據(jù),例如用tf.float32精度保存π時(shí)日裙,實(shí)際的數(shù)據(jù)為3.1415927 吹艇。
import numpy as np
tf.constant(np.pi,dtype=tf.float32)
<tf.Tensor: shape=(), dtype=float32, numpy=3.1415927>
如果采用tf.float64精度保存π時(shí),則能獲得更高的精度昂拂,實(shí)現(xiàn)如下受神。
tf.constant(np.pi, dtype=tf.float64)
<tf.Tensor: shape=(), dtype=float64, numpy=3.141592653589793>
對(duì)于大部分深度學(xué)習(xí)算法,一般使用tf.int32和tf.float32即可滿(mǎn)足大部分場(chǎng)合下的運(yùn)算要求政钟。
2.1 讀取張量的精度
通過(guò)訪問(wèn)張量的dtype成員屬性可以判斷張量的保存精度路克。
a = tf.constant(1., dtype=tf.float16)
print('before:',a.dtype)
if a.dtype != tf.float32:
a = tf.cast(a, dtype=tf.float32)
print('after:',a.dtype)
2.2 張量類(lèi)型轉(zhuǎn)換
張量的類(lèi)型轉(zhuǎn)換可以使用tf.cast函數(shù)來(lái)進(jìn)行操作
a = tf.constant(np.pi,dtype=tf.float16)
tf.cast(a,dtype=tf.double)
<tf.Tensor: shape=(), dtype=float64, numpy=3.140625>
在進(jìn)行類(lèi)型轉(zhuǎn)換時(shí),需要保證轉(zhuǎn)換操作的合法性养交,例如將高精度的張量轉(zhuǎn)換為低精度的張量時(shí)精算,可能會(huì)發(fā)生數(shù)據(jù)溢出的錯(cuò)誤。
布爾類(lèi)型與整型之間相互轉(zhuǎn)換也是合法的碎连。
a = tf.constant([True, False])
tf.cast(a, tf.int32)
<tf.Tensor: shape=(2,), dtype=int32, numpy=array([1, 0], dtype=int32)>
注意:一般默認(rèn)0表示False灰羽,1表示True,在Tensorflow中鱼辙,將非0數(shù)字都視為T(mén)rue廉嚼。
3.待優(yōu)化張量
為了區(qū)分需要計(jì)算梯度信息的張量與不需要計(jì)算梯度信息的張量,TensorFlow增加了一種專(zhuān)門(mén)的數(shù)據(jù)類(lèi)型來(lái)支持梯度信息的記錄:tf.Variable倒戏。tf.Variable類(lèi)型在普通的張量類(lèi)型基礎(chǔ)上添加了name怠噪,trainable等屬性來(lái)支持計(jì)算圖的構(gòu)建。由于梯度運(yùn)算會(huì)消耗大量的計(jì)算資源杜跷,而且會(huì)自動(dòng)更新相關(guān)參數(shù)傍念,對(duì)于不需要優(yōu)化的張量矫夷,如神經(jīng)網(wǎng)絡(luò)的輸入X,不需要通過(guò)tf.Variable封裝憋槐;相反双藕,對(duì)于需要計(jì)算梯度并優(yōu)化的張量,如神經(jīng)網(wǎng)絡(luò)的W和b阳仔,需要通過(guò)tf.Variable包裹以便TensorFlow跟蹤相關(guān)梯度信息忧陪。
通過(guò)tf.Variable()函數(shù)可以將普通張量轉(zhuǎn)換為待優(yōu)化張量,例如:
a = tf.constant([-1,0,1,2])
aa = tf.Variable(a)
aa.name,aa.trainable
('Variable:0', True)
其中張量的name和trainable屬性是Variable特有的屬性近范,name屬性用于命名計(jì)算圖中的變量嘶摊,這套命名體系是TensroFlow內(nèi)部維護(hù)的,一般不需要用戶(hù)關(guān)注name屬性顺又;trainable屬性表征當(dāng)前張量是否需要被優(yōu)化更卒,創(chuàng)建Variable對(duì)象時(shí)是默認(rèn)啟用優(yōu)化標(biāo)志等孵,可以設(shè)置trainable=False來(lái)設(shè)置張量不需要優(yōu)化稚照。
除了通過(guò)普通張量方式創(chuàng)建Variable,也可以直接創(chuàng)建俯萌,例如:
a = tf.Variable([[1,2],[3,4]]) #直接創(chuàng)建Variable張量
print(a)
<tf.Variable 'Variable:0' shape=(2, 2) dtype=int32, numpy=
array([[1, 2],
[3, 4]], dtype=int32)>
待優(yōu)化張量可視為普通張量的特殊類(lèi)型果录,普通張量其實(shí)也可以通過(guò)GradientTape.watch()方法臨時(shí)加入跟蹤梯度信息的列表,從而支持自動(dòng)求導(dǎo)功能咐熙。
4.創(chuàng)建張量
在TensorFlow中弱恒,可以通過(guò)多種方試創(chuàng)建張量,如從Python列表對(duì)象創(chuàng)建棋恼,從Numpy數(shù)組創(chuàng)建返弹,或者創(chuàng)建采樣自某種已知分布的張量等。
4.1 從數(shù)組爪飘、列表對(duì)象創(chuàng)建
a = tf.constant([1,2])#從列表創(chuàng)建張量
a = tf.constant(np.array([[1,2],[3,4]]))#從數(shù)組中創(chuàng)建張量
4.2 創(chuàng)建全0或全1張量
將張量創(chuàng)建為全0或全1數(shù)據(jù)是非常常見(jiàn)的張量初始化手段义起。考慮線性變換y = Wx + b师崎,將權(quán)值矩陣W初始化為全1矩陣默终,偏置b初始化為全0向量,此時(shí)線性變化層輸出y = x犁罩,因此是一種比較好的層初始化狀態(tài)齐蔽,通過(guò)tf.zeros()和tf.ones()即可創(chuàng)建任意形狀,且內(nèi)容全0或全1的張量床估。例如含滴,創(chuàng)建為0和為1的標(biāo)量。
tf.ones([])#創(chuàng)建全1標(biāo)量
tf.zeros([])#創(chuàng)建全0標(biāo)量
創(chuàng)建全0和全1的向量丐巫。
tf.zeros([1])#創(chuàng)建全0向量
tf.ones([1])#創(chuàng)建全1向量
創(chuàng)建全0和全1的矩陣谈况,例如:
tf.zeros([2,2])#全0矩陣
tf.ones([2,2])#全1矩陣
通過(guò)tf.zeros_like源哩,tf.ones_like可以方便地新建與某個(gè)張量shape一致,且內(nèi)容為全0或全1的張量鸦做。
a = tf.ones([2,3])#創(chuàng)建一個(gè)全1矩陣
tf.zeros_like(a)#創(chuàng)建一個(gè)與a形狀相同励烦,但是全0的新矩陣
a = tf.zeros([3,2])#創(chuàng)建一個(gè)全0矩陣
tf.ones_like(a)#創(chuàng)建一個(gè)與a形狀相同,但是全1的新矩陣
tf.*_like是一系列的便捷函數(shù)泼诱,可以通過(guò)tf.zeros(a.shape)等方式實(shí)現(xiàn)坛掠。
4.3創(chuàng)建自定義數(shù)值張量
除了初始化為全0或全1的張量之外,有時(shí)也需要全部初始化為某個(gè)自定義數(shù)值的張量治筒,比如將張量的數(shù)值全部初始化為-1等屉栓。
通過(guò)tf.fill(shape,value)可以創(chuàng)建全為自定義數(shù)值value的張量。例如耸袜,創(chuàng)建元素為-1的標(biāo)量友多。
tf.fill([],-1)#創(chuàng)建-1的標(biāo)量
tf.fill([1],-1)#創(chuàng)建-1的向量
tf.fill([2,2],99)#創(chuàng)建所有元素為99的矩陣
4.4創(chuàng)建已知分布的張量
正態(tài)分布和均勻分布是最常見(jiàn)的分布之一,創(chuàng)建采樣自這兩種分布的張量非常有用堤框,比如在卷積神經(jīng)網(wǎng)絡(luò)中域滥,卷積核張量W初始化為正態(tài)分布有利于網(wǎng)絡(luò)的訓(xùn)練;在生成對(duì)抗網(wǎng)絡(luò)中蜈抓,隱藏變量z一般采樣自均勻分布启绰。
通過(guò)tf.random.normal(shape,mean=0.0,stddev=1.0)可以創(chuàng)建形狀為shape,均值為mean沟使,標(biāo)準(zhǔn)差為stddev的正態(tài)分布N(mean,stddev**2)委可。例如,創(chuàng)建均值為0腊嗡,標(biāo)準(zhǔn)差為1的正態(tài)分布着倾。
tf.random.normal([2,2])#創(chuàng)建標(biāo)準(zhǔn)正態(tài)分布的張量
tf.random.normal([2,2],mean=1,stddev=2)#創(chuàng)建均值為1,標(biāo)準(zhǔn)差為2的正態(tài)分布
通過(guò)tf.random.uniform(shape,minval=0,maxval=None,dtype=tf.float32)可以創(chuàng)建采樣自[minval,maxval)區(qū)間的均勻分布的張量燕少。例如創(chuàng)建采樣自區(qū)間[0,1)卡者,shape為[2,2]的矩陣。
tf.random.uniform([2,2])
tf.random.uniform([2,2],maxval=10)#創(chuàng)建采樣自[0,10),均勻分布的矩陣
如果需要均勻采樣整形類(lèi)型的數(shù)據(jù)棺亭,必須指定采樣區(qū)間的最大值maxval參數(shù)虎眨,同時(shí)指定數(shù)據(jù)類(lèi)型為tf.int*型:
tf.random.uniform([2,2],maxval=100,dtype=tf.int32)#創(chuàng)建采樣自[0,100)均勻分布的整型數(shù)據(jù)
創(chuàng)建序列
在循環(huán)計(jì)算或者對(duì)張量進(jìn)行索引時(shí),經(jīng)常需要?jiǎng)?chuàng)建一段連續(xù)的整型序列镶摘,可以通過(guò)tf.range()函數(shù)實(shí)現(xiàn)嗽桩。tf.range(limit,delta=1)可以創(chuàng)建[0,limit)之間,步長(zhǎng)為delta的整型序列凄敢,不包含limit本身碌冶。例如,創(chuàng)建0~10涝缝,步長(zhǎng)為1的整型序列:
tf.range(10) #0~10,不包含10
tf.range(10,delta=2)#0~10,步長(zhǎng)為2的整型序列
通過(guò)tf.range(start,limit,delta=1)可以創(chuàng)建[start,limit)扑庞,步長(zhǎng)為delta的序列譬重,不包含limit本身:
tf.range(1,10,delta=2)#1~10,步長(zhǎng)為2的整型序列
5.張量的典型應(yīng)用
在介紹張量的典型應(yīng)用時(shí)不可避免地會(huì)提及后續(xù)將要學(xué)習(xí)的網(wǎng)絡(luò)模型或算法罐氨,學(xué)習(xí)時(shí)不需要完全理解臀规,有初步印象即可。
5.1 標(biāo)量的應(yīng)用
在TensorFlow中栅隐,標(biāo)量最容易理解塔嬉,它就是一個(gè)簡(jiǎn)單的數(shù)字,維度數(shù)為0租悄,shape為[]谨究。標(biāo)量的一些典型用途是誤差值的表示、各種測(cè)量指標(biāo)的表示泣棋,比如準(zhǔn)確度(Accuracy胶哲,簡(jiǎn)稱(chēng)acc),精度(Precision)和召回率(Recall)等潭辈。
以均方差誤差函數(shù)為例鸯屿,經(jīng)過(guò)tf.keras.losses.mes返回每個(gè)樣本上的誤差值,最后取誤差值的均值作為當(dāng)前Batch的誤差萎胰,它是一個(gè)標(biāo)量:
import tensorflow as tf
out = tf.random.normal([4,10])#隨機(jī)模擬網(wǎng)絡(luò)輸出
y = tf.constant([2,3,2,0])#隨機(jī)構(gòu)造樣本真實(shí)標(biāo)簽
y = tf.one_hot(y,depth=10)#one_hot編碼
loss = tf.keras.losses.mse(y,out)#計(jì)算每個(gè)樣本的MSE
loss = tf.reduce_mean(loss)#平均MSE,loss應(yīng)是標(biāo)量
print(loss)
5.2向量的應(yīng)用
向量是一種非常常見(jiàn)的數(shù)據(jù)載體碾盟,如在全連接層和卷積神經(jīng)網(wǎng)絡(luò)層中,偏置張量b就是使用向量來(lái)表示技竟。
考慮2個(gè)輸出結(jié)點(diǎn)的網(wǎng)絡(luò)層,我們創(chuàng)建長(zhǎng)度為2的偏置向量b屈藐,并累加在每個(gè)輸出結(jié)點(diǎn)上:
z = tf.random.normal([4,2])# z=wx,模擬獲得激活函數(shù)的輸入z
b = tf.zeros([2])#創(chuàng)建偏置向量
out = z+b#累加上偏置向量·
print(out)
通過(guò)高層接口類(lèi)Dense()方式創(chuàng)建的網(wǎng)絡(luò)層榔组,張量W和b存儲(chǔ)在類(lèi)的內(nèi)部,由類(lèi)自動(dòng)創(chuàng)建并管理联逻〈瓿叮可以通過(guò)全連接層的bias成員變量查看偏置變量b,例如創(chuàng)建輸入結(jié)點(diǎn)數(shù)為4包归,輸出結(jié)點(diǎn)數(shù)為3的線性層網(wǎng)絡(luò)锨推,那么它的偏置向量b的長(zhǎng)度應(yīng)為3,實(shí)現(xiàn)如下:
from tensorflow.keras import layers
fc = layers.Dense(3)#創(chuàng)建一層wx+b,輸出結(jié)點(diǎn)為3
fc.build(input_shape=(2,4))#通過(guò)build函數(shù)創(chuàng)建w,b張量公壤,輸入結(jié)點(diǎn)為4
fc.bias#查看偏置向量
<tf.Variable 'bias:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>
可以看到换可,類(lèi)的偏置成員bias為長(zhǎng)度為3的向量,初始化為全0厦幅,這也是偏置b的默認(rèn)初始化方案沾鳄。同時(shí)偏置向量b的類(lèi)型為Variable,這是因?yàn)閃和b都是待優(yōu)化參數(shù)确憨。
5.3矩陣的應(yīng)用
矩陣也是非常常見(jiàn)的張量類(lèi)型译荞,比如全連接層的批量輸入張量X的形狀為[b,din]瓤的,其中b表示輸入樣木的個(gè)數(shù),即Batch Size吞歼,din表示輸入特征的長(zhǎng)度圈膏。例如特征長(zhǎng)度為4,一共包含2個(gè)樣本的輸入可以表示為矩陣篙骡。
x = tf.random.normal([2,4])#2個(gè)樣本本辐,特征長(zhǎng)度為4的張量
令全連接層的輸出結(jié)點(diǎn)數(shù)為3,則它的權(quán)值張量W的shape為[4,3]医增,我們利用張量X慎皱,W和向量b可以直接實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)層,代碼如下:
w = tf.ones([4,3])#定義w張量
b = tf.zeros([3])#定義b張量
o = x@w + b# x@w+b運(yùn)算
print(o)
tf.Tensor(
[[ 3.2366664 3.2366664 3.2366664 ]
[-0.56299406 -0.56299406 -0.56299406]], shape=(2, 3), dtype=float32)
其中X和W張量均是矩陣叶骨,上述代碼實(shí)現(xiàn)了一個(gè)線性變換的網(wǎng)絡(luò)層茫多,激活函數(shù)為空。一般地忽刽,??(X@W+b)網(wǎng)絡(luò)層稱(chēng)為全連接層天揖,在TensorFlow中可以通過(guò)Dense類(lèi)直接實(shí)現(xiàn),特別地跪帝,當(dāng)激活函數(shù)??為空時(shí)今膊,全連接層也稱(chēng)為線性層。我們通過(guò)Dense類(lèi)創(chuàng)建輸入4個(gè)節(jié)點(diǎn)伞剑,輸出3個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò)層斑唬,并通過(guò)全連接層的kernel成員名查看其權(quán)值矩陣W:
fc = layers.Dense(3)#定義全連接層的輸出結(jié)點(diǎn)為3
fc.build(input_shape=(2,4))#定義全連接層的輸入結(jié)點(diǎn)為4
fc.kernel#查看權(quán)值矩陣W
<tf.Variable 'kernel:0' shape=(4, 3) dtype=float32, numpy=
array([[-0.89720654, -0.38539422, -0.837082 ],
[-0.5322888 , -0.3831355 , 0.32437778],
[ 0.2899388 , -0.5300534 , -0.41874212],
[ 0.8843045 , 0.3853227 , 0.13318992]], dtype=float32)>
5.4三維張量的應(yīng)用
三維張量的一個(gè)典型應(yīng)用是表示序列信號(hào),它的格式是:
X = [b, sequence len, feature len]
其中b表示序列信號(hào)的數(shù)量黎泣,sequence len表示序列信號(hào)在時(shí)間維度上的采樣點(diǎn)數(shù)或步數(shù)恕刘。feature len表示每個(gè)點(diǎn)的特征長(zhǎng)度。
考慮自然語(yǔ)言處理(Natural Language Processing抒倚,簡(jiǎn)稱(chēng)NLP)中句子的表示褐着,如評(píng)價(jià)句子是否為正面情緒的情感分類(lèi)網(wǎng)絡(luò)。為了能夠方便字符串被神經(jīng)網(wǎng)絡(luò)處理托呕,一般將單詞通過(guò)嵌入層(Embedding Layer)編碼為固定長(zhǎng)度的向量含蓉,比如‘a(chǎn)’編碼為某個(gè)長(zhǎng)度為3的向量,那么2個(gè)等長(zhǎng)(單詞數(shù)量為5)的句子序列可以表示為shape為[2,5,3]的3維張量项郊,其中2表示句子個(gè)數(shù)馅扣,5表示單詞數(shù)量,3表示單詞向量的長(zhǎng)度呆抑。我們通過(guò)IMDB數(shù)據(jù)集來(lái)演示如何表示句子岂嗓,代碼如下:
from tensorflow import keras
(x_train,y_train),(x_test,y_test) = keras.datasets.imdb.load_data(num_words=10000)
x_train = keras.preprocessing.sequence.pad_sequences(x_train,maxlen=80)
x_train.shape
Out [46]: (25000, 80)
可以看到x_train張量的shape為[25000,80],其中25000表示句子個(gè)數(shù)鹊碍,80表示每個(gè)句子共80個(gè)單詞厌殉,每個(gè)單詞使用數(shù)字編碼方式表示食绿。我們通過(guò)layers.Embedding層將數(shù)字編碼的單詞轉(zhuǎn)換為長(zhǎng)度為100的詞向量。
embedding = layers.Embedding(10000,100)#創(chuàng)建詞向量Embedding層類(lèi)
out = embedding(x_train)#將數(shù)字編碼的單詞轉(zhuǎn)換為詞向量
out.shape
Out[47]: TensorShape([25000, 80, 100])
可以看到公罕,經(jīng)過(guò)Embedding層編碼后器紧,句子張量的shape變?yōu)閇25000,80,100],其中100表示每個(gè)單詞編碼為長(zhǎng)度是100的向量楼眷。
5.5 四維張量的應(yīng)用
四維張量在卷積神經(jīng)網(wǎng)絡(luò)中應(yīng)用非常廣泛铲汪,它用于保存特征圖(Feature maps)數(shù)據(jù),格式一般定義為
[b,h,w,c]
其中b表示輸入樣本的數(shù)量罐柳,h/w分別表示特征圖的高/寬掌腰,c表示特征圖的通道數(shù)。圖片數(shù)據(jù)是特征圖的一種张吉,對(duì)于含有RGB 3個(gè)通道的彩色圖片齿梁,每張圖片包含了h行w列像素點(diǎn),每個(gè)點(diǎn)需要3個(gè)數(shù)值表示RGB通道的顏色強(qiáng)度肮蛹,因此一張圖片可以表示為[h,w,3]勺择。
神經(jīng)網(wǎng)絡(luò)一般并行計(jì)算多個(gè)輸入以提高計(jì)算效率,故b張圖片的張量可表示為[b,h,w,3]伦忠,例如:
x = tf.random.normal([4,32,32,3])#創(chuàng)建32x32的彩色圖片輸入省核,圖片個(gè)數(shù)為4
layer = layers.Conv2D(16,kernel_size=3)#創(chuàng)建卷積神經(jīng)網(wǎng)絡(luò)
out = layer(x)#前向計(jì)算
out.shape
TensorShape([4, 30, 30, 16])
其中卷積核張量也是4維張量,可以通過(guò)kernel成員變量訪問(wèn)昆码。
layer.kernel.shape#訪問(wèn)卷積核張量
TensorShape([3, 3, 3, 16])