Pytorch半精度训练(以两层BP网络为例) 与正常训练对比及loss可视化

Pytorch半精度训练,只需要修改以下内容:
Variables:

x,y = x.cuda().half(),y.cuda().half()

model:

model.cuda().half()

以两层累积BP网络为例,数据采用西瓜数据集3.0,分别使用全精度训练和半精度训练,发现在本文中网络很小的情况下,二者的loss曲线几乎是一样的(见下图),二者的测试结果也是一样的。

另外,使用Adam优化器注意需要设置eps参数,否则loss会报NaN:
使用SGD优化器则没有这个问题。

optimizer = optim.Adam(self.model.parameters(), lr=0.8,eps=1e-3)

Adam出现NaN的问题在这个博客中有具体提到。

完整代码

# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
import torch
import torch.nn as nn
from torch.autograd import Variable
import torchvision.datasets as dset
import torchvision.transforms as transforms
import torch.nn.functional as F
import torch.optim as optim
seed = 2019
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)  # if you are using multi-GPU.
import random
np.random.seed(seed)  # Numpy module.
random.seed(seed)  # Python random module.
torch.manual_seed(seed)

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.close('all')

def preprocess(data):
    #将好瓜坏瓜映射为1/0
    for title in data.columns:
        if data[title].dtype=='object':
            encoder = LabelEncoder()
            data[title]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值