pytorch打印网络层梯度,保存结果到excel


def save_excel(netName, dataDict,colNames=None,):
    # pf = pd.DataFrame(list(dataDict))
    # order = list[dataDict.keys()]
    # pf = pf[order]
    # pf.rename(columns=order, inplace=True)
    # file_path = pd.ExcelWriter('compdata.xlsx')
    # pf.fillna(' ', inplace=True)
    # pf.to_excel(file_path, encoding='utf-8', index=False)
    # file_path.save()
    if not colNames:
        colNames = ['global_step', 'module.layer1.0.conv1.weight','module.layer2.0.conv1.weight',
                    'module.layer3.0.conv1.weight','module.layer4.0.conv1.weight']
    excelName = netName+'.xls'
    if not os.path.exists(excelName):
        # os.system(r'touch {}'.format(excelName))
        excel = xlwt.Workbook(encoding='utf-8')
        sheet1 = excel.add_sheet(netName)
        excel.save(excelName)

        r_xls = open_workbook(excelName)
        row = r_xls.sheets()[0].nrows  # rows number exist
        excel = copy(r_xls)
        worksheet = excel.get_sheet(0)
        for colIdx, colName in enumerate(colNames):
            worksheet.write(row, colIdx, colName)
        excel.save(excelName)

    r_xls = open_workbook(excelName)
    row = r_xls.sheets()[0].nrows  # rows number exist
    excel = copy(r_xls)
    worksheet = excel.get_sheet(0)

    for colIdx,colName in enumerate(colNames):
        v = dataDict[colName]
        if isinstance(v,torch.Tensor): v = v.item()
        worksheet.write(row, colIdx,v)
    excel.save(excelName)

def print_bpGrad(netName, globalStep, net,):
    grads = {}
    grads['global_step'] = globalStep

    for name, parms in net.named_parameters():
        if '0.conv1' in name: # input from layer1 to layer4, 0.conv1 is input conv / last back conv of every block
            if isinstance(parms.grad, torch.Tensor):
                meanGrad = torch.mean(parms.grad).item()
                # print('net', netName, '-->name:', name, '-->grad_requirs:', parms.requires_grad,
                #       ' -->Mean grad_value:', meanGrad)
                grads[name] = meanGrad
            else:
                print('net', netName, '-->name:', name, '-->grad_requirs:', parms.requires_grad)
    # if 'backbone' in netName: save_excel(netName, grads)
    print(['%s %.4f'%(k.replace('module.','',1).replace('.weight','',1),grads[k]) for k in grads.keys()])
    return grads

调用1:

print_bpGrad('backbone1', global_step, backbone)

调用2:

losses = {'global_step':global_step, 'loss1':loss1.avg, 'loss2':loss2.avg}
save_excel('loss', losses, ['global_step', 'loss1','loss2'])

另一种:(和上面的方法结果好像不一样,每次出来的梯度值都是相同的,还不知道为什么)
这种写法不一定能用。。

 if global_step % logInterv ==0:
      params = dict(backbone.named_parameters())
      v = [params[names[0]].data,params[names[1]].data,params[names[2]].data,params[names[3]].data]
      v = [torch.mean(i).item() for i in v]
      prtStr = '%d\t%.4f\t%.4f\t%.4f\t%.4f' % (global_step, v[0], v[1], v[2], v[3])
      print('backbone1',prtStr)
      f1.write(prtStr + '\n')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值