实验室新手进阶之路

实验室新手进阶之路

  • 在linux服务器上安装Anaconda
  • 在linux服务器上安装pytorch
  • 在linux服务器上使用conda
    • 虚拟环境的使用
    • 包的管理
  • 在linux服务器上使用git clone
  • 常用linux命令
    • 基础款
    • 在 linux 终端下载文件
    • Linux命令不受终端断开的影响,保持在后台运行
    • linux+git
    • 监控服务器状态
  • 图像分割入门:Unet
  • 下载脑卒中数据集
  • 语义分割评价指标
  • 数据集读取
  • MICCAI公开数据集划分train/val/test
  • loss不下降
  • 在linux服务器上使用Tensorboard可视化
  • 跑Unet3d+Atlas v2
  • Windows使用git clone遇到的各种问题
    • 问题1
    • 问题2
  • Transformer学习
  • Pytorch多卡运行
  • nnUnet学习
  • 分割学习

在linux服务器上安装Anaconda

本科阶段没学过linux真的很伤~~完全看不懂那些命令。

参考博客:
如何在Linux服务器上安装Anaconda(超详细)

简单记录几点博客里没写但我遇到的:

  • 忘记输入yes默认配置环境变量。所以需要在.bashrc文件中加添加环境变量的命令,再执行一次.bashrc文件。最大的困难是我不会写对应的linux命令。
cd 进入/home/xxx
vim .bashrc # 打开.bashrc文件
i # 进入编辑模式
在最后一行添加 export PATH=/home/xxx/anaconda3/bin:$PATH # 具体路径看自己
按esc退出编辑模式
:wq # 保存并关闭文件
source .bashrc # 激活环境
anaconda -V # 测试是否成功,V要大写
conda -V # V要大写

在linux服务器上安装pytorch

使用的服务器是RTX3090+CUDA11.4,网上通用的一些方法试过了没啥用,包括清华镜像、阿里云镜像啥的,也不能安装CUDA10.2后续跑不了代码,最后终于找到了一篇博客教程,顺利安装:
3090显卡(CUDA11.1)安装Pytorch
不需要挂梯子,运行下面的命令即可:

pip install torch===1.7.1+cu110 torchvision===0.8.2+cu110 torchaudio===0.7.2 -f https://download.pytorch.org/whl/torch_stable.html

在linux服务器上使用conda

windows和linux使用conda的命令也小有差异,以下纪录conda的。

虚拟环境的使用

# 创建虚拟环境
conda create -n your_env_name python=3.7    

# 激活虚拟环境
source activate your_env_name

# 关闭虚拟环境
source deactivate your_env_name

# 删除虚拟环境
conda remove -n your_env_name  --all

# 删除虚拟环境中的包
conda remove --name $your_env_name  $package_name

包的管理

conda install package_name

# 镜像源
pip install package_name -i https://pypi.tuna.tsinghua.edu.cn/simple/

conda uninstall package_name

conda remove package_name

# conda安装信息
conda info

# 查看conda帮助
conda help

# 列出环境
conda env list

在linux服务器上使用git clone

真的有用!
在ubuntu上使用git克隆github上的项目

常用linux命令

基础款

# 列出当前目录下的文件和文件夹
ls(list) 

# 列出文件和文件夹的详细信息
ls -l 

# 新建路径a
mkdir a(make directory) 

# 创建文件
touch 文件名

# 进入a路径
cd a 

# 上一级目录
../ 

# 当前目录
./ 

# 查看当前路径
pwd 

# 将test目录重命名为dir
mv test/ dir 

# 将a移动到b目录下,如果b目录不存在,即把a重命名为b
mv a b/ 

# 看文件树
tree 

# 将a文件夹拷贝到b文件夹下 -r代表递归
cp -r a b 

#删除a文件夹 rm(remove) -r代表递归 -f代表强制
rm -rf a 

