关于requires_grad=True的信息

http://www.itjxue.com  2023-01-06 02:46  来源:未知  点击次数: 

关于detach

将variable参数从网络中隔离开。保持一部分的网络参数不变。

我后来的疑问是,他会在optimizer那里被更新吗?

看到一个解释是“该类的step函数会将构建loss的所有的Variable的参数进行更新”

那么detach的那个变量,就不会更新了。

另一个链接

v_c_detached这个变量是不具有grad这个属性的。而且它和v_c共享一块内存(data)。

因此,detach所做的就是,重新声明一个变量,指向原变量的存放位置,但是requires_grad为false.更深入一点的理解是,计算图从detach过的变量这里就断了, 它变成了一个leaf_node.即使之后重新将它的requires_node置为true,它也不会具有梯度.

pytorch模型文件pth详解

如上打印输出所示,pth文件通过有序字典来保持模型参数。有序字典与常规字典一样,但是在排序操作方面有一些额外的功能。常规的dict是无序的,OrderedDict能够比dict更好地处理频繁的重新排序操作。

OrderedDict有一个方法 popitem(last=True) 用于有序字典的popitem()方法返回并删除一个(键,值)对。如果last为真,则按LIFO顺序返回对;如果为假,则按FIFO顺序返回对。

OrderedDict还有一个方法 move_to_end(key,last=True) ,将现有的键移动到有序字典的两端。如果last为真,则将项目移动到右端(默认);如果last为假,则移动到开头。

如上打印所示,有序字典state_dict中每个元素都是Parameter参数,该参数是一种特殊的张量,包含data和requires_grad两个方法。其中data字段保存的是模型参数,requires_grad字段表示当前参数是否需要进行反向传播。

先建立一个字典,保存三个参数:调用torch.save(),即可保存对应的pth文件。需要注意的是若模型是由nn.Moudle类继承的模型,保存pth文件时,state_dict参数需要由 model.state_dict 指定。

当你想恢复某一阶段的训练(或者进行测试)时,那么就可以读取之前保存的网络模型参数等。

pix2pix网络,Pytorch代码中, valid 和 fake 两个参数表示什么

class UNetDown(nn.Module):

def __init__(self, in_size, out_size, normalize=True, dropout=0.0):

super(UNetDown, self).__init__()

layers = [nn.Conv2d(in_size, out_size, 4, 2, 1, bias=False)]

if normalize:

layers.append(nn.InstanceNorm2d(out_size))

layers.append(nn.LeakyReLU(0.2))

if dropout:

layers.append(nn.Dropout(dropout))

self.model = nn.Sequential(*layers)

def forward(self, x):

return self.model(x)

class UNetUp(nn.Module):

def __init__(self, in_size, out_size, dropout=0.0):

super(UNetUp, self).__init__()

layers = [ nn.ConvTranspose2d(in_size, out_size, 4, 2, 1, bias=False),

nn.InstanceNorm2d(out_size),

nn.ReLU(inplace=True)]

if dropout:

layers.append(nn.Dropout(dropout))

self.model = nn.Sequential(*layers)

def forward(self, x, skip_input):

x = self.model(x)

x = torch.cat((x, skip_input), 1)

return x

class GeneratorUNet(nn.Module):

def __init__(self, in_channels=3, out_channels=3):

super(GeneratorUNet, self).__init__()

self.down1 = UNetDown(in_channels, 64, normalize=False)

self.down2 = UNetDown(64, 128)

self.down3 = UNetDown(128, 256)

self.down4 = UNetDown(256, 512, dropout=0.5)

self.down5 = UNetDown(512, 512, dropout=0.5)

self.down6 = UNetDown(512, 512, dropout=0.5)

self.down7 = UNetDown(512, 512, dropout=0.5)

self.down8 = UNetDown(512, 512, normalize=False, dropout=0.5)

self.up1 = UNetUp(512, 512, dropout=0.5)

self.up2 = UNetUp(1024, 512, dropout=0.5)

self.up3 = UNetUp(1024, 512, dropout=0.5)

self.up4 = UNetUp(1024, 512, dropout=0.5)

self.up5 = UNetUp(1024, 256)

self.up6 = UNetUp(512, 128)

self.up7 = UNetUp(256, 64)

self.final = nn.Sequential(

nn.Upsample(scale_factor=2),

nn.ZeroPad2d((1, 0, 1, 0)),

nn.Conv2d(128, out_channels, 4, padding=1),

nn.Tanh()

)

def forward(self, x):

# U-Net generator with skip connections from encoder to decoder

d1 = self.down1(x)

d2 = self.down2(d1)

d3 = self.down3(d2)

d4 = self.down4(d3)

d5 = self.down5(d4)

d6 = self.down6(d5)

d7 = self.down7(d6)

d8 = self.down8(d7)

u1 = self.up1(d8, d7)

u2 = self.up2(u1, d6)

u3 = self.up3(u2, d5)

u4 = self.up4(u3, d4)

u5 = self.up5(u4, d3)

u6 = self.up6(u5, d2)

u7 = self.up7(u6, d1)

return self.final(u7)

---------------------

使用python在GPU上构建和训练卷积神经网络

我将对代码进行补充演练,以构建在数据集上训练的任何类型的图像分类器。在这个例子中,我将使用花卉数据集,其中包括102种不同类型的花。需要数据集和代码都可以私信我。

Pytorch是机器学习和Python上的免费软件包,非常易于使用。语法模拟numpy,因此,如果你在python中有一些科学计算经验,那么会相当有用的。只需几行代码,就可以下载预先训练的数据集,使用定义的变换对图像进行标准化,然后运行训练。

创建和扩充数据集

为了增加数据集,我使用' google_images_download'API 从互联网上下载了相关图像。显然,您可以使用此API不仅可以扩充现有数据集,还可以从头开始创建自己的数据集。

确保从图像中挑选出异常值(损坏的文件或偶然出现的无关图像)。

图像标准化

为了使图像具有相同的大小和像素变化,可以使用pytorch的transfors模块:

转移学习

从头开始训练的模型可能不是最明智的选择,因为有许多网络可用于各种数据集。简单地说,像edge-和其他简单形状检测器等低级特征对于不同的模型是相似的,即使clasificators是针对不同目的进行训练的。在本项目中,我使用了一个预训练网络Resnet152,只有最后一个完全连接的层重新用于新任务,即使这样也会产生相当好的效果。

在这里,我将除最后一层之外的所有层都设置为具有固定权重(requires_grad = False),因此只有最后层中的参数将通过梯度下降进行更新。

训练模型

下面介绍一下进行训练的函数:

如何获得GPU?

当然,对CPU的训练太慢了。根据我自己的经验,在GPU仅需要一个小时就可以完成12次训练周期,但是在CPU上相同数量的训练周期可能需要花费大约15个小时。

如果您没有本地可用的GPU,则可以考虑使用云GPU。为了加速CNN的训练,我使用了floydhub()上提供的云GPU 。

这项服务非常指的使用:总有很好的文档和大量的提示,所以你会很清楚的知道下一步需要如何去做。在floydhub上对于使用GPU的收费也是可以接受的。

首先,需要将数据集上传到服务器

然后,需要创建项目。需要在计算机上安装floydhub客户端,将数据集上载到其网站并在终端中运行以下命令:

其中'username'是您的登录名,'i'是数据集所在的文件夹。

这样子在训练网络时就会很轻松了

结果和改进想法

得到的模型在数据集上训练了1.5小时,并在验证数据集上达到了95%的准确度。

(责任编辑:IT教学网)

更多

推荐CSS教程文章