目录
一、前言
上周完成了FCNVMB的训练与测试,但是由于数据量较少,训练效果不明显。工作站运行forward.py代码生成模拟数据的时候出现错误,未解决。
本周计划使用matlab生成大量模拟数据,再进行训练查看训练效果,同时学习如何重写dataset。
二、基于matlab生成模拟数据
单个速度模拟文件计算多炮数据:
forward函数所需参数:①vfile:存放速度模型的文件目录;②outfile:存放正演地震数据的文件目录;③sn:炮数
[MATLAB] fullfile函数介绍:
函数功能:将多个字符串拼接为文件路径。
语法格式:f = fullfile(filepart1,filepart2,…,filepartN)
输出:将各个输入用"\"拼接起来;即:f = ‘filepart1\filepart2\…\filepartN’。
三、批量修改文件名
由于粗心,不小心将“georec”打成了“geroec”,因此使用matlab进行批量修改。错误情况:
代码如下:
% 可以直接将该脚本创建在待需要修改的文件夹下
path='******' % 输入带修改文件夹的地址
cd(path)
% 循环遍历所有文件
for i = 1:800
% 获取第i个文件名
oldname = ['geroec',num2str(i),'.mat']
% 打印原文件名,查看是否有错
disp(oldname)
% 将一个文件的完整路径中各部分提取出来
[filepath,name,ext] = fileparts(oldname)
% 进行重命名
newname = ['georec',name(7:end),'.mat']
% 打印新文件名,查看是否有错
disp(newname)
% MATLAB重命名文件函数
movefile(oldname,newname)
end
[MATLAB] fileparts函数介绍:
函数功能:将一个文件的完整路径中各部分提取出来。
语法格式:[pathstr, name, ext] = fileparts(filename)
其中,filename是需要解析的文件的完整路径。fileparts将这个文件名(包含完整路径信息)各部分分别提取到三个变量中。pathstr是这个文件的路径名,name是文件名,ext是包含一个点号文件的扩展名(指定文件的类型)。
四、代码调试
本次调试培训模拟数据的规模Trainsize=800,迭代轮数epoch=100,测试规模为Testsize=50。
Trainloss与Prediction如下图所示。
五、重写dataset
5.1 DataLoader介绍
DataLoader是一个迭代器,用于构造可迭代的数据装载器,方便我们访问Dataset中的对象。Dataloader类不需要设计代码,只需要利用该类读取设计好的Dataset即可。下面为该类的参数介绍:
DataLoader(
dataset, # Dataset类,决定数据从哪里读取以及如何读取
batch_size=1, # 读取批次大小
shuffle=False, # 每个epoch是否乱序(在训练的时候为true-对数据进行随机读取,提高模型泛化性,验证或者推理的时候常为False)
sampler=None,
batch_sampler=None,
num_workers=0, # 是否多进程读取数据(在windows下设置为0,因为pytorch多进程是fork,windows不是这种方式,所以不能使用多进程;Linux常设置为4或8)
collate_fn=None,
pin_memory=False,
drop_last=Fasle, # 当样本数不能被batchsize整除时,是否舍弃最后一批数据
timeout=0,
worker_init_fn=None,
multiprocessing_context=None
)
5.2 Dataset介绍
OpenFWI数据与代码:Open FWI | A collection of benchmark datasets for Seismic FWI with Machine Learning
在进行研究的时候,如果不想用pytorch自带的数据集,想加载自己的数据集,就需要通过重写一个继承了Datasets的MyDataSet类来放置自己的数据集。在之前经常调用torchvision库中的数据集对象直接获取常用的数据集,例如:torchvision.datasets.CIFAR10(),这样获得的一个DataSet对象属于 torch.utils.data.Dataset 类,将获得的Dataset对象后传入DataLoader就可以实现加载批量数据参与训练了。
MyDataSet中需要重写三个函数,如下:
from torch.utils.data import Dataset
class MyDataset(Dataset): #继承Datasets
# 初始化函数:加载数据-初始化文件路径与文件名列表等,完成初始化该类的一些基本参数
def __init(self):# 在该方法中得到文件路径,将路径组成一个数组,则可以在getitim方法中直接读取
pass
# 按照索引读取每个元素的具体内容,对数据进行预处理
def __getitem__(self, index): # 按照索引读取每个元素的具体内容
# 1、从文件中读取数据
# 2、进行数据预处理(例如torchvision.Transform)
# 3、 返回数据对(例如图像与标签)
pass
# 初始化一些需要传入的参数及数据集的调用,返回的是数据集的长度
def __len__(self):
pass
其中,__getitem__接收一个index,接着返回图片数据和标签,index通常指的是一个list中的index,list中的每个元素包含了图片数据的路径和标签信息。
list的制作:通常将图片的路径和标签信息存储在一个txt文件中,然后从该txt中读取。
读取自己数据的基本流程:
- 制作存储了图片路径和标签信息的txt文件;
- 将txt文件中的信息转化为list,list中的每一个元素对应一个样本;
- 通过getitem函数,读取数据和标签,并返回需要的信息
其中,返回的数据标签为tuple元组的形式,使用DataLoader,接着使用enumerate函数访问它们。
六、下周计划
学习InversionNet网络结构,使用OpenFWI中的数据跑通代码。