如何在PyTorch中逐步扩展神经网络?

我正在尝试制作一个渐进式自编码器,并且已经考虑了几种在训练过程中扩展网络的方法。然而,我总是卡在一个部分,我不知道改变输入(编码器)和输出(解码器)的通道是否会影响我的网络。请看下面的例子。

X = torch.randn( 8, 1, 4, 4,) # 8张4x4像素大小的灰度图像的批次Encoder = nn.Sequential( Conv2D( 1, 16, 3, 1, 1 ), nn.ReLU() ) # 初始设置,16个3x3的卷积核

如果我打印网络中的上述权重,我会得到大小为[ 1, 16, 3, 3 ]的权重,16个3×3的卷积核。如果我想扩展网络,我需要保存这些权重,因为希望它们已经在这些4×4的图像输入上训练得很好。

X = torch.randn( 8, 1, 8, 8) # 将图像大小从4x4增加到8x8...new_model = nn.Sequential()然后执行...# 复制原始编码器中的前一层及其权重# 顺便说一下,我的问题从这里开始。# 用新层扩展/增长new_model,并与旧层连接,同时修改输入通道以便它们能正确连接# 最终结果可能会像下面这样。new_model = nn.Sequential( Conv2D( **1**, 8, 3, 1, 1 ), nn.ReLU(), Conv2D( **8**, 16,  3, 1, 1 ), nn.ReLU()   )Encoder = new_model# 重复过程

一切看起来都不错,但是因为我改变了输入通道,权重的大小也随之改变,这就是我一直卡住的问题。你可以通过运行以下代码简单地检查这一点,

foo_1 = nn.Conv2d(1, 1, 3, 1, 1) # 你可以认为这是初始编码器中的起始Conv2Dfoo_2 = nn.Conv2d(3, 1, 3, 1, 1) # 你可以认为这是修改后的起始Conv2D,外部层输出3个通道连接到它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的权重大小会相同,因为两者都只使用一个3×3的卷积核,但事实似乎并非如此。我希望你现在能明白我的困境,在经过x个epoch后,我需要增加另一个卷积层,我必须调整输入大小以使新层正确连接,但如果我改变输入大小,权重的形状就会不同,我不知道如何粘贴旧状态会起作用。

我一直在查看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个通道转换为8个通道。有许多方法可以扩展你的卷积滤波器,比如附加随机权重,但我认为这不是你想要的。

从第二篇论文来看(它是一个GAN,但想法是相同的),它并没有扩展任何滤波器。相反,滤波器在整个训练过程中保持其形状。这意味着,从一开始你就会有一个

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

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

Conv2D(1, 8, 1)

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

还有其他技术,比如论文中提到的使用权重项逐渐淡入。我建议你阅读它们,尤其是第二篇。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注