PyTorch 深度学习实践 第8讲

import numpy as np
import torch
import numpy as py
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])#x取除去最后一列的所有列
        self.y_data=torch.from_numpy(xy[:,[-1]])#y取最后一列

    def __getitem__(self, index):#得到x的行位置和y的行位置
        return self.x_data[index],self.y_data[index]

    def __len__(self):#得到数据的条数
        return self.len

dataset=diabetesDataset("diabetes.csv")#给出文件的位置

train_loader=DataLoader(dataset,batch_size=2,shuffle=True,num_workers=0)
#数据加载以及进行训练设置,batch-size一次训练的数据的条数,shuffle是否打乱顺序,num_workers 表示用于数据加载的子进程的数量
class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1=torch.nn.Linear(8,6)#8维输入变为6维输出
        self.linear2=torch.nn.Linear(6,4)#8维输入变为4维输出
        self.linear3=torch.nn.Linear(4,1)#4维输入变为1维输出
        self.sigmoid=torch.nn.Sigmoid()#创建sigmoid激活函数的实例

    def forward(self,x):#定义预测函数
        x=self.sigmoid(self.linear1(x))#上层的输出作为下一层的输入,每一层都加上sigmoid
        x=self.sigmoid(self.linear2(x))
        x=self.sigmoid(self.linear3(x))
        return x

model=Model()
criterion=torch.nn.BCELoss(reduction="mean")#定义损失函数,mean表示损失值最后取平均值
optim=torch.optim.SGD(model.parameters(),lr=0.01)#定义优化器

for epoch in range(100):
    for i ,data in enumerate(train_loader,0):#用于遍历数据加载器 train_loader 中的批次数据
        #enumerate每次会生成一个批次数据,并给其一个索引值,i用来接收索引值,索引值从0开始
        #data用于接收本批次所产生的数据,data 变量包含当前批次的输入数据和标签数据,可以通过索引来访问这两部分数据。
        input,labels=data#x,y=data,此处input就是x,labels就是y
        y_pre=model(input) #输入x得到预测值
        loss=criterion(y_pre,labels)#计算损失值
        print(epoch,i,loss.item())#打印,第多少个epoch中的第几个批次,损失值是多少
        optim.zero_grad()#梯度清零
        loss.backward()#反向传播
        optim.step()#梯度更新


 

          1、DataSet 是抽象类,不能实例化对象,主要是用于构造我们的数据集

          2、DataLoader 需要获取DataSet提供的索引[i]和len;用来帮助我们加载数据,比如说做shuffle(提高数据集的随机性),batch_size,能拿出Mini-Batch进行训练。它帮我们自动完成这些工作。DataLoader可实例化对象。DataLoader is a class to help us loading data in Pytorch.

         3、__getitem__目的是为支持下标(索引)操作

代码说明:

1、需要mini_batch 就需要import DataSet和DataLoader

2、继承DataSet的类需要重写init,getitem,len魔法函数。分别是为了加载数据集,获取数据索引,获取数据总量。

3、DataLoader对数据集先打乱(shuffle),然后划分成mini_batch。

4、len函数的返回值 除以 batch_size 的结果就是每一轮epoch中需要迭代的次数。

5、inputs, labels = data中的inputs的shape是[32,8],labels 的shape是[32,1]。也就是说mini_batch在这个地方体现的

6、diabetes.csv数据需和源代码放在同一个文件夹内。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值