pytorch Mini-Batch

梯度下降有几种选择:

  • 梯度下降(BatchGD): 计算速度快(运用GPU的并行能力),但是数据集大的话硬件受不了
  • 随机梯度下降(SGD):它的随机性会克服鞍点的问题(遇到鞍点,梯度为0 就走不动了)但是运行时间过长,没有办法运用GPU的并行能力
  • Mini-Batch进行均衡

epoch:对所有样本进行一次前向传播和后向传播

Batch-size:进行一次前向传播和反向传播所用的样本数量

Iteration:数据集中有多少个batch 例如1000个样本 batch-size为100 那么iteration为10
1.将样本打乱 2.确定batch大小

import torch
import numpy as np
from torch.utils.data import Dataset # Dataset是抽象类,不能被实例化,只能继承
from torch.utils.data import DataLoader #帮助我们加载数据
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.s = torch.nn.Sigmoid()    #这里的Sigmoid是一个模块
        
    def forward(self,x):
        x = self.s(self.linear1(x))      #用每一层的线性结构进行非线性输出
        x = self.s(self.linear2(x))      # !!!!这里不能用 self.sigmoid命名 会发生冲突报错 
        x = self.s(self.linear3(x))     
        return x

model = Model()    #实例化一个模型
criterion = torch.nn.BCELoss(reduction = 'sum')    #创建损失函数实例
optimizer = torch.optim.SGD(model.parameters(),lr=0.001)  #创建优化器实例 model.parameters()方法会把model中所有需要优化的参数找出来
class DiabetesDataset(Dataset):
    def __init__(self,filepath):
        # 这里主要写数据的列表文件名,到getitem读取文件
        # 如果数据集容量不大,那么就直接读取进来
        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('C:\\Users\\liuqian\\Desktop\\date\\diabetes.csv.gz')    
train_loader = DataLoader(dataset=dataset,     
                          batch_size=16,
                          shuffle=True,# 是否打乱
                          num_workers=0)# 是否要多线程,构成minibatch并行读取数据 
                                        #???这里设置为1为什么就不行了?
for epoch in range(100):
    for i,data in enumerate(train_loader,0):  #这里针对每一个mini-batch进行一次更新 
        # 1.prepare data
        inputs, labels = data
        # 2.Forward
        y_pred = model(inputs)
        loss = criterion(y_pred,labels)
        print(epoch,i,loss.item())
        # 3.Backward
        optimizer.zero_grad()
        loss.backward()
        #4. Update
        optimizer.step()

    


你可能感兴趣的:(深度学习,pytorch,Mini-batch)