前馈神经网络正则化例子

直接看代码:

python 复制代码
import torch  
import numpy as np  
import random  
from IPython import display  
from matplotlib import pyplot as plt  
import torchvision  
import torchvision.transforms as transforms   

mnist_train = torchvision.datasets.MNIST(root='/MNIST', train=True, download=True, transform=transforms.ToTensor())  
mnist_test = torchvision.datasets.MNIST(root='./MNIST', train=False,download=True, transform=transforms.ToTensor())  

batch_size = 256 

train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True,num_workers=0)  
test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False,num_workers=0)  

num_inputs,num_hiddens,num_outputs =784, 256,10

def init_param():
    W1 = torch.tensor(np.random.normal(0, 0.01, (num_hiddens,num_inputs)), dtype=torch.float32)  
    b1 = torch.zeros(1, dtype=torch.float32)  
    W2 = torch.tensor(np.random.normal(0, 0.01, (num_outputs,num_hiddens)), dtype=torch.float32)  
    b2 = torch.zeros(1, dtype=torch.float32)  
    params =[W1,b1,W2,b2]
    for param in params:
        param.requires_grad_(requires_grad=True)  
    return W1,b1,W2,b2

def relu(x):
    x = torch.max(input=x,other=torch.tensor(0.0))  
    return x

def net(X):  
    X = X.view((-1,num_inputs))  
    H = relu(torch.matmul(X,W1.t())+b1)  
    #myrelu =((matmal x,w1)+b1),return  matmal(myrelu,w2 )+ b2
    return relu(torch.matmul(H,W2.t())+b2 )
    return torch.matmul(H,W2.t())+b2


def SGD(paras,lr):  
    for param in params:  
        param.data -= lr * param.grad  
        
def l2_penalty(w):
    return (w**2).sum()/2


def train(net,train_iter,test_iter,loss,num_epochs,batch_size,lr=None,optimizer=None,mylambda=0):  
    
    train_ls, test_ls = [], []
    
    for epoch in range(num_epochs):
        
        ls, count = 0, 0
        
        for X,y in train_iter :
            X = X.reshape(-1,num_inputs)
            l=loss(net(X),y)+ mylambda*l2_penalty(W1) + mylambda*l2_penalty(W2)
            
            optimizer.zero_grad()
            l.backward()
            optimizer.step()
            
            ls += l.item()
            count += y.shape[0]
            
        train_ls.append(ls)
        
        ls, count = 0, 0
        
        for X,y in test_iter:
            X = X.reshape(-1,num_inputs)
            l=loss(net(X),y) + mylambda*l2_penalty(W1) + mylambda*l2_penalty(W2)
            ls += l.item()
            count += y.shape[0]
            
        test_ls.append(ls)
        
        if(epoch)%2==0:
            print('epoch: %d, train loss: %f, test loss: %f'%(epoch+1,train_ls[-1],test_ls[-1]))
            
    return train_ls,test_ls



lr = 0.01

num_epochs = 20

Lamda = [0,0.1,0.2,0.3,0.4,0.5]

Train_ls, Test_ls = [], []

for lamda in Lamda:
    print("current lambda is %f"%lamda)
    W1,b1,W2,b2 = init_param()
    loss = torch.nn.CrossEntropyLoss()
    optimizer = torch.optim.SGD([W1,b1,W2,b2],lr = 0.001)
    train_ls, test_ls = train(net,train_iter,test_iter,loss,num_epochs,batch_size,lr,optimizer,lamda)   
    Train_ls.append(train_ls)
    Test_ls.append(test_ls)
    
x = np.linspace(0,len(Train_ls[1]),len(Train_ls[1]))

plt.figure(figsize=(10,8))

for i in range(0,len(Lamda)):
    plt.plot(x,Train_ls[i],label= f'L2_Regularization:{Lamda [i]}',linewidth=1.5)
    
    plt.xlabel('different epoch')
    
    plt.ylabel('loss')
    
plt.legend(loc=2, bbox_to_anchor=(1.1,1.0),borderAxesPad = 0.)

plt.title('train loss with L2_penalty')

plt.show()

运行结果:

疑问和心得:

  1. 画图的实现和细节还是有些模糊。
  2. 正则化系数一般是一个可以根据算法有一定变动的常数。
  3. 前馈神经网络中,二分类最后使用logistic函数返回,多分类一般返回softmax值,若是一般的回归任务,一般是直接relu返回。
  4. 前馈神经网络的实现,从物理层上应该是全连接的,但是网上的代码一般都是两层单个神经元,这个容易产生误解。个人感觉,还是要使用nn封装的函数比较正宗。
相关推荐
金融小师妹20 分钟前
OpenAI拟借AI估值重构浪潮冲击1.1万亿美元IPO——基于市场情绪因子与估值量化模型的深度分析
大数据·人工智能·深度学习·1024程序员节
IT北辰1 小时前
用 Python 实现连续数据分组求和并回写
开发语言·python
小白学大数据1 小时前
从携程爬取的杭州酒店数据中提取价格、评分与评论的关键信息
爬虫·python·性能优化
IT学长编程1 小时前
计算机毕业设计 基于Python的热门游戏推荐系统的设计与实现 Django 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
大数据·python·django·毕业设计·课程设计·毕业论文
Ashlee_code2 小时前
什么是TRS收益互换与场外个股期权:从金融逻辑到系统开发实践
大数据·人工智能·python·金融·系统架构·清算·柜台
今天没有盐2 小时前
Python编程实战:日期处理与数学算法综合练习
python·pycharm·编程语言
宸津-代码粉碎机3 小时前
Java内部类内存泄露深度解析:原理、场景与根治方案(附GC引用链分析)
java·开发语言·jvm·人工智能·python
weixin_307779133 小时前
Python编码规范之字符串规范修复程序详解
开发语言·python·代码规范
ShiMetaPi3 小时前
ShimetaPi丨事件相机新版SDK发布:支持Python调用,可降低使用门槛
深度学习·计算机视觉·事件相机·evs
爬台阶的蚂蚁3 小时前
使用 UV 工具管理 Python 项目的常用命令
python·uv