保存模型:

保存整个神经网络的结构和模型参数
torch.save(mymodel, ‘mymodel.pkl’)
只保存神经网络的模型参数
torch.save(mymodel.state_dict(), ‘mymodel_params.pkl’)
导入模型:
mymodel = torch.load(‘mymodel.pkl’)

x=x.view(1,1,4,5) 意思是将 x 矩阵转换成 (1,1,4,5) 的四维矩阵,第一个 1是样本数,第二个1是通道数,第三个 4 和第四个 5 是高度和宽度。

卷积层

卷积层是用一个固定大小的矩形区去席卷原始数据,将原始数据分成一个个和卷积核大小相同的小块,然后将这些小块和卷积核相乘输出一个卷积值(注意:这里是一个单独的值,不再是矩阵了)。
conv2d 是二维度卷积,对数据在宽度和高度两个维度上进行卷积。
函数:
torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups)
weight:卷积核权重,也就是卷积核本身,是一个四维度数组,(out_channels, in_channels/groups, kH, kW
Out_channels)。
out_channels是卷积核输出层的神经元个数,也就是这层有多少个卷积核,;in_channels 输入通道数,kH kW是卷积核的高度和宽

第一个代码:

train_hd=pandas.read_csv('C:\\Users\\number.csv')
train_path='C:\\Users\\pic'class Mydataset(Dataset):def __init__(self,df_data,data_dir='./',transform=None):super().__init__()self.df=df_data.valuesself.data_dir=data_dirself.transform=transformdef __len__(self):return len(self.df)def __getiem__(self,idex):c,img_name,label=self.df[idex]img_path=os.path.join(self.data_dir,img_name)image=cv2.imread(img_path)if self.transform is not None:image=self.transform(image)return image,labeltransforms_train=transforms.Compose([transforms.ToPILImage(),transforms.RandomHorizontalFlip(),transforms.RandomRotation(10),transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])train_data=Mydataset(train_hd,train_path,transform=transforms_train)
BATCH_SIZE=64
train_loader=DataLoader(train_data,batch_size=BATCH_SIZE,shuffle=True)
print(train_data.__len__())
print(train_data.__getiem__(100))
# --------------------------------------------------------hidden_layer = 3
input_data = 3
output_data = 2
x = Variable(torch.randn(BATCH_SIZE, input_data), requires_grad= False)
y = Variable(torch.randn(BATCH_SIZE, output_data), requires_grad =False)
w1 = Variable(torch.randn(input_data, hidden_layer) , requires_grad= True)
w2 = Variable(torch.randn(hidden_layer, output_data) , requires_grad =True)
epochn = 100  # grad.data. zero() 全部置零,
learning_rate = 1e-6
for epoch in range(epochn):y_pred = x.mm(w1).clamp(min=0).mm(w2)loss = (y_pred - y).pow(2).sum()print("Epoch:{},Loss:{:.4f}".format(epoch,loss.item()))loss.backward()w1.data -= learning_rate * w1.grad.dataw2.data -= learning_rate * w2.grad.dataw1.grad.data.zero_()w2.grad.data.zero_()

之后的代码:

