Dataset和DataLoader的使用

Dataset和DataLoader的使用:

import torch
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
import torch.nn.functional as F
import matplotlib.pylab as plt
import numpy as np
import torch.nn as nn

#1.构建数据集
class Dateset(Dataset):#因为dateset是抽象类只能通过继承来实现
    def __init__(self,filepath): #传入文件路径
        xy=np.loadtxt(filepath,delimiter=',',dtype=np.float32)
        self.len=xy.shape[0] #元组(N,9) 这样得到N
        self.x_data = torch.from_numpy(xy[:, :-1])  # 所有行 列数到倒数第2列
        self.y_data = torch.from_numpy(xy[:, [-1]])

    def __getitem__(self, index): #要求 由样本的下标得出样本的数据
        return self.x_data[index],self.y_data[index] #返回元组(x,y)

    def __len__(self): #要求传出样本大小
        return self.len

dataset=Dateset('D:\迅雷下载\diabetes.csv.gz')
train_loader=DataLoader(dataset=dataset,
                        batch_size=32,
                        shuffle=True,  #打乱
                        num_workers=2) #并行数据
#2.搭建神经网络
class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.linear1=nn.Linear(8,6)
        self.linear2=nn.Linear(6,4)
        self.linear3=nn.Linear(4,1)

    def forward(self,x):
        x = torch.sigmoid(self.linear1(x))
        x = torch.sigmoid(self.linear2(x))
        x = torch.sigmoid(self.linear3(x))
        return x
net=Net()

#3.构建优化器和损失函数
optimizer=torch.optim.SGD(net.parameters(),lr=0.1) #随机梯度下降
criterion=nn.BCELoss()#交叉熵损失函数

#4训练模型
if __name__=='__main__':
    for epoch in range(100):
        for i,data in enumerate(train_loader,0):   #此函数返回样本的下标数,0代表从第一个开始  ## i,(inputs,labels)
          # 1.prepare data
          inputs,labels=data   #本身读出的是一个样本,但是loader自动组合成矩阵并且转化成tenso
          # 2.forward
          y_pred=net(inputs)
          loss=criterion(y_pred,labels)
          print(epoch,i,loss.item())
          #3.backward
          optimizer.zero_grad()
          loss.backward()
          #4.update
          optimizer.step()

猜你喜欢

转载自blog.csdn.net/qq_21686871/article/details/114242423
今日推荐