tf.image.resize_bilinear的侷限性

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"其中之一。
發佈了15 篇原創文章 · 獲贊 1 · 訪問量 6765
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章