速通深度学习(1):构建数据训练任务(A)

(0)分类任务集:

     MNIST:50000 张 图片,每张图规格:28 x 28 x 1 ~ 其中 1 是颜色通道

   

    One-Hot_Encoding:返回一列标签分布的概率值 : 比方说5 ~ [0,0,0,0,1,0,0,0,0,0]

    

  784  x 128 ~ 128 x10 ~ 10 x 1  => 784:Dim_Input, 128:Dim_Hidden,10:Dim_Predicted

(1)利用Model建立模型:

     * 继承:

import torch.nn.functional as F
from torch import nn

dim_input = 784
dim_hidden1 = 128
dim_hidden2 = 256
dim_output = 10

class NN (nn.Module):
    # 从 nn.Module 继承类函数
    def __init__(self):
        super().__init__()
       # 定义父类
        self.hidden1 = nn.Linear(dim_input,dim_hidden1)
        self.hidden2 = nn.Linear(dim_hidden1,dim_hidden2)
        self.out = nn.Linear(dim_hidden2,dim_output)
        

     * 向前传播(Forward):

    def forward(self,x):
       # 调用 F 模块下的函数 relu
        x = F.relu(self.hidden1(x))
       # 直接作用在每个层的返回向量上面
        x = F.relu(self.hidden2(x)) 
        x = self.out(x)
        return x

net = nn()
# 建立 net 实例
print(net)
# 打印 net 参数

(2)使用 TensorDataset 和 DataLoader 来读取数据:

    * 产生 x_train,y_train:读取MNIST

    * 对 x_train,y_train读取数据

from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader

batch_size = 64

train_dataset = TensorDataset(x_train, y_train)
valid_dataset = TensorDataset(x_train, y_train)

train_dataloader = DataLoader(train_dataset, batch_size = batchsize, shuffle = True)
valid_dataloader = DataLoader(valid_dataset, batch_size = batchsize*2 )

(3)加载-模型的 训练和优化:

from torch import optim

lr = 2e-3

loss_func = F.cross_entropy
    
def get_model():
    model = NN()
    # 实例化model,opt
    return model, optim.SGD(model.parameters(), lr = lr)

def loss_batch(model, loss_func, xb, yb, opt = None):
    loss = loss_func(model(xb),yb)
    # 调用opt并_更新_并_清除_梯度缓存
    if opt is not None:
        loss.backward()
        opt.step()
        opt.zero_grad()
    # len(xb) 被设计于 后文统计总规模,以求迄今为止的平均loss
    # 貌似都是 0 阶张量 (数)
    return loss.item(),len(xb)


def fit(steps, model, loss_func, opt, train_dataLoader, valid_dataLoader):
    
    for step in range(steps):
        # 不知道 model.train()有什么用
        model.train()
        for xb,yb in train_dataLoader:
            loss_batch(model, loss_func, xb, yb, opt)
        # 不知道 model.eval()有什么用
        modal.eval()
        with torch.no_grad():
            losses,nums = zip(
            *[loss_batch(model, loss_func, xb, yb, opt) for xb,yb in valid_dataLoader]
            # 解压缩
              )
    
        val_loss = np.sum(np.multiply(losses,nums)/np.sum(nums))
        print('\Current step:',step,'\with vaildation Loss:', val_loss)

    * 调用函数

if __name__ == '__main__':
    model, opt = get_model()
    fit(25, model, loss_func, opt, train_dataLoader, vaild_dataLoader)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值