1.背景
我們在model各層之間轉換時,難免要對tensor的shape做改變。我在這裏記錄一下幾個改變大小的函數。
2.方法
(1)Reshape
我這裏指的是keras.layers.Reshape層,當然也有reshape方法,一個道理。
x = Reshape((H*W, classes)) (x)
比如這樣的,我想要將一個(H,W,classes)變成上述的(H*W,classes),這樣的變化在轉換爲one-hot編碼時候會使用到。我們可以看到Reshape,你需要前後元素的數目一致,不能說(H,W)的圖reshape成(H1*W1)等諸如此類的,如果那樣的話,就會報錯。
那麼,如果我想要縮小圖片或者擴大圖片,我該怎麼做呢?下面介紹幾種方法。
(2)K.tf.image.resize_bilinear(只能針對channel_last處理)
這個函數可以將你的tensor轉換成你想要的目標大小,但是這個函數只能針對channel_last的tensor,也就是你輸入的數據它默認並且只限定你是(batchsize,h,w,channel),並且它會對你的第1維和第2維做調整:
x=K.tf.image.resize_bilinear(x,size=(target_h,target_w))
這就很難受了,如果你恰好是channel_first的模型,那可咋整,下面有一種方法,可解燃眉之急。
(3)keras.backend.resize_images(x, H_factor,W_factor, data_format='channels_first')
使用這個函數的話,我們可以指定其data_format,這樣的話我們就可以開心玩耍了,但是這個函數的侷限性是,他的兩個參數H_factor和W_factor並不是要調整的最終大小,而是一個倍數值。
怎麼理解呢,比如說你現在輸入一個(H1,W1)的tensor,而你現在這兩個參數分別是(Hf,Wf),那麼你最終得到的是(H1*Hf,W1*Wf),並且得到的這兩個數必須是int型的整數,不然會報錯,這也是這個函數的一定侷限性。
Tip:如果你的目標值是Target_h,而你現有值是Now_h,那麼你的H_factor只要取 Target_h / Now_h即可。
你的Now_h,你可以通過K.int_shape(x)[1](對應channel_last)取出來(K是指“ from keras import backend as K”)
(4)上述兩個是針對四維的,另外還有針對五維的,暫時貼出來,用的話可以去這兒查:關於tf的resize函數
tf.keras.backend.resize_volumes(
x,
depth_factor,
height_factor,
width_factor,
data_format
)
定義在:tensorflow/python/keras/backend.py。
調整5D張量中包含的體積。
參數:
- x:要調整大小的Tensor或變量。
- depth_factor:正整數。
- height_factor:正整數。
- width_factor:正整數。
- data_format:可以是"channels_first","channels_last"其中之一。