【问题标题】:How to progressively grow a neural network in pytorch?如何在 pytorch 中逐步增长神经网络?
【发布时间】:2019-01-04 02:26:26
【问题描述】:

我正在尝试制作一个渐进式自动编码器,并且我想了几种在训练期间扩展我的网络的方法。但是,我总是卡在这一部分,我不知道更改输入(编码器)和输出(解码器)通道是否会影响我的网络。请参阅下面的示例。

X = torch.randn( 8, 1, 4, 4,) # A batch of 8 grayscale images of 4x4 pixels in size

Encoder = nn.Sequential( Conv2D( 1, 16, 3, 1, 1 ), nn.ReLU() ) # starting setup 16 3x3 kernels

如果我从网络打印上述权重,我会得到 [1, 16, 3, 3] 的大小,每个大小为 3x3 的 16 个内核 如果我想扩大网络,我需要节省这些权重,因为希望它已经在那些 4x4 图像输入上训练有素。

X = torch.randn( 8, 1, 8, 8) # increase the image size from 4x4 to 8x8

...
new_model = nn.Sequential()

then do...
# copy the previous layer and its weights from the original encoder 

# BTW My issue starts here.

# Add/grow the new_model with new layers concat with the old layer, also modify the input channela so they can link correctly

# Final result would be like something below.

new_model = nn.Sequential( Conv2D( **1**, 8, 3, 1, 1 ), nn.ReLU(), Conv2D( **8**, 16,  3, 1, 1 ), nn.ReLU()   )

Encoder = new_model

# Repeat process

一切看起来都不错,但是因为我更改了输入通道,权重的大小也发生了变化,这是我一直坚持一段时间的问题。您可以通过运行简单地检查这一点,

foo_1 = nn.Conv2d(1, 1, 3, 1, 1) # You can think this as the starting Conv2D from the starting encoder

foo_2 = nn.Conv2d(3, 1, 3, 1, 1) # You can think this as the modfiied starting Conv2D with an outer layer outputting 3 channels connecting to it  

print(foo_1.weight.size()) # torch.Size([1, 1, 3, 3])

print(foo_2.weight.size()) # torch.Size([1, 3, 3, 3])

最初,我认为 foo_1 和 foo_2 的权重大小相同,因为两者都只使用一个 3x3 内核,但事实并非如此。我希望你现在能看到我的困境,经过 x 个时期后,我需要增加另一个卷积,我必须弄乱输入大小才能正确地制作新层链,但是如果我改变输入大小,权重的形状会有所不同并且我不知道如何粘贴旧状态。

我一直在研究 pytorch 和 IMO 中的 pro gan 实现,它们不容易阅读。我如何建立更多机构来正确逐步发展您的网络?

【问题讨论】:

    标签: python machine-learning conv-neural-network pytorch autoencoder


    【解决方案1】:

    通过渐进式自动编码器,我假设您指的是 Pioneer Networks: Progressively Growing Generative Autoencoder 之类的东西,它指的是 Progressive Growing of GANs for Improved Quality, Stability, and Variation

    首先,不要使用nn.Sequential。它非常适合对简单直接的网络结构进行建模,这里绝对不是这种情况。您应该使用简单的nn.Conv2dF.ReLU 模块而不是构建nn.Sequential 对象。

    其次,这实际上不是关于实施,而是关于理论。您不能神奇地将卷积层从接受 1 个通道转换为 8 个通道。有很多方法可以扩展你的卷积过滤器,比如附加随机权重,但我认为这不是你想要的。

    从第二篇论文(它是一个GAN,但是思路是一样的),它没有扩展任何过滤器。相反,过滤器在整个训练过程中保持其形状。这意味着,你会有一个

    Conv2D(8, 16, 3, 1, 1)
    

    从一开始(假设您只有这两层)。一个明显的问题出现了——你的灰度图像是一个 1 通道输入,但你的卷积在训练的第一阶段需要一个 8 通道输入。在第二篇论文中,它使用了一个额外的 1x1 卷积层来映射 RGB 特征图。在你的情况下,那将是

    Conv2D(1, 8, 1)
    

    将 1 通道输入映射到 8 通道输出。完成第一阶段后,可以将其丢弃。

    还有其他技术,例如使用论文中所述的权重项逐渐淡化。我建议你阅读它们,尤其是第二个。

    【讨论】:

    • 您好,非常感谢,我已经阅读了 pro gan 论文,终于明白了 toRGB 和 fromRGB 层现在是什么。一切终于有了意义,所以这就是他们所说的淡入图层的意思。你不知道我现在有多高兴,这对我来说是一个重大的困惑和障碍,感谢您解决这个问题!
    • @Inkplay_ 很高兴我能帮上忙!
    猜你喜欢
    • 2013-07-11
    • 2018-12-16
    • 2021-02-07
    • 2021-03-11
    • 2019-03-08
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多