代码常用

Pytorch框架下常见问题

1
2
3
4
5
6
7
8
9
10
11
12
from torchsummary import summary
summary(model, input_size=(C, H, W))

以UNet为例
from torchsummary import summary
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = UNet(in_channels=3).to(device)
print(model) # 打印整个模型框架
parameters = filter(lambda p: p.requires_grad, model.parameters()) # 过滤可训练参数
parameters = sum([np.prod(p.size()) for p in parameters]) / 1_000_000 # 参数大小估计
print('Trainable Parameters: %.3fM' % parameters)
summary(model, input_size=(C, H, W)) # [B, num_classes] or [B, C, H, W] # 测试模型输出
  • 使用torchsummary时的常见问题
1
2
3
4
5
6
7
8
9
10
11
12
报错:AttributeError: 'list' object has no attribute 'size'
原因:传入的是list属性,而不是torch.Tensor(具体原因未知)
解决办法:在torchsummary.py中加条件判断一下即可,在Line 23左右的位置
# 这是源码
summary[m_key]["output_shape"] = [
[-1] + list(o.size())[1:] for o in output
]

# 以下为报错后修改的代码
summary[m_key]["output_shape"] = [
[-1] + list(o.size())[1:] if isinstance(o, torch.Tensor) else [-1] + list(np.array(o).shape)[1:] for o in output
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
报错:IndexError: tuple index out of range
原因:传入的input为None
解决办法:添加判断input是否为None即可
# 这是源码
summary[m_key]["input_shape"] = list(input[0].size())
summary[m_key]["input_shape"][0] = batch_size

# 以下为报错后修改的代码
if len(input) != 0:
summary[m_key]["input_shape"] = list(input[0].size())
summary[m_key]["input_shape"][0] = batch_size
else:
summary[m_key]["input_shape"] = input

  • 重写Dataset类
    所有子类应该override len 和 __getitem__,前者提供了数据集的大小,后者支持整数索引,范围从0到len(self)

  • pytorch实用方法(持续更新)

1
2
3
torch.ones_like(img) # 生成与img形状相同的全1矩阵,下同
torch.zeros_like(img)
with torch.no_grad(): .... # 不构图,即不参与正向/反向传播
  • pytorch模型保存与加载(保存为.pt or .pth)
1
2
3
4
5
6
7
8
9
方式一:保存整个网络结构信息和模型参数信息:
# 保存: torch.save(model_object, './model.pth')
# 加载: model = torch.load('./model.pth')

方式二:只保存网络的模型参数-推荐使用
# 保存: torch.save(model_object.state_dict(), './params.pth')
# 加载: from models import AgeModel
      model = AgeModel()
      model.load_state_dict(torch.load('./params.pth'))

Numpy矩阵运算常见问题

  • Numpy使用np.vstack()和np.hstack()拼接矩阵时匹配维度出错
1
2
3
4
报错:ValueError: all the inputs arrays must have same number of dimensions
解决方法:更换np.vstack()和np.hstack()
np.vstack((a, b)) -> np.row_stack((a, b))
np.hstack((a, b)) -> np.column_stack((a, b))

Opencv-python常见问题

1
2
报错:cv2.error: OpenCV(4.5.2) /tmp/pip-req-build-lnehsv18/opencv/modules/imgcodecs/src/loadsave.cpp:650: error: (-2:Unspecified error) could not find a writer for the specified extension in function 'imwrite_'
解决:保存图片记得加上拓展名 cv2.imwrite('img.png', img)

其他问题

  • 批量升级python所有包(模块)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 桌面创建python文件upgrade.py, 将如下代码拷进去,保存。 使用命令行 python upgrade.py 运行
import pip
import time
from pip._internal.utils.misc import get_installed_distributions
from subprocess import call

for dist in get_installed_distributions():
print(dist.project_name)
print('----------')

for dist in get_installed_distributions():
print("updating:", dist.project_name, "\t")#print log
print(time.asctime( time.localtime(time.time()) ))#print log
call("pip3 install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple " + dist.project_name, shell=True)#调用更新命令
  • 导出当前环境/目录所需包,以及按照requirements.txt批量安装指定的包(模块)
1
2
3
4
5
6
(1) 导出当前环境安装的所有类库(推荐)
pip freeze > requirements.txt
(2) 导出当前项目目录安装的所有类库(推荐)
pip install pipreqs $ pipreqs /path/to/project
(3) 按照requirements.txt批量安装类库
pip install -i requirements.txt
  • 忽略警告信息
1
2
import warnings
warnings.filterwarnings("ignore")
  • 利用代码批量移动文件
1
2
3
import os
cmd = "mv {} {}".format(src_dir, dst_dir) # src_dir可以利用os.listdir()获取
os.system(cmd)
  • Tensorboard、Jupyter notebook和Visdom运行端口的指定
1
2
3
4
5
6
7
8
9
# Tensorboard
终端打开端口 tensorboard --logdir ./ --port=1234

# Jupyter notebook
终端打开端口 jupyter notebook --port=1234

# Visdom
代码中创建环境 vis = visdom.Visdom(env='name', port=1234)
终端打开端口 python -m visdom.server -port=1234

VSCode使用过程中的问题

1
rm -rf .vscode-server
  • SSH远程连接时Downloading with wget…超时
    解决办法:干掉服务器上的.wget-hsts再重新连接
    Downloading with wget超时解决办法
  • 服务器重装系统后,HostKey发生改变,VSCode直接连的话连不上
    解决办法:把本地的.ssh文件夹中的known_hosts文件删掉即可,再次重连服务器会自动生成新的known_hosts文件
    (known_hosts文件路径:C:\Users\lenovo.ssh\known_hosts)
  • VSCode配置Python调试(Debug)环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(1)添加配置(Add Configuration)
(2)将以下代码拷入launch.json即可
注:服务器上配置无需指明Python路径,在左下角选择Python解释器即可
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"stopOnEntry": false,
"program": "${file}",
"cwd": "${workspaceRoot}",
"env": {},
"envFile": "${workspaceRoot}/.env"
}
]
}
  • VSCode切换中英文界面
    1)使用快捷键组合【Ctrl+Shift+p】,在搜索框中输入“configure display language”,点击确定后;
    2)点击zh-CN/en,或者直接修改locale.json文件下的属性“locale”为“zh-CN”;
    3)重启vscode即可;

Jupyter Notebook插件配置

  • 插件库安装及配置
1
2
3
4
5
(1)安装nbextensions插件
pip install jupyter_contrib_nbextensions
(2)配置(注:确保已关闭 Jupyter Notebook)
jupyter contrib nbextension install --user --skip-running-check
(3)启动Jupyter Notebook,在Nbextensions的众多选项中勾选Hinterland,即可
  • 必用插件
    (1)代码块折叠 Codefolding
    (2)显示运行时间 ExecuteTime
    (3)变量高亮显示 Highlight selected word
    (4)代码提示 Hinterland
    (5)代码行号显示 Toggle all line numbers

Linux服务器常用指令

  • 压缩包解压命令
    *.tar文件
1
tar -xvf filename.tar

*.tar.gz和*.tgz文件

1
tar -xzvf filename.tar.gz

*.gz文件

1
2
gunzip filename.gz
gzip -d filename.gz

*.bz2文件

1
2
bunzip2 filename.bz2
bzip2 -d filename.bz2

*.tar.bz2文件

1
2
tar jxvf filename.tar.bz2
tar --bzip xvf filename.tar.bz2

*.zip文件

1
unzip filename.zip

*.rar文件

1
unrar e filename.rar
  • 查看磁盘占用情况
1
du -h --max-depth=0 *