- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个渐进式自动编码器,并且我想到了几种在训练期间扩展网络的方法。然而,我总是停留在这一部分,我不知道更改输入(编码器)和输出(解码器) channel 是否会影响我的网络。请参阅下面的示例。
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 ],16 个内核,每个内核大小为 3x3如果我想扩展网络,我需要节省这些权重,因为希望它已经在 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
一切看起来都不错,但是因为我更改了输入 channel ,权重的大小也发生了变化,这是我已经困扰了一段时间的问题。您可以通过运行简单地检查这一点,
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 中的 pro gan 实现,在我看来,它们并不容易阅读。我怎样才能建立更多的机构来正确地逐步发展您的网络?
最佳答案
通过渐进式自动编码器,我假设您指的是类似 Pioneer Networks: Progressively Growing Generative Autoencoder 的东西其中提到Progressive Growing of GANs for Improved Quality, Stability, and Variation .
首先,不要使用nn.Sequential
。它非常适合对简单直接的网络结构进行建模,但这里绝对不是这种情况。您应该使用简单的 nn.Conv2d
、F.ReLU
模块,而不是构建 nn.Sequential
对象。
其次,这实际上不是关于实现,而是关于理论。您无法神奇地将卷积层从接受 1 个 channel 转换为 8 个 channel 。有多种方法可以扩展您的卷积滤波器,例如附加随机权重,但我认为这不是您想要的。
从第二篇论文(它是一个GAN,但思想是一样的)来看,它没有扩展任何过滤器。相反,过滤器在整个训练过程中保持其形状。这意味着,你会有一个
Conv2D(8, 16, 3, 1, 1)
从一开始(假设您只有这两层)。一个明显的问题出现了——你的灰度图像是 1 channel 输入,但你的卷积在训练的第一阶段需要 8 channel 输入。在第二篇论文中,它使用额外的 1x1 卷积层来映射 RGB <-> 特征图。在你的情况下,那就是
Conv2D(1, 8, 1)
将 1 channel 输入映射到 8 channel 输出。完成第一阶段后,可以将其扔掉。
还有其他技术,例如使用论文中所述的权重术语逐渐淡出。我建议您阅读它们,尤其是第二篇。
关于python - 如何在 pytorch 中逐步发展神经网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51549878/
我是一名优秀的程序员,十分优秀!