Ham*_*ard 2 python deep-learning conv-neural-network keras tensorflow
我试图将转移学习与受过训练的[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>)
Run Code Online (Sandbox Code Playgroud)
这种方法的好处是它将从数据中学习从(64,64,64)到(64,64,3)的转换。
话虽如此,我真的不明白为什么您首先要具有(256,256,256)或(64,64,64)的图像。通常,最后一个维度是通道数,通常与“ RGB”一样为3。
编辑:针对已编辑的问题,有几种获取所需尺寸的方法。
例如,您可以应用与上述相同的逻辑:在网络的开头添加一个或多个conv3d层,然后选择适当的kernel_size和跨度以获取所需的尺寸。例如:如果添加以下层:
tf.layers.conv3d(inputs, 3, kernel_size=(193,193,250), strides=(1,1,1))
Run Code Online (Sandbox Code Playgroud)
在网络开始时,如果dim =(None,256,256,256,1)的张量,您将获得dim =(None,64,64,7,3)inputs的张量。您也可以使用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)
Run Code Online (Sandbox Code Playgroud)
无论如何,有很多方法可以获取所需的尺寸,根据您的问题,您可能会首选一种方法。