主要用到了Pytorch中的Dataset和DataLoadder这两个方法,其中Dataset是抽象类,不能实例化对象,只能继承用于构造数据集,DataLoader是帮助加载数据的,可以做shuffle、batch_size,能拿Mini-batch进行训练。
代码如下:
import torch
import numpy as np
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
class DiabetesDataset(Dataset):
def __init__(self,filepath):
xy = np.loadtxt(filepath,delimiter=',',dtype=np.float32)
self.len = xy.shape[0]
self.x_data=torch.from_numpy(xy[:,:-1])
self.y_data = torch.from_numpy(xy[:,[-1]])
def __getitem__(self,index):
return self.x_data[index],self.y_data[index]
def __len__(self):
return self.len
dataset = DiabetesDataset('E:\\tmp\\.keras\\datasets\\diabetes.csv\\diabetes.csv')
train_loader = DataLoader(
dataset=dataset,
batch_size = 32,
shuffle = True,
num_workers=0
)
#定义模型
class Model(torch.nn.Module):
def __init__(self):
super(Model,self).__init__()
self.linear1 = torch.nn.Linear(8,6)
self.linear2 = torch.nn.Linear(6,4)
self.linear3 = torch.nn.Linear(4,1)
self.relu = torch.nn.ReLU()
self.sigmoid = torch.nn.Sigmoid()
def forward(self,x):
x = self.relu(self.linear1(x))
x = self.relu(self.linear2(x))
x = self.sigmoid(self.linear3(x))
return x
model = Model()
#构建优化器和损失函数
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)
#训练
if __name__ == '__main__':
for epoch in range(1000):
for i,data in enumerate(train_loader,0):
inputs,labels = data
y_pred = model(inputs)
loss=criterion(y_pred,labels)
print(epoch,i,loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
努力加油a啊