【踩坑笔记】Pytorch 训练好模型,预测时使用不同的 batch 出来的结果不一样

问题描述:

训练好模型后,单个样本预测的结果,和多个样本批量预测的结果不一样,有时候差异较小,有时候差异较大。

如下图所示,使用 LSTM 做了个 DGA(恶意域名)识别的任务,属于二分类。在输入不同的样本的情况下,返回的结果不一样。相同的样本则结果一致。

在这里插入图片描述

原因分析:

一开始查了一些资料,基本都是说 Norm 层 和 Dropout 层没有禁用的原因,但是代码里面已经加了 model.eval()。后面又试了固定 numpy 和 torch 的随机种子,但还是一样的情况。

# 固定随机种子
np.random.seed(1337)
torch.manual_seed(1337)

–最后–

发现问题出现在 X = torch.nn.utils.rnn.pad_sequence(X, batch_first=True) 这条语句,由于样本数据长短不一,处理的时候都会根据样本情况添加 padding ,统一数据维度。

torch.nn.utils.rnn.pad_sequence 会根据样本的最大长度自动添加填充数据来统一数据维度。如果每次测试输入的样本最大长度不一样,填充的长度也会不同,导致最终的计算结果不一样。

解决方法:

使用固定的序列填充长度即可:

	max_len = 100  # 应和训练时的样本维度一致
	...
	X= torch.nn.utils.rnn.pad_sequence(X, batch_first=True)	
	
	# 对序列进行截断或填充到指定长度
	if X.size(1) < max_len:
	    X = torch.nn.functional.pad(X, (0, max_len - X.size(1)), value=0)
	elif X.size(1) > max_len:
	    X = X[:, :max_len]

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薄荷你玩_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值