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

Python 如何在pytorch中逐步发展神经网络?,python,machine-learning,conv-neural-network,pytorch,autoencoder,Python,Machine Learning,Conv Neural Network,Pytorch,Autoencoder,我正在尝试做一个渐进式的自动编码器,并且我已经想到了一些在培训期间扩大我的网络的方法。然而,我总是停留在这一部分,我不知道改变输入(编码器)和输出(解码器)通道是否会影响我的网络。请参见下面的示例 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() ) # s

我正在尝试做一个渐进式的自动编码器,并且我已经想到了一些在培训期间扩大我的网络的方法。然而,我总是停留在这一部分,我不知道改变输入(编码器)和输出(解码器)通道是否会影响我的网络。请参见下面的示例

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实现,它们不容易阅读。我如何才能建立更多的机构来正确地逐步发展您的网络?

通过渐进式autoencoder,我假设您指的是类似于所提到的内容

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

第二,这不是真正的实现,而是理论。您无法神奇地将卷积层从接受1个通道转换为8个通道。有很多方法可以扩展卷积滤波器,比如添加随机权重,但我认为这不是你想要的

从第二篇论文(它是GAN,但想法是一样的),它没有扩展任何滤波器。相反,过滤器在整个训练过程中保持其形状。也就是说,你会有一个

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

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


还有其他一些技术,如使用论文中所述的权重项时逐渐衰减。我建议您阅读它们,尤其是第二个。

您好,非常感谢您,我已经阅读了pro-gan的论文,终于了解了toRGB和fromRGB层是什么。一切最终都有了意义,所以这就是他们所说的在层中褪色的意思。你不知道我现在有多高兴,这对我来说是一个重大的困惑和障碍,谢谢你澄清这一点@很高兴我能帮上忙!