# 删除a文件夹下的所有文件
rm -rf a/* 

# 设置环境变量:全局有效
export PATH=/home/xxx/anaconda/bin:$PATH # 将export命令写入文件:~/.bashrc
source ~/.bashrc
env | grep PATH # 查看是否设置成功

# 编辑文本文件
vim

# 将a文件夹压缩为a.tar.gz的压缩包
tar czf a.tar.gz a/
# 将a.tar.gz压缩包解压
tar xzf a.tar.gz

# .tar 只打包,不压缩文件
# .gz 只压缩,不打包文件
# .tar.gz 打包压缩文件

# 查看GPU信息
nvidia-smi

# 查看每张GPU的可用显存
nvidia-smi --query-gpu=memory.free --format=csv 

# 每隔一秒查看每张GPU的显存
watch -n 1 nvidia-smi --query-gpu=memory.used --format=csv

# 查看进程
ps -ef

# 查看进程的CPU和内存占用
# %CPU RES
top

# 重定向日志
# 一般情况日志会输出到stdout/stderr中
# 重定向到train.log文件中,2代表stderr,1代表stdout
python train.py > ./train.log 2>&1

# &: 后台运行
python train.py > ./train.log 2>&1 &

# 将日志文件的内容打印在stdout
# cat: concatenate files to standard output
cat ./train.log

# 比较2个文档的差别
vimdiff single_gpu.py mp_train.py

# 在服务器之间复制文件和目录
scp file.txt root@IP:port/path # 复制文件
scp -r 本机文件路径 -P 远程端口号 root@IP:/path # 复制目录

在 linux 终端下载文件

# 文件或网页的url
wget URL

# 下载多个文件:将url保存至一个文本文件中
wget -i download_files.txt

# 为下载的文件重命名
wget -O filename URL

# 恢复未完成的下载
wget -c

# 下载百度网盘链接
# 文件下载链接:在浏览器下载管理中可以复制
wget -c --referer=网盘分享链接 -O 文件名 "文件下载链接"

Linux命令不受终端断开的影响,保持在后台运行

nohup python train.py > train.log 2>&1 &
# nohup可以让命令忽略挂起信号
# 第一个 > 表示将命令的标准输出重定向到 train.log
# 2>&1表示将标准错误重定向到标准输出,此处也是train.log
# 最后一个&表示让命令在后台运行

CUDA_VISIBLE_DEVICES=1 nohup python train.py  > nohup.log 2>&1 &
# 指定显卡编号 写在nohup前面

ps -ef|grep train # 返回nohup启动的所有相关进程(能识别你的进程名称的关键词)
ps -ef|head -1;ps -ef|grep train # 获取标题头
kill -9 pid # pid为每一行的第二个id编码,表示的是该进程的父进程
kill -TERM pid # 杀死多进程程序命令

ps -ef | grep train的显示结果:
实验室新手进阶之路_第1张图片

linux+git

# 安装包 可以在全局使用
pip install git+Github地址

# 把库安装在项目下
git clone [email protected]:facebookresearch/segment-anything.git
cd segment-anything; pip install -e .

# 复制存储库
git clone Github地址

监控服务器状态

# nvitop库: NVIDIA-GPU设备运行状况的实时监控工具
pip install nvitop
nvitop

# disk free: 检查文件系统的磁盘占用情况
df -hl # -h: 方便阅读 -l: 本地文件系统

# disk usage: 该目录下所有文件夹所占空间的大小
du -hl --max-depth=1

图像分割入门:Unet

我没有从Unet论文里给的链接找到代码,去github搜索star高的项目,都是一大坨一大坨的,看不下去。连我非常期待的wz老师写的Unet代码也过于复杂,真的看不懂q_q。所以花了很久的时间在网上找资料。

学Unet看这篇博客:UNet 网络做图像分割DRIVE数据集

简单记录一下我的学习过程:

  • 这篇博客的DRIVE数据集可能是经过处理的,后缀均为.png。之前找到的DRIVE数据集,图片后缀是.gif。相对来说,.png更好处理些。而且DRIVE数据集比较小,不需要很久就能跑完。
  • 该DRIVE数据集的标签图是1通道的二值图像,像素点灰度值只有0和1。所以Unet模型最后输出的channel维度也是1。第一是便于算loss(算loss时,label和predict的特征图形状应保持一致);第二,这是一个二分类,只有前景和背景,二分类的分割模型最后输出channel维为1是很正常的。
  • DRIVE的每一张图片形状为[1, 584, 565],即[C, H, W]。
  • 该Unet代码最后没有归一化的过程,softmax或者sigmoid都没有。
  • 我设置的一些参数如下:
batch_size = 8
in_channels = 1
num_classes = 1
optimizer = optim.RMSprop(net.parameters(), lr=0.00001,weight_decay=1e-8, momentum=0.9)  
loss = nn.BCEWithLogitsLoss()
  • 训练过程:梯度清零->前向传播->损失计算->反向传播->梯度下降计算参数。
  • 对数据集处理时,label变为2值图像。计算loss时,拿label和Unet网络的输出pred直接算。计算准确率acc时,将pred也转化为二值图像再计算。
  • predict.py时,保存结果图片前要先转到cpu。

一个小疑问:
当数据集是多分类时,模型的输出通道数=num_classes吗?label的形状是怎样的呢?此时该如何计算loss和Dice?

下载脑卒中数据集

isles2022、isles2017、isles2018、isles2016、atlasv2

语义分割评价指标

医学图像分割最常用的指标是Dice和HD95,主要是需要知道如何使用。
这篇博客讲的比较清晰:
关于何时需要sigmoid和softmax?output和target的shape是怎样的?train和test计算Loss和DSC的差异是什么?
关于pytorch语义分割二分类问题的两种做法

该博客介绍了PA、CPA、MPA、IoU、MIoU 5个指标,写的比较通俗易懂:
【语义分割】评价指标:PA、CPA、MPA、IoU、MIoU详细总结和代码实现(零基础从入门到精通系列!)

这篇博客涉及Dice系数, Hausdorff距离,体积相关误差:
【理论+实践】史上最全-论文中常用的图像分割评价指标-附完整代码
我主要看了理论和公式,还没有看代码。

图像分割评估指标——表面距离计算库
3DSAM-Adapter使用该库计算NSD。

数据集读取

数据集读取的方式也太多了qwq
每次阅读一个新的项目,就看到一种新的数据读取方法。

我下载的数据集格式为.nii.gz,尝试了2种数据集读取方法:

  • 直接读取.nii.gz格式的文件,使用nibabel库,这是专门读取该格式文件的库。
  • .nii.gz格式的图片转换成.npy格式的文件重新存储,train.py中直接读取.npy的文件,代码运行时间相对短很多。使用SimpleITK库。

目前使用下来,觉得第二种方法更方便。

MICCAI公开数据集划分train/val/test

我下载的MICCAI公开数据集存在2个问题:

  • 只分成 train 和 test,没有val。
  • test集合下只有Image,没有Mask。

对于这种情况,解决方案是:
仅使用公开数据集中 train 的部分,并将 train 按照8:2分成 train set 和 test set。由于所有图片都在train一个文件夹下,因此这里又涉及到2种代码编写思路:

  • 使用一个单独的代码文件,将文件夹下的所有图片移动到2个文件夹 train 和 test 下,用 csv 文件存储对应集合中图片的所有路径。训练时,直接读取 csv 文件,即可获得所有图片的路径。
  • 读取 train 文件夹下的所有图片文件,并且按照比例分别将图片的路径放入存储训练集路径、测试集路径的列表中,此时同样可以获得所有图片的路径。

loss不下降

尝试找了几篇博文,但还没拜读:
[深度学习] loss不下降的解决方法
训练loss不下降原因集合

在linux服务器上使用Tensorboard可视化

参考博客:
很感动,按照步骤来一个问题都没出,狠狠三连了!
【最全最细】Linux系统服务器使用Tensorboard实现可视化操作
我设置的侦听端口也是16666,目标端口也是6006。
首先代码中要使用pytorch的Tensorboard。
然后在xshell终端输入:

source activate [环境全称]
tensorboard  --logdir=【你模型保存的绝对路径/相对路径】 --port 6006
localhost:16666 # 在浏览器中输入网址

跑Unet3d+Atlas v2

数据集划分:最后133张做valid set,比例为8:2。

超参数:

image_depth=128, image_height=176, image_width=128
image_channel=1, numclass=1
loss_name='BinaryDiceLoss'
epochs=200, lr = 1e-3

训练结果:

实验室新手进阶之路_第2张图片
实验室新手进阶之路_第3张图片
最佳DSC约0.57。
一个小疑惑:
虽然此时 train loss 还没有收敛,但是当我将学习率修改为5e-3时,loss反而下降更慢。

Windows使用git clone遇到的各种问题

问题1

问题描述:

fatal: unable to access 'xxx':
Failed to connect to 127.0.0.1 port 7890 after 2081 ms:
Couldn't connect to server

解决方法:
解决git clone报错Failed to connect to 127.0.0.1 port 7890 after 2059 ms: Connection refused

问题2

问题描述:

fatal: unable to access 'xxxx': 
Failed to connect to github.com port 443 after 21256 ms: 
Couldn't connect to server

解决方法:

Transformer学习

【DL】图解 Transformer – 李宏毅
只看了Transformer的Encoder部分。

详解Transformer中Self-Attention以及Multi-Head Attention
重点解释了Self-Attention和MSA。

Vision Transformer详解

LayerNorm和BatchNorm:
Layer Normalization解析
Batch Normalization详解以及pytorch实验

Dropout和DropPath:
深度学习中Dropout原理解析
只看了下工作流程。
nn.Dropout、DropPath的理解与pytorch代码
有Dropout的源码,但是原理比较复杂。其中解释了:问题:dropout中为什么要除以 keep_prob?

pytorch | softmax(x,dim=-1)参数dim的理解
关于dim的解释,强。

Swin-Transformer网络结构详解
谁懂,SAM怎么还用了Shifted Window Attention,要吐血了。

Pytorch多卡运行

霹雳啪啦我的神仙导师!
实操教程 | GPU多卡并行训练总结(以pytorch为例)
对应github代码地址
分布式训练并不能将同1个模型分开放在不同的卡上,所以我用autodl租了A40来跑。贵死!

nnUnet学习

在Windows上实现nnU-Net v2的环境配置
nnUNet保姆级使用教程!从环境配置到训练与推理(新手必看)

分割学习

关于pytorch语义分割二分类问题的两种做法
【深度学习技巧】语义分割中的多分类与二分类使用dice系数
链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

你可能感兴趣的:(科研小白,python,人工智能,pytorch,1024程序员节)