3 神经网络学习——最后两次改进

1 第四次改进——optim更新参数

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

import numpy as np
import pandas as pd
import random, math

import sklearn
import scipy

N, D_in, H, D_out = 64, 1000, 100, 10
x = torch.randn(N, D_in)
y = torch.randn(N, D_out)

model = nn.Sequential(
    torch.nn.Linear(D_in, H, bias=False),
    torch.nn.ReLU(),
    torch.nn.Linear(H, D_out, bias=False)
)

# 加下划线会改变变量自身的值
torch.nn.init.normal_(model[0].weight)
torch.nn.init.normal_(model[2].weight)

loss_fn = nn.MSELoss(reduction='sum')

# 定义一个优化器实例
learning_rate = 1e-7 # 设置得越小,降得越快!!!
optimizer = torch.optim.SGD(model.parameters(), lr = learning_rate) # 采用SGD的方法优化!!!

for t in range(5000):
    
    # forward pass
    y_pred = model(x)
    
    # loss
    loss = loss_fn(y_pred, y)
    if t % 500 == 0:
        print(t, loss.item())
        
    optimizer.zero_grad() # 注意这里要把梯度清零,否则会出现nan的情况!
    
    # backward
    loss.backward()
    
    # update
    optimizer.step()

2 第五次改进——自定义nn.Modules

import torch.nn as nn

N, D_in, H, D_out = 64, 1000, 100, 10
x = torch.randn(N, D_in)
y = torch.randn(N, D_out)

# 构建模型(就是继承nn.Module)
class TwoLayerNet(nn.Module):
    def __init__(self, D_in, H, D_out): # 可以思考一下为什么不需要N?
        super(TwoLayerNet, self).__init__()
        
        # 定义模型的结构!
        self.linear1 = nn.Linear(D_in, H, bias = False)
        self.linear2 = nn.Linear(H, D_out, bias = False)
        
    def forward(self, x):
        y_pred = self.linear2(self.linear1(x).clamp(min = 0)) # 里面相当于做了一个relu
        return y_pred
# 构建损失函数和优化方法
model = TwoLayerNet(D_in, H, D_out)
loss_fn = nn.MSELoss(reduction='sum')
learning_rate = 1e-5
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)


# 训练过程
for t in range(5000):
    
    # forward pass
    y_pred = model(x)
    
    # loss
    loss = loss_fn(y_pred, y)
    if not t%500:
        print(t, loss.item())
    optimizer.zero_grad()
    
    # backward pass
    loss.backward()
        
    # update 
    optimizer.step()

3 总结

  1. 手动神经网络是一个具体的细节的过程,我们需要做的是把它逐步抽象;
  2. 把神经网络项目的通性从具体的过程中抽象出来聚合成类,将具体的过程转移到初始化部分;
  3. 很好地体现了面向对象的继承和类抽象的特点。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值