【问题标题】:Changing the input shape of pre-trained models along with its weights更改预训练模型的输入形状及其权重
【发布时间】:2017-08-27 02:48:51
【问题描述】:

我正在尝试将迁移学习与训练有素的 [3D] CNN 一起使用,我已经训练了模型及其权重。

但问题是它的输入大小为(64,64,7,3),而我的输入大小为(256,256,256,1)。我该如何解决这个问题?

【问题讨论】:

    标签: python tensorflow deep-learning keras conv-neural-network


    【解决方案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'。

    修改:针对您修改后的问题,有几种方法可以获得您想要的尺寸。

    例如,您可以应用与上述相同的逻辑:在网络的开头添加一个或多个 conv3d 层,并选择适当的 kernel_size 和 stride 以获得所需的尺寸。例如:如果添加以下层:

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

    在网络开始时,如果 inputs 是 dim=(None,256,256,256,1) 的张量,您将获得 dim=(None,64,64,7,3) 的张量。您还可以使用 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)
    

    无论如何,有很多方法可以获得您想要的尺寸,并且根据您的问题,您可能更喜欢一种方法而不是另一种方法。

    【讨论】:

    • 道歉。我弄乱了尺寸,现在我已经编辑了帖子。此外,我正在研究 Conv3D 而不是 Conv2D。
    猜你喜欢
    • 1970-01-01
    • 2022-10-07
    • 2020-02-05
    • 2021-07-03
    • 2019-10-20
    • 1970-01-01
    • 2018-06-01
    • 2021-03-30
    • 2018-09-25
    相关资源
    最近更新 更多