2017-08-27 337 views
0

我正在嘗試使用訓練有素的[3D] CNN進行轉移學習,其中我已將訓練好的模型與其權重一起使用。更改預訓練模型的輸入形狀及其權重

但問題是輸入大小爲(64,64,7,3),而輸入大小爲(256,256,256,1)。我怎麼能解決這個問題?

回答

2

下面是一個解決方案:一旦它減少到(64,64,64),您可以在網絡開始時添加一個1x1 conv2D圖層。這個1x1 conv2D將產生一個(64,64,n),其中n是你想要的單位數量;你的情況3.

在Tensorflow,你會做這樣的:

tf.layers.conv2D(inputs, 3, kernel_size=(1,1), activation=<your_activation>) 

這種方法的好處是,它會從數據學習的轉變,從去(64,64,64 )到(64,64,3)。

話雖如此,我並沒有真正明白爲什麼你首先有一個(256,256,256)或(64,64,64)的圖像。通常情況下,最後一個維度是「RGB」通常爲3的通道數量。

編輯:作爲對您編輯的問題的迴應,您可以通過多種方式獲取所需的尺寸。

例如,您可以應用與上述相同的邏輯:在網絡開始時添加一個或多個conv3d圖層,然後選擇適當的kernel_size和stride來獲取所需的尺寸。例如:如果你添加下面層:在您的網絡開始

tf.layers.conv3d(inputs, 3, kernel_size=(193,193,250), strides=(1,1,1)) 

,你會得到暗淡=張量(無,64,64,7,3)如果inputs是昏暗的張量=(無,256,256,256,1)。你也可以使用3d(max/avg/etc)池層。

和當然,你也可以使用tf.reshapetf.image.resize_imagestf.transposetf.concattf.layers.conv2d等來獲取你想要的尺寸。例如:

inputs = tf.placeholder(<tf.type>, shape=(None,256,256,256,1)) 
a = tf.reshape(inputs, (-1,256,256,256)) # shape=(None,256,256,256) 
b = tf.image.resize_images(a, (64,64)) # shape=(None,64,64,256) 
c = tf.layers.conv2d(b, 7, kernel_size=(1,1)) # shape=(None,64,64,7) 
d = tf.reshape(c, (-1,64,64,7,1)) # shape=(None,64,64,7,1) 
e = tf.layers.conv3d(d, 3, kernel_size=(1,1,1)) # shape=(None,64,64,7,3) 

無論如何,有很多方法可以得到你想要的尺寸,並根據您的問題,你可能更喜歡另一種方法。

+0

道歉。我弄亂了尺寸,現在我編輯了這篇文章。而且,我正在研究Conv3D而不是Conv2D。 – Hamdard

相關問題