繁体   English   中英

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

[英]How to progressively grow a neural network in pytorch?

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

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

通过渐进式自动编码器,我假设您所指的是先锋网络之类的东西:渐进式生成自动编码器 ,其中提到了GAN的渐进式增长以提高质量,稳定性和变化性

首先,不要使用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通道输出。 在完成第一阶段后,可以将其丢弃。

还有其他一些技术,例如使用本文所述的权重术语逐渐淡入淡出。 我建议您阅读它们,尤其是第二篇。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM