gpt4 book ai didi

python - 如何在 pytorch 中逐步发展神经网络?

转载 作者:行者123 更新时间:2023-11-30 09:46:42 25 4
gpt4 key购买 nike

我正在尝试制作一个渐进式自动编码器,并且我想到了几种在训练期间扩展网络的方法。然而,我总是停留在这一部分,我不知道更改输入(编码器)和输出(解码器) 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.Conv2dF.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com