做项目有用的知识记录(持续更新)

1.这里的file_name必须是文件的绝对路径,否则找不到

with open(file_name, 'rb+') as f:
    tempdata = pickle.load(f)

2.把数据和模型放到GPU上跑,涉及到的代码

# 首先指定device
# 注:这行代码是写到main里面的
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 把模型放到device上 在指定model的时候一起放到device上即可
model = SeUnet(1,1).to(device)

# 下一步把数据放到device上
# 注:这两行代码时写到函数里面的
inputs = input.float().to(device) # 把数据传到gpu上
target = target.float().to(device)

3.import的导入顺序

(1)python的标准库 e.g.os sys

(2)python的第三方库 e.g.numpy torch

(3)自定义的包 e.g.from dataset.dataset import RedHouse

import 的搜索顺序

(1)内建模块(python3.X在buildins中存储)

(2)如果内建模块没有,就去sys.path的list去找

import os
os.environ['CUDA_VISIBLE_DEVICES']='0'

4.将当前机器conda中的环境打包传到另一个机器上

scp -r RedHouse/ lpy@49.52.XXX.XXX:~/anaconda3/envs/

5.单机多GPU运行程序(需要修正!!!!)

import torch.nn as nn

# device是前面指定好的 放到GPU上
model = SeUnet(1,1).to(device)
model = nn.DataParallel(model,device_ids=[0,1,2,3])

注意这个时候batchsize的设置是对所有卡总和 比如我的batchsize设为64 我有4块卡 那么我每块卡上的bz相当于16

详细解答请参考:https://www.jianshu.com/p/9e36e5e36638?utm_source=oschina-app

今天(20200604)我用多卡跑的时候出现了报错以下是报错信息:

分析原因:

我最开始的时候指定了可用的GPU_id是实际物理的第1和第2块(系统忽略第0块和第四块) 

os.environ['CUDA_VISIBLE_DEVICES']='1,2'

而我在下面这行代码中写了程序执行的GPU是第1块和第2块,所以报错。

    model = nn.DataParallel(model,device_ids=[1, 2])

因为我之前为程序指定了两块可用的GPU 所以程序可用的GPU只有0和1,最多两块 id为2肯定会报错。这里要区分物理GPU_id和程序GPU_id。可以再次理解一下os.environ这个函数的作用。

6.在我用多块卡跑完之后,test.py报错:

 错误原因:加载模型时参数不匹配

从属性state_dict里面复制参数到这个模块和它的后代。如果strict为True, state_dict的keys必须完全与这个模块的方法返回的keys相匹配。如果为False,就不需要保证匹配。

Arguments:
state_dict (dict): a dict containing parameters and persistent buffers.
strict (bool, optional): whether to strictly enforce that the keys in :attr:state_dict match the keys returned by this module’s:meth:~torch.nn.Module.state_dict function. Default: True

改正方法:将strict参数(默认为True)改为False即可

 model.load_state_dict(state_dict, strict=False)

7.torch.cat数据类型要保持一致

torch.cat((), axis = X)

8.plt保存图片

plt.imshow(output,cmap="gray")
plt.axis('off')
  plt.savefig("/home/lpy/redhouse/coverprocess/output/{}.png".format(data[1]+"."+str(data[2])),dpi = 300,bbox_inches = "tight",pad_inches=0.0)

项目中用plt来保存图片,这段代码可以保存成.png图片 且没有axis且无边缘空白的区域。

9.报错"RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR"

查了GitHub上的issues可以尝试 rm-rf ~/.nv(是计算机的缓存数据)

我的原因是GPU内存太小了 等把GPU上的其他case kill掉就能正常运行了。

10.opencv使用时报错

 原因:

cv2.imwrite( , )函数的第一个参数必须指定文件后缀名,比如“1.png”或者“1.jpg”即要指定文件的类型。

11.torch进行阈值划分。

torch提供了很方便的阈值划分方法

output = (output >= Thr)

类比于numpy的np.where(condition, x, y)满足条件为x否则为y,类似于"?"这个运算符

12.总结一下np.repeat和torch的repeat()以及扩展指定维度的方法(为什么他们两个库对应的函数用法不能统一一下呢...呜呜呜呜呜)

首先看到官网的解释:

我们看到官网对各个参数的解释

第一个参数是你想扩展的原数据,数据类型为numpy.array

第二个参数是你想repeat的次数,一般是一个int型数据

第三个参数是你想在array的哪个维度上进行扩展,默认flatten输入,flatten输出

下面举个例子:

接下来我们看torch.repeat()官网解释:

我觉得这个是比较简单的,直接给个例子然后解释吧:

a直接调用其成员函数repeat(),函数的参数分别是各个维度repeat的次数 

和torch的repeat()函数非常像的是np.tile()。同样的我们先来看官网对这个函数的解释

直接来例子吧:

13.报错TypeError: new() received an invalid combination of arguments - got (float, int, int, int, int), but expected of ...

是python的版本问题导致的报错。比如512/2,在python3中的结果是256.0,但是在python2中就是256
解决方法,把/换成//,后者的运算能够保证是int型数据。 

14.显示列表list中每个元素的个数

# 用到pandas处理
import pandas as pd
# raw是我前面用到的一个list
gb_raw = pd.Series(raw) # 数据类型转换
gb_raw = gb_raw.value_counts() # 统计个数
gb_raw.sort_index(inplace = True) #排序
print(gb_raw)

显示结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值