使用keras時(shí)input_shape的維度表示問題說明
Keras提供了兩套后端,Theano和Tensorflow,不同的后端使用時(shí)維度順序dim_ordering會(huì)有沖突。
對于一張224*224的彩色圖片表示問題,theano使用的是th格式,維度順序是(3,224,224),即通道維度在前,Caffe采取的也是這種方式。而Tensorflow使用的是tf格式,維度順序是(224,224,3),即通道維度在后。
Keras默認(rèn)使用的是Tensorflow。我們在導(dǎo)入模塊的時(shí)候可以進(jìn)行查看,也可以切換后端。

為了代碼可以在兩種后端兼容,可以通過data_format參數(shù)進(jìn)行維度順序的設(shè)定,data_format='channels_first',對應(yīng)“th”,data_format='channels_last',對應(yīng)“tf”。
補(bǔ)充知識(shí):Tensorflow Keras 中input_shape引發(fā)的維度順序沖突問題(NCHW與NHWC)
以tf.keras.Sequential構(gòu)建卷積層為例:
tf.keras.layers.Conv2D(10, 3, input_shape=(2, 9, 9),padding='same',activation=tf.nn.relu,kernel_initializer='glorot_normal', bias_initializer='glorot_normal'),
這是一個(gè)簡單的卷積層的定義,主要看input_shape參數(shù):
這是用來指定卷積層輸入形狀的參數(shù),由于Keras提供了兩套后端,Theano和Tensorflow,不同的后端使用時(shí)對該參數(shù)所指代的維度順序dim_ordering會(huì)有沖突。
Theano(th):
NCHW:順序是 [batch, in_channels, in_height, in_width]
Tensorflow(tf):keras默認(rèn)使用這種方式
NHWC:順序是 [batch, in_height, in_width, in_channels]
即對于上述input_shape=(2, 9, 9)來說:我們先忽略batch,2會(huì)被解析為通道數(shù),矩陣大小為9*9,符合我們預(yù)期。而tf會(huì)將矩陣大小解析為2 * 9 ,且最后一位9代表通道數(shù),與預(yù)期不符。
解決
法一:
在卷積層定義中加入?yún)?shù)來讓keras在兩種后端之間切換:
data_format='channels_first':代表th
data_format='channels_last':代表tf
但是該法在某些時(shí)候不成功會(huì)報(bào)錯(cuò):
或許是cpu電腦導(dǎo)致的,只支持NHWC即tf模式。
只能修改相應(yīng)文件的配置來使其支持NCHW,參考這里
法二:(推薦)
使用tf.transpose函數(shù)進(jìn)行高維數(shù)據(jù)的轉(zhuǎn)置(維度大于2,軸的轉(zhuǎn)換)
如將上述(2,9,9)轉(zhuǎn)為(9,9,2)并且是以2為通道數(shù),即矩陣為9*9,而不是像reshape函數(shù)簡單的調(diào)整維度,若使用reshape函數(shù)來轉(zhuǎn)換,只會(huì)得到通道數(shù)為9,矩陣為9 * 2的數(shù)據(jù)。
tf.transpose(待轉(zhuǎn)矩陣,(1,2,0))
解釋:
其中0,1,2…是原矩陣維度從左到右軸的標(biāo)號(hào),即(2,9,9)中三個(gè)維度分別對應(yīng)標(biāo)號(hào)0,1,2。而調(diào)整過后將標(biāo)號(hào)順序變?yōu)?,2,0 即是把表通道數(shù)的軸置于最后,這樣轉(zhuǎn)置后的矩陣就滿足了keras的默認(rèn)tf后端。即可正常訓(xùn)練。
以上這篇使用keras時(shí)input_shape的維度表示問題說明就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)flappy bird小游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)flappy bird小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Python中實(shí)現(xiàn)參數(shù)類型檢查的簡單方法
這篇文章主要介紹了Python中實(shí)現(xiàn)參數(shù)類型檢查的簡單方法,本文講解使用裝飾器實(shí)現(xiàn)參數(shù)類型檢查并給出代碼實(shí)例,需要的朋友可以參考下2015-04-04
Python記錄numpy.empty()函數(shù)引發(fā)的問題及解決
這篇文章主要介紹了Python記錄numpy.empty()函數(shù)引發(fā)的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
Python實(shí)現(xiàn)合并兩個(gè)列表的方法分析
這篇文章主要介紹了Python實(shí)現(xiàn)合并兩個(gè)列表的方法,結(jié)合實(shí)例形式對比分析了常見的Python列表合并操作技巧,需要的朋友可以參考下2018-05-05
Python實(shí)現(xiàn)批量下載SMAP數(shù)據(jù)
在科學(xué)研究和數(shù)據(jù)分析中,獲取大規(guī)模的遙感數(shù)據(jù)是一個(gè)常見的任務(wù),本文將詳細(xì)為大家介紹如何利用Python實(shí)現(xiàn)SMAP數(shù)據(jù)的批量下載,需要的可以參考下2023-12-12
Pycharm 2to3配置,python2轉(zhuǎn)python3方式
這篇文章主要介紹了Pycharm 2to3配置,python2轉(zhuǎn)python3方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12

