当前位置:   article > 正文

一个论文的代码复现(搭建环境、代码报错(已解决)、一些收获)_根据论文伪代码复现源代码

根据论文伪代码复现源代码

碎碎念

我准备复现的代码是在一篇论文中提到的,简单来说就是一个无声语音接口实验,通过应变传感器在不发出声音的情况下识别所说单词,在论文结尾处有提供所用数据集和所用代码,已下载,在后续使用
下面开始第一步,搭建项目所需环境

搭建环境

创建虚拟环境

conda创建虚拟环境
打开命令行Anaconda Powershell Prompt
确定一个python版本,以python3.8为例,silent是我给这个环境的命名

conda create --name silent python=3.8
  • 1

激活虚拟环境

将刚刚创建好的虚拟环境激活

conda activate silent
  • 1

然后环境就由base变为了silent,接下来我们就在silent环境中进行操作

安装pytorch

查看显卡信息,以确定可以匹配的CUDA版本

nvidia-smi
  • 1

命令行出现以下内容

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 |
+-------------------------------+----------------------+----------------------+
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

我们看到 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
  • 1

下载完成后,验证一下是否成功安装

conda list
  • 1

在列表中如果能找到pytorch则表示安装成功
然后输入python

python
  • 1

再输入

import torch
  • 1

再输入

torch.cuda.is_available()
  • 1

如果返回值为Ture,则安装完成
在这里插入图片描述

安装其他包

matplotlib

安装完python之后,我尝试去运行代码,出现报错
在这里插入图片描述
报错内容显示导入包出错,没有找到matplotlib包
解决办法:
pycharm首页:File->Settings->Project ->Project Interprete
点击“➕”,输入包的名称,再点击install package等待其下载即可,安装成功后会有提示
随后再次尝试运行该代码

tqdm

在这里插入图片描述
报错内容显示导入包出错,没有找到tqdm包
再次重复上述操作,安装tqdm,成功

sklearn

sklearn即scikit-learn
当我还是想通过上述方法去安装的时候没有成功
于是采用pip安装,后加-i 清华源镜像会快很多

 pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 1

至此,环境安装完毕

运行代码

报错:RuntimeError: mat1 and mat2 shapes cannot be multiplied (100x256 and 512x256)

问题: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)
        )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

没有用gpu

问题:翻看代码的时候,有看到它可以用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)
  • 1
  • 2
  • 3

解决:找到代码中的

gpu = '0'
os.environ["CUDA_VISIBLE_DEVICES"]=gpu
  • 1
  • 2

原来是4,改为0,是作者指定的gpu编号,我的只有一个编号为0

训练开始了,但准确度一直很低,图像也不理想,也不报错

问题:由于所呈现的图像是混淆矩阵,所以根据坐标应该是一条左上至右下的斜线,但出来的图像是一条竖线
解决:寻找出现问题的可能性,这个我也找了很久,也去搜索了别人出现的类似问题,然后还去问了gpt,依然没有找到方法,我猜测不是一个共性的问题,于是从代码本身入手,在阅读过程中发现了两个模块相似度极高,随后找到引用的地方,给它换成了另一个,奇迹般地好了
一个是

lass UnetModel(nn.Module):
    def __init__(self, in_chans=1, chans=32, drop_prob=0.3,class_num=100):
  • 1
  • 2

另一个是

class UnetModel2(nn.Module):
    def __init__(self, in_chans=1, chans=32, drop_prob=0.3,class_num=100):
  • 1
  • 2

运行结果

贴图
在这里插入图片描述
再贴
在这里插入图片描述
很好,就是我想要的结果

early stop

代码中有一部分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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

就酱,下次见~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/845860
推荐阅读
相关标签
  

闽ICP备14008679号