我正在嘗試使用訓練有素的[3D]
CNN進行轉移學習,其中我已將訓練好的模型與其權重一起使用。更改預訓練模型的輸入形狀及其權重
但問題是輸入大小爲(64,64,7,3)
,而輸入大小爲(256,256,256,1)
。我怎麼能解決這個問題?
我正在嘗試使用訓練有素的[3D]
CNN進行轉移學習,其中我已將訓練好的模型與其權重一起使用。更改預訓練模型的輸入形狀及其權重
但問題是輸入大小爲(64,64,7,3)
,而輸入大小爲(256,256,256,1)
。我怎麼能解決這個問題?
下面是一個解決方案:一旦它減少到(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.reshape
,tf.image.resize_images
,tf.transpose
,tf.concat
,tf.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)
無論如何,有很多方法可以得到你想要的尺寸,並根據您的問題,你可能更喜歡另一種方法。
道歉。我弄亂了尺寸,現在我編輯了這篇文章。而且,我正在研究Conv3D而不是Conv2D。 – Hamdard