赞
踩
我准备复现的代码是在一篇论文中提到的,简单来说就是一个无声语音接口实验,通过应变传感器在不发出声音的情况下识别所说单词,在论文结尾处有提供所用数据集和所用代码,已下载,在后续使用
下面开始第一步,搭建项目所需环境
conda创建虚拟环境
打开命令行Anaconda Powershell Prompt
确定一个python版本,以python3.8为例,silent是我给这个环境的命名
conda create --name silent python=3.8
将刚刚创建好的虚拟环境激活
conda activate silent
然后环境就由base变为了silent,接下来我们就在silent环境中进行操作
查看显卡信息,以确定可以匹配的CUDA版本
nvidia-smi
命令行出现以下内容
Sat Jan 20 19:41:42 2024
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 462.30 Driver Version: 462.30 CUDA Version: 11.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce GTX 1650 WDDM | 00000000:01:00.0 On | N/A |
| N/A 39C P8 2W / N/A | 513MiB / 4096MiB | 1% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
我们看到 CUDA Version: 11.2,说明此显卡支持11.2及以下版本的CUDA
接下来打开pytorch官网,选择合适的版本,复制命令安装
以我的电脑为例,我选择了10.2版本
conda install pytorch==1.10.1 torchvision==0.11.2 torchaudio==0.10.1 cudatoolkit=10.2 -c pytorch
下载完成后,验证一下是否成功安装
conda list
在列表中如果能找到pytorch则表示安装成功
然后输入python
python
再输入
import torch
再输入
torch.cuda.is_available()
如果返回值为Ture,则安装完成
安装完python之后,我尝试去运行代码,出现报错
报错内容显示导入包出错,没有找到matplotlib包
解决办法:
pycharm首页:File->Settings->Project ->Project Interprete
点击“➕”,输入包的名称,再点击install package等待其下载即可,安装成功后会有提示
随后再次尝试运行该代码
报错内容显示导入包出错,没有找到tqdm包
再次重复上述操作,安装tqdm,成功
sklearn即scikit-learn
当我还是想通过上述方法去安装的时候没有成功
于是采用pip安装,后加-i 清华源镜像会快很多
pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple
至此,环境安装完毕
问题:RuntimeError: mat1 and mat2 shapes cannot be multiplied (100x256 and 512x256),错误为两个100x256和512x256矩阵不能相乘
解决:按照错误路径找到矩阵相乘的代码,更改矩阵大小为第一个矩阵列数等于第二个矩阵行数,并且第二个矩阵列数能与后续矩阵相乘,最后一个矩阵的列数等于需要分的类数。
self.fc = Sequential(
#Linear(512, 256),
Linear(256, 100),
Linear(100, class_num)
#Linear(256, class_num)
)
问题:翻看代码的时候,有看到它可以用gpu进行训练,但在我实际训练过程中,在终端显示我还是用的cpu进行训练,任务管理器中也没有gpu占用
def Train(logname = '3Dconv', epochs=1000/, batch_size=100, early_stop = 50):
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(device)
解决:找到代码中的
gpu = '0'
os.environ["CUDA_VISIBLE_DEVICES"]=gpu
原来是4,改为0,是作者指定的gpu编号,我的只有一个编号为0
问题:由于所呈现的图像是混淆矩阵,所以根据坐标应该是一条左上至右下的斜线,但出来的图像是一条竖线
解决:寻找出现问题的可能性,这个我也找了很久,也去搜索了别人出现的类似问题,然后还去问了gpt,依然没有找到方法,我猜测不是一个共性的问题,于是从代码本身入手,在阅读过程中发现了两个模块相似度极高,随后找到引用的地方,给它换成了另一个,奇迹般地好了
一个是
lass UnetModel(nn.Module):
def __init__(self, in_chans=1, chans=32, drop_prob=0.3,class_num=100):
另一个是
class UnetModel2(nn.Module):
def __init__(self, in_chans=1, chans=32, drop_prob=0.3,class_num=100):
贴图
再贴
很好,就是我想要的结果
代码中有一部分early stop实现,作用是在若干轮训练中,如果准确率没有提高,则停止训练,有效的防止了过拟合,若干轮的轮数由用户自己指定我用的是50轮,代码中指定轮数是1000轮,但是在第439轮时提前停止了训练break
if old_val_acc < val_correct: old_val_acc = val_correct train_acc = train_correct / train_total train_acc *= 100 train_acc = round(train_acc) val_acc = val_correct / val_total val_acc *= 100 val_acc = round(val_acc) torch.save(model.state_dict(), os.path.join(save_path, 'weight_epoch{}_{}%_{}%.pt'.format(epoch, train_acc, val_acc))) early_stop_number = 0 else: early_stop_number += 1 if early_stop_number == early_stop: print("Early Stop!") break
就酱,下次见~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。