import torch.nn.functional as Fimport torch
import torch.nn as nn
from torch.autograd import Variablefrom torchvision import transforms
from torch.utils.data.dataset import Dataset
from torch.utils.data.dataloader import DataLoader
from PIL import Imageimport torch.optim as optim
import os# ***************************初始化一些函数********************************
# torch.cuda.set_device(gpu_id)#使用GPU
learning_rate = 0.0001  # 学习率的设置# *************************************数据集的设置****************************************************************************
root = os.getcwd() + '/data/'  # 数据集的地址# 定义读取文件的格式
def default_loader(path):return Image.open(path).convert('RGB')class MyDataset(Dataset):# 创建自己的类: MyDataset,这个类是继承的torch.utils.data.Dataset# **********************************  #使用__init__()初始化一些需要传入的参数及数据集的调用**********************def __init__(self, txt, transform=None, target_transform=None):super(MyDataset, self).__init__()# 对继承自父类的属性进行初始化imgs = []fh = open("./data/num.txt", 'r')# 按照传入的路径和txt文本参数,以只读的方式打开这个文本for line in fh:  # 迭代该列表#按行循环txt文本中的内line = line.strip('\n')line = line.rstrip('\n')# 删除 本行string 字符串末尾的指定字符,这个方法的详细介绍自己查询pythonwords = line.split()# 用split将该行分割成列表  split的默认参数是空格,所以不传递任何参数时分割空格imgs.append((words[0], int(words[1])))# 把txt里的内容读入imgs列表保存,具体是words几要看txt内容而定# 很显然,根据我刚才截图所示txt的内容,words[0]是图片信息,words[1]是lableself.imgs = imgsself.transform = transformself.target_transform = target_transform# *************************** #使用__getitem__()对数据进行预处理并返回想要的信息**********************def __getitem__(self, index):  # 这个方法是必须要有的,用于按照索引读取每个元素的具体内容fn, label = self.imgs[index]print(fn+'mm')# fn是图片path #fn和label分别获得imgs[index]也即是刚才每行中word[0]和word[1]的信息img_path = os.path.join("C:/Users/pic/", fn)img = Image.open(img_path).convert('RGB')# 按照路径读取图片if self.transform is not None:img = self.transform(img)# 数据标签转换为Tensorreturn img, label# return回哪些内容,那么我们在训练时循环读取每个batch时,就能获得哪些内容# **********************************  #使用__len__()初始化一些需要传入的参数及数据集的调用**********************def __len__(self):# 这个函数也必须要写,它返回的是数据集的长度,也就是多少张图片,要和loader的长度作区分return len(self.imgs)class Net(nn.Module):  # 定义网络,继承torch.nn.Moduledef __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 6, 5)  # 卷积层self.pool = nn.MaxPool2d(2, 2)  # 池化层self.conv2 = nn.Conv2d(6, 16, 5)  # 卷积层self.fc1 = nn.Linear(16 * 5 * 5, 120)  # 全连接层self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 2)  # 2个输出def forward(self, x):  # 前向传播x = self.pool(F.relu(self.conv1(x)))  # F就是torch.nn.functionalx = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 16 * 5 * 5)  # .view( )是一个tensor的方法,使得tensor改变size但是元素的总数是不变的。# 从卷基层到全连接层的维度转换x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)returnnet = Net()  # 初始化一个卷积神经网络leNet-
train_data = MyDataset(txt=root + 'num.txt', transform=transforms.Compose([transforms.Resize((32, 32)),# 将图片缩放到指定大小(h,w)或者保持长宽比并缩放最短的边到int大小transforms.CenterCrop(32),transforms.ToTensor()]))train_loader = DataLoader(dataset=train_data, batch_size=2, shuffle=True)
# batch_size:从样本中取多少张,每一次epoch都会输入batch_size张
print('num_of_trainData:', len(train_data))def trainandsave():# 神经网络结构print('h')net = Net()optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)  # 学习率为0.001criterion = nn.CrossEntropyLoss()  # 损失函数也可以自己定义,我们这里用的交叉熵损失函数# 训练部分i = 0for epoch in range(5):  # 训练的数据量为5个epoch,每个epoch为一个循环# 每个epoch要训练所有的图片,每训练完成200张便打印一下训练的效果(loss值)running_loss = 0.0  # 定义一个变量方便我们对loss进行输出for i, data in enumerate(train_loader, 0):  # 这里我们遇到了第一步中出现的trailoader,代码传入数据# enumerate是python的内置函数,既获得索引也获得数据# get the inputsinputs, labels = data  # data是从enumerate返回的data,包含数据和标签信息,分别赋值给inputs和labels# wrap them in Variableinputs, labels = Variable(inputs), Variable(labels)  # # 转换数据格式用Variableoptimizer.zero_grad()  # 梯度置零,因为反向传播过程中梯度会累加上一次循环的梯度# forward + backward + optimizeoutputs = net(inputs)  # 把数据输进CNN网络netloss = criterion(outputs, labels)  # 计算损失值loss.backward()  # loss反向传播optimizer.step()  # 反向传播后参数更新running_loss += loss.data[0]  # loss累加if i % 20 == 19:print('[%d, %5d] loss: %.3f' %(epoch + 1, i + 1, running_loss / 20))  # 然后再除以200,就得到这两百次的平均损失值running_loss = 0.0  # 这一个200次结束后,就把running_loss归零,下一个200次继续使用print('Finished Training')# 保存神经网络torch.save(net, 'net.pkl')# 保存整个神经网络的结构和模型参数torch.save(net.state_dict(), 'net_params.pkl')if __name__ == '__main__':for i, data in enumerate(train_loader, 0):print(i)

报错信息:


发现每次batch_size修改后对迭代有影响。只有batch_size为1时才进入了main 的循环,很奇怪。然后 fp = builtins.open(filename, “rb”)
FileNotFoundError: [Errno 2] No such file or directory: ‘C:/Users/pic/a_236.jpg’
一直以为自己文件夹下面有图片,但是仔细检查才知道自己那部分图片是png后缀结尾的,天哪,捣鼓了一下午居然就因为这个原因,我狂汗阿。。。。真的太不仔细了。。。。粗心害死人。。。。。
但是我也产生了疑问,难道pytorch的训练图片只能说jpg格式吗?在书上也没看到过这一点。
另一个报错:
TypeError: pic should be Tensor or ndarray. Got <class ‘PIL.Image.Image’>.
方法:删去transform的toPILIMAGE。

用程序将png后缀文件改成jpg之后仍然有错:

看来文件已经都能迭代成功了,但是参数有问题。
发现在net中的第一卷积层是这样的:
self.conv1 = nn.Conv2d(2, 6, 5) # 卷积层
这个函数第一个参数为输入的通道数,第二个参数为输出的通道数。而我图片是3通道
改为:
self.conv1 = nn.Conv2d(3, 6, 5) # 卷积层

之后的报错:
loss.data[0] # loss累加
IndexError: invalid index of a 0-dim

版本原因,应该把data[0]写成.item()
修改所有错误终于开始训练了:

上面结果的全部代码:

import cv2
import torch.nn.functional as Fimport torch
import torch.nn as nn
from torch.autograd import Variablefrom torchvision import transforms
from torch.utils.data.dataset import Dataset
from torch.utils.data.dataloader import DataLoader
from PIL import Imageimport torch.optim as optim
import os# ***************************初始化一些函数********************************
# torch.cuda.set_device(gpu_id)#使用GPU
learning_rate = 0.0001  # 学习率的设置# *************************************数据集的设置****************************************************************************
root = os.getcwd() + '\\data\\'  # 数据集的地址# 定义读取文件的格式
def default_loader(path):return Image.open(path).convert('RGB')class MyDataset(Dataset):# 创建自己的类: MyDataset,这个类是继承的torch.utils.data.Dataset# **********************************  #使用__init__()初始化一些需要传入的参数及数据集的调用**********************def __init__(self, txt, transform=None, target_transform=None,loader=default_loader):super(MyDataset, self).__init__()# 对继承自父类的属性进行初始化imgs = []fh = open(txt, 'r')# 按照传入的路径和txt文本参数,以只读的方式打开这个文本for line in fh:  # 迭代该列表#按行循环txt文本中的内line = line.strip('\n')line = line.rstrip('\n')# 删除 本行string 字符串末尾的指定字符,这个方法的详细介绍自己查询pythonwords = line.split()# 用split将该行分割成列表  split的默认参数是空格,所以不传递任何参数时分割空格imgs.append((words[0], int(words[1])))# 把txt里的内容读入imgs列表保存,具体是words几要看txt内容而定# 很显然,根据我刚才截图所示txt的内容,words[0]是图片信息,words[1]是lableself.imgs = imgsself.transform = transformself.target_transform = target_transform# *************************** #使用__getitem__()对数据进行预处理并返回想要的信息**********************def __getitem__(self, index):  # 这个方法是必须要有的,用于按照索引读取每个元素的具体内容fn, label = self.imgs[index]# fn是图片path #fn和label分别获得imgs[index]也即是刚才每行中word[0]和word[1]的信息img_path = os.path.join("C:\\Users\\pic\\", fn)img = Image.open(img_path).convert('RGB')# 按照路径读取图片if self.transform is not None:img = self.transform(img)# 数据标签转换为Tensorreturn img, label# return回哪些内容,那么我们在训练时循环读取每个batch时,就能获得哪些内容# **********************************  #使用__len__()初始化一些需要传入的参数及数据集的调用**********************def __len__(self):# 这个函数也必须要写,它返回的是数据集的长度,也就是多少张图片,要和loader的长度作区分return len(self.imgs)class Net(nn.Module):  # 定义网络,继承torch.nn.Moduledef __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)  # 卷积层self.pool = nn.MaxPool2d(2, 2)  # 池化层self.conv2 = nn.Conv2d(6, 16, 5)  # 卷积层self.fc1 = nn.Linear(16 * 5 * 5, 120)  # 全连接层self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 2)  # 2个输出def forward(self, x):  # 前向传播x = self.pool(F.relu(self.conv1(x)))  # F就是torch.nn.functionalx = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 16 * 5 * 5)  # .view( )是一个tensor的方法,使得tensor改变size但是元素的总数是不变的。# 从卷基层到全连接层的维度转换x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xIMG_MEAN = [0.485, 0.456, 0.406]
IMG_STD = [0.229, 0.224, 0.225]net = Net()  # 初始化一个卷积神经网络leNet-
train_data = MyDataset(txt=root + 'num.txt', transform=transforms.Compose([transforms.Resize((32, 32)),# 将图片缩放到指定大小(h,w)或者保持长宽比并缩放最短的边到int大小transforms.CenterCrop(32),transforms.ToTensor()]))train_loader = DataLoader(dataset=train_data, batch_size=227, shuffle=True,drop_last=True)
# batch_size:从样本中取多少张,每一次epoch都会输入batch_size张
print('num_of_trainData:', len(train_data))def trainandsave():# 神经网络结构print('h')net = Net()optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)  # 学习率为0.001criterion = nn.CrossEntropyLoss()  # 损失函数也可以自己定义,我们这里用的交叉熵损失函数# 训练部分for epoch in range(10):  # 训练的数据量为10个epoch,每个epoch为一个循环# 每个epoch要训练所有的图片,每训练完成200张便打印一下训练的效果(loss值)running_loss = 0.0  # 定义一个变量方便我们对loss进行输出for i, data in enumerate(train_loader, 0):  # 这里我们遇到了第一步中出现的trailoader,代码传入数据# enumerate是python的内置函数,既获得索引也获得数据# get the inputsinputs, labels = data  # data是从enumerate返回的data,包含数据和标签信息,分别赋值给inputs和labels# wrap them in Variableinputs, labels = Variable(inputs), Variable(labels)  # # 转换数据格式用Variableoptimizer.zero_grad()  # 梯度置零,因为反向传播过程中梯度会累加上一次循环的梯度# forward + backward + optimizeoutputs = net(inputs)  # 把数据输进CNN网络netloss = criterion(outputs, labels)  # 计算损失值loss.backward()  # loss反向传播optimizer.step()  # 反向传播后参数更新running_loss += loss.item()  # loss累加if i % 9 == 1:print('[%d, %5d] loss: %.3f' %(epoch + 1, i + 1, running_loss / 10))  # 平均损失值running_loss = 0.0  # 这一个结束后,就把running_loss归零,print('Finished Training')# 保存神经网络torch.save(net, 'net.pkl')# 保存整个神经网络的结构和模型参数torch.save(net.state_dict(), 'net_params.pkl')if __name__ == '__main__':trainandsave()

记住net的前向传播函数要return x

【问题记录】pytorch自定义数据集 No such file or directory, invalid index of a 0-dim相关推荐

  1. Pytorch自定义数据集

    简述 Pytorch自定义数据集方法,应该是用pytorch做算法的最基本的东西. 往往网络上给的demo都是基于torch自带的MNIST的相关类.所以,为了解决使用其他的数据集,在查阅了torch ...

  2. pytorch: 自定义数据集加载

    很多网络在数据加载方式 pytorch 的输入流水线的操作顺序是这样的: 创建一个 Dataset 对象     创建一个 DataLoader 对象     不停的 循环 这个 DataLoader ...

  3. 数据集制作_轻松学Pytorch自定义数据集制作与使用

    点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 大家好,这是轻松学Pytorch系列的第六篇分享,本篇你将学会如何从头开始制作自己的数据集,并通过DataLo ...

  4. 利用PyTorch自定义数据集实现猫狗分类

    看了许多关于PyTorch的入门文章,大抵是从torchvision.datasets中自带的数据集进行训练,导致很难把PyTorch运用于自己的数据集上,真正地灵活运用PyTorch. 这里我采用从 ...

  5. 【超级视客营】基于超算平台的MMYOLO实践过程记录(自定义数据集实现YOLO v5)

    上一篇博文我们搭建好了超算平台对MMYOLO编译环境,并通过单张图片加载训练好的模型进行推理.本篇文章参考MMYOLO官方发布的自定义数据集 标注+训练+测试+部署 全流程文档,进一步在超算平台中实现 ...

  6. pytorch自定义数据集DataLoder

    pytorch官方例程: DATA LOADING AND PROCESSING TUTORIAL torch.utils.data.Dataset 是dataset的抽象类,我们可以同过继承Data ...

  7. pytorch自定义数据集语义分割报错备忘RuntimeError: 1only batches of spatial targets supported (3D tensors)

    报错原文:RuntimeError: 1only batches of spatial targets supported (3D tensors) but got targets of size: ...

  8. PyTorch版YOLOv4更新了,不仅适用于自定义数据集,还集成了注意力和MobileNet

    机器之心报道 作者:陈萍 距离 YOLO v4 的推出,已经过去 5 个多月.YOLO 框架采用 C 语言作为底层代码,这对于惯用 Python 的研究者来说,实在是有点不友好.因此网上出现了很多基于 ...

  9. 使用pytorch自定义DataSet,以加载图像数据集为例,实现一些骚操作

    使用pytorch自定义DataSet,以加载图像数据集为例,实现一些骚操作 总共分为四步 构造一个my_dataset类,继承自torch.utils.data.Dataset 重写__getite ...

最新文章

  1. 调试Docker容器
  2. 产品新人的10字生存手册
  3. 一文看懂微服务背后的技术演进与应用实践
  4. Effective Java之必要时进行保护性拷贝(三十九)
  5. superset出现A valid API access token is required to use Mapbox data
  6. php 数组移除指定健,php删除数组指定键的方法
  7. asterisk版本选择
  8. MongoDB的使用技巧(转)
  9. centos 单用户登陆模式操作
  10. 我的each方法——JavaScript Array
  11. tomcat8修改session的JSESSIONID名称
  12. 如何将 Ubuntu 配置为Ap模式
  13. html如何调用function,请问HTML function函数怎么定义和调用?
  14. 用简单英语谈生意-介绍篇
  15. mssql 2000 备份计划
  16. mysql explain row_MySQL explain详解
  17. 八孔g调短洞箫_八孔g调洞箫曲谱_八孔G调箫G调简谱
  18. 电脑增加机械硬盘计算机管理,电脑加装机械硬盘直接插上就行了么
  19. Pandas合并之Merge合并
  20. Mac电脑使用:Mac电脑一键智能清理神器CleanMyMac X,Android开发者

热门文章

  1. thinkphp mysql 日志_thinkphp5 日志
  2. lua与python结合_Lua和Python:实现一个高效的List对象(3)
  3. IDM下载速度慢解决方案全网搜集持续更新
  4. linux系统串口设置参数,linux 串口编程记录(一)串口参数设置(示例代码)
  5. linux上安装hackrf_在Linux上安装Kubectl
  6. WWW 2022 | 弯道超车:基于纯MLP架构的序列推荐模型
  7. 推翻Hinton NeurIPS论文结论!审稿人评价:该文章在标签平滑和知识蒸馏的关系上取得了重大突破!...
  8. 人脸静默活体检测最新综述
  9. 美国密西西比州立大学招收机器学习、数据挖掘方向全奖博士生
  10. 经典论文复现 | 基于深度学习的图像超分辨率重建