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()