1.安装CornerNet、Anaconda和pytorch遇到的问题
4.tensorflow和pytorch指定多GPU进行运算
5.pytorch和tensorflow中的tensor与numpy转换
6.pytorch数据的并行计算(DataParallelism)
1. 安装CornerNet、Anaconda和pytorch遇到的问题
Anaconda在2019年5月已经禁止使用国内镜像了,因此下面方法已经用不了了,权当做留念,以后只能使用官方提供的来安装,速度慢点就慢点吧。
用conda安装Pytorch过程中会连接失败,这是因为Anaconda.org的服务器在国外。可以用清华TUNA镜像源,包含Anaconda仓库的镜像,将其加入conda的配置,配置如下:
- 添加清华镜像
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
切换回默认镜像源,命令一行搞定:
conda config --remove-key channels
如果想单个删除的话,删除单个链接命令如下:
conda config --remove channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- 然后CornerNet官网会有如下一条命令来创建CornerNet_Lite环境并安装conda_packagelist.txt文档中的各种包:
conda create --name CornerNet_Lite --file conda_packagelist.txt --channel pytorch
但是会出现中断,提示安装失败,因此这里我们应该去掉后面指定channel路径的–channel pytorch,即改为:
conda create --name CornerNet_Lite --file conda_packagelist.txt
3.对于安装的pytorch版本问题,在conda_packagelist.txt需要把pytorch的版本以及cuda的版本根据电脑驱动版本来改过来。由于电脑cuda版本是9.0,而他的文件中却是10.0,因此需要做出以下更改:
(1) cuda100=1.0=0 改为 cuda90=1.0.0
(2) pytorch=1.0.0=py3.7_cuda10.0.130_cudnn7.4.1_1 改为pytorch=1.0.0=py3.7_cuda9.0.176_cudnn7.4.1_1
4. 如果怎么安装都出错,就卸载Anaconda后重新装Anaconda,再试一遍,应该能解决问题。卸载Anaconda参考https://blog.csdn.net/yeler082/article/details/79116490
5.遇到ValueError:numpy.ufunc size changed,may…的问题,解决方法是把numpy升级到1.16.1版本,pip install numpy==1.16.1。不过我上次遇到这种问题是由于没装好pytorch或者Anaconda。最后装好了之后就不会出现这种情况。
6.python图像处理问题
AttributeError: ‘NoneType’ object has no attribute ‘shape’
原因:
(1) 图片不存在(路径不存在, 路径包含中文无法识别)
(2) 读取的图片内容和默认读取时参数匹配不匹配。(默认读取的是3通道的彩色图)例如读取到的图片是灰度图,就会返回None。
(3)路径中有中文。
7.命令
(1) 安装完anaconda后终端默认会出来一个(base),可使用conda deactivate
命令去掉,不过有没有不影响。
(2) 创建zhz环境
conda create --name zhz
也可以使用例如
conda create --name CornerNet_Lite --file conda_packagelist.txt --channel pytorch
的命令通过pytorch官网安装conda_packagelist.txt文件下的所有安装包。conda_packagelist.txt由我们自己随意决定想安装哪些包,我们可以通过指定–chanel来从清华镜像源安装更快,参考5.1, 5.2。
(3) 进入zhz环境
source activate zhz
(4) 退出zhz环境
source activate
2. 安装tensorflow-gpu版本
使用anaconda安装tensorflow的环境:python3.5.6+tensorflow-gpu==1.12.0+cuda9.0.176+cudnn7.1.4安装成功
由于tensorflow目前不支持Python3.7,因此在系统中再安装一个Python版本,以python3.5.6为例:
1.安装好Python3.5.6: 参考:https://www.cnblogs.com/ningvsban/p/4384995.html
2.在anaconda下创建名为“tensorflow”并且Python环境为3.5版本的环境:
conda create --name tensorflow python=3.5 #
3.安装tensorflow
系统默认安装tensorflow版本:
pip install tensorflow-gpu
安装指定版本的tensorflow:
pip install tensorflow-gpu==1.12.0
如果你下载了某个版本的tensorflow-gpu到本地,可以这么安装:
pip install tensorflow_gpu-0.12.0-cp35-cp35m-manylinux1_x86_64.whl
测试tensorflow是否安装成功:
进入Python
import tensorflow as tf
tf.__version__
3.pytorch安装
建议0.4.0版本最合适,不要安装最新版。
我电脑和服务器版本都是cuda=9.0.176 + cudnn=7.1.4 + 1050Ti(我)+1080Ti(服务器)
版本推荐:pytorch-0.4.0 + torchvision-0.1.8 + python=3.5.4
在http://download.pytorch.org/whl/cu90/torch-0.4.0-cp35-cp35m-linux_x86_64.whl 可下载pytorch-0.4.0版本,python=3.5.4.
如果想安装别的版本,例如1.0.1版本,只需要把上面网址中的0.4.0改为1.0.1即可。
还要安装numpy之后才能import torch成功,否则只会安装torch成功,导入会失败
也可在清华源镜像中下载各pytorch安装包,不过下载下来的是压缩包(我还没有查阅怎么使用这种安装),不是whl格式的文件,: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64/
另 torchvision安装0.1.8合适。因为更高的版本有些东西被弃用了,很多程序都运行不了,改起来很麻烦。
安装方法:下载pytorch-0.4.0版本的whl文件
pip install torch-0.4.0-cp35-cp35m-linux_x86_64.whl
pip install torchvision==0.1.8
不能直接安装pip install torchvision不指定版本,否则会自动安装最高版本的torchvision,然后就自动把pytorch版本也升级了。
4.tensorflow和pytorch指定多GPU进行运算
tensorflow和pytorch指定多GPU的话,对应的语句首先改成:
CUDA_VISIBLE_DEVICES=0,1 python my_script.py
CUDA_VISIBLE_DEVICES=2,3 python my_script.py
CUDA_VISIBLE_DEVICES=0,1,2,3 python my_script.py
或者:
os.environ[“CUDA_VISIBLE_DEVICES”] = “0,1,2,3” #一定要加引号
在tensorflow中可以使用
with tf.device('/gpu:0'):
这样的方式来指定GPU进行某部分运算。
5.pytorch和tensorflow中的tensor与numpy转换
5.1 pytorch的tensor与numpy数组转换
pytorch的tensor对象与numpy数组是可以相互转换的,且numpy数组的默认类型是double.
(1)tensor转numpy:
# a是 <class ‘torch.Tensor’>
# b和c是 <class ‘numpy.ndarray’>
a = torch.ones(2,2)
b = a.numpy() # 方法1
c=np.array(a) # 方法2,也可以转numpy数组
(2)numpy转tensor:
# a是 <class ‘numpy.ndarray’>
# b和c是 <class ‘torch.Tensor’>
a = np.ones(5)
b = torch.from_numpy(a) # 方法1
c=torch.Tensor(a) # 方法2,也可以转pytorch Tensor
5.2 TensorFlow中 tensor与numpy数组转换
(1) ndarray 转化为 tensor
TensorFlow 通过 convert_to_tensor 这个函数进行转换,代码如下:
# 创建ndarray
array = np.array([1, 2, 3, 4], np.float32)
# 将ndarray转化为tensor
t = tf.convert_to_tensor(array, tf.float32, name='t')
print(t)
Tensor("t:0", shape=(4,), dtype=float32)
(2) tensor转化为ndarray
方法1:直接转化
# 创建张量
t = tf.constant([1, 2, 3, 4], tf.float32)
session = tf.Session()
array = session.run(t) # 张量转化为ndarray
print(type(array))
print(array)
<class 'numpy.ndarray'>
[ 1. 2. 3. 4.]
方法2: 利用Tensor的成员函数eval
t = tf.constant([1, 2, 3, 4], tf.float32)
session = tf.Session()
array = t.eval(session=session) # 张量转化为ndarray
print(type(array))
print(array)
<class 'numpy.ndarray'>
[ 1. 2. 3. 4.]
上面这种方法也可以这么写
t = tf.constant([1, 2, 3, 4], tf.float32)
# 张量转化为ndarray
with tf.Session() as session:
array = t.eval()
print(type(array))
print(array)
<class 'numpy.ndarray'>
[ 1. 2. 3. 4.]
6.pytorch数据的并行计算(DataParallelism)
摘自:https://blog.csdn.net/Alawaka2018/article/details/80993197
.to(device)
\left( \frac{ \frac{x_b - x_a}{w_a} - \mu_x }{\sigma_x}, \frac{ \frac{y_b - y_a}{h_a} - \mu_y }{\sigma_y}, \frac{ \log \frac{w_b}{w_a} - \mu_w }{\sigma_w}, \frac{ \log \frac{h_b}{h_a} - \mu_h }{\sigma_h}\right)
7.Pytorch查看可训练参数,添加no bias decay实现
参考:https://blog.csdn.net/jeryjeryjery/article/details/83057199
遍历named_parameters()中的所有的参数,只打印那些param.requires_grad=True的变量,就是模型中所有的可训练参数列表
model.parameters()只有数值,model.named_parameters()既有名称,也有数值,model.parameters()就是从model.named_parameters()中提取的数值
for name, param in model.named_parameters():
if param.requires_grad:
print(name)
下面是对params进行修改,只对权重进行衰减,不对偏置衰减:
import torch.optim as optim
### no bias decay
## 把model.named_parameters参数中的偏置和权重分别添加到各自的列表中。
## 由于model.named_parameters()中只有(卷积层和BN层的)权重和偏置,所以optim.SGD()中的model.parameters()可以用weight_p, bias_p代替。
weight_p, bias_p = [],[]
for name, p in model.named_parameters():
if 'bias' in name:
bias_p += [p]
else:
weight_p += [p]
for name, param in model.named_parameters():
if param.requires_grad:
print(name)
# Optimizer
# optimizer = optim.SGD(model.parameters(), lr=hyp['lr0'], momentum=hyp['momentum'], weight_decay=hyp['weight_decay'],
# nesterov=True)
optimizer = optim.SGD([{'params': weight_p, 'weight_decay': hyp['weight_decay']},
{'params': bias_p, 'weight_decay': 0}],
lr=hyp['lr0'],
momentum=hyp['momentum'],
nesterov=True)
可能在加入no bias decay的代码后,会出现下面的错误,原因是因为你需要重头开始训练,而不能在某个epoch中断训练后修改代码添加进no bias decay之后从检查点恢复训练,
你都把可训练参数修改进了weight_p, bias_p了,自然找不到之前训练的参数了。
Traceback (most recent call last):
File "train.py", line 391, in <module>
accumulate=opt.accumulate)
File "train.py", line 153, in train
optimizer.load_state_dict(chkpt['optimizer'])
File "/usr/local/lib/python3.5/dist-packages/torch/optim/optimizer.py", line 110, in load_state_dict
raise ValueError("loaded state dict has a different number of "
ValueError: loaded state dict has a different number of parameter groups
8.Pytorch冻结梯度,只训练某几层网络权重
具体实例及讲解参考 https://blog.csdn.net/u012436149/article/details/66971822
这里讲一下requires_grad和volatile:
(1)在训练时如果想要固定网络的底层,那么可以令这部分网络对应子图的参数requires_grad为False。这样,在反向过程中就不会计算这些参数对应的梯度。
(2)Variable的参数volatile=True和requires_grad=False的功能差不多,但是volatile的力量更大。当有一个输入的volatile=True时,那么输出的volatile=True。volatile=True推荐在模型的推理过程(测试)中使用,这时只需要令输入的voliate=True,保证用最小的内存来执行推理,不会保存任何中间状态。
9.安装anaconda后取消命令行前出现的base
安装conda后取消命令行前出现的base,取消每次启动自动激活conda的基础环境
参考: https://blog.csdn.net/u014734886/article/details/90718719
方法一:
每次在命令行通过conda deactivate
退出base环境回到系统自动的环境
方法二
1,通过将auto_activate_base参数设置为false实现:
conda config --set auto_activate_base false
2,那要进入的话通过conda activate base
3,如果反悔了还是希望base一直留着的话通过conda config --set auto_activate_base true
来恢复