我正在尝试使用经过训练的CNN转移学习,我已经训练了模型及其权重 .
但问题是输入大小为 (64,64,7,3) 而输入大小为 (256,256,256,1) . 我该如何解决这个问题?
(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)的图像 . 通常,最后一个维度是通道的数量,通常为3,类似于'RGB' .
Edit :在回答您编辑的问题时,有几种方法可以获得所需的尺寸 .
例如,您可以应用与上述相同的逻辑:在网络的开头添加一个或多个conv3d层,并选择适当的kernel_size并跨步以获得所需的维度 . 例如:如果添加以下图层:
tf.layers.conv3d(inputs, 3, kernel_size=(193,193,250), strides=(1,1,1))
在你的网络开始时,如果 inputs 是dim =(无,256,256,256,1)的张量,你将得到一个dim =(None,64,64,7,3)的Tensor . 您还可以使用3d(max / avg / etc)池图层 .
inputs
当然,您也可以使用 tf.reshape , tf.image.resize_images , tf.transpose , tf.concat , tf.layers.conv2d 等来获得您想要的尺寸 . 例如:
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)
无论如何,有很多方法可以获得您想要的尺寸,并且根据您的问题,您可能更喜欢一种方法而不是另一种方法 .
1 回答
这是一个解决方案:一旦减少到(64,64,64),您可以在网络的开头添加1x1 conv2D层 . 这个1x1 conv2D将产生一个(64,64,n),其中n是你想要的单位数;在你的情况下3 .
在Tensorflow中,你会这样做:
这种方法的好处是它将从数据中学习从(64,64,64)到(64,64,3)的转换 .
话虽如此,我并没有真正理解为什么你有一个(256,256,256)或(64,64,64)的图像 . 通常,最后一个维度是通道的数量,通常为3,类似于'RGB' .
Edit :在回答您编辑的问题时,有几种方法可以获得所需的尺寸 .
例如,您可以应用与上述相同的逻辑:在网络的开头添加一个或多个conv3d层,并选择适当的kernel_size并跨步以获得所需的维度 . 例如:如果添加以下图层:
在你的网络开始时,如果
inputs
是dim =(无,256,256,256,1)的张量,你将得到一个dim =(None,64,64,7,3)的Tensor . 您还可以使用3d(max / avg / etc)池图层 .当然,您也可以使用
tf.reshape
,tf.image.resize_images
,tf.transpose
,tf.concat
,tf.layers.conv2d
等来获得您想要的尺寸 . 例如:无论如何,有很多方法可以获得您想要的尺寸,并且根据您的问题,您可能更喜欢一种方法而不是另一种方法 .