栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

PyTorch二进制分类-相同的网络结构,“更简单”的数据,但性能较差?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PyTorch二进制分类-相同的网络结构,“更简单”的数据,但性能较差?

TL; DR

您的输入数据未标准化。

  1. 采用
    x_data = (x_data - x_data.mean()) / x_data.std()
  2. 提高学习率
    optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

你会得到

仅1000次迭代即可收敛。

更多细节

这两个示例之间的主要区别在于

x
,第一个示例中的数据以(0,0)为中心,并且方差很小。
另一方面,第二示例中的数据以92为中心,并且具有相对较大的方差。

当您随机初始化权重时,不会考虑数据中的初始偏差,该权重是基于假设输入大致呈​​正态分布在
附近的假设完成的。
优化过程几乎不可能补偿该总偏差-因此模型陷入了次优的解决方案。

将输入标准化后,通过减去平均值并除以std,优化过程将再次变得稳定,并迅速收敛为一个好的解决方案。

有关输入归一化和权重初始化的更多详细信息,您可以阅读 He等人
深入研究整流器:在ImageNet分类中超越人类水平的性能 (ICCV
2015)中的第2.2节。

如果我无法规范化数据怎么办?

如果由于某种原因您无法提前计算均值和标准数据,则仍可以

nn.BatchNorm1d
在训练过程中使用它来估计和标准化数据。例如

class Model(nn.Module):    def __init__(self, input_size, H1, output_size):        super().__init__()        self.bn = nn.BatchNorm1d(input_size)  # adding batchnorm        self.linear = nn.Linear(input_size, H1)        self.linear2 = nn.Linear(H1, output_size)    def forward(self, x):        x = torch.sigmoid(self.linear(self.bn(x)))  # batchnorm the input x        x = torch.sigmoid(self.linear2(x))        return x

这种修改 不会 对输入数据 进行 任何更改,仅在1000个纪元后就会产生类似的收敛性:

轻微评论

为了数值稳定,最好使用

nn.BCEWithLogitsLoss
代替
nn.BCELoss
。为此,您需要
torch.sigmoid
forward()
输出中删除,这
sigmoid
将在损失内进行计算。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/611136.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号