为什么 pytorch 中的正则化和临时代码不匹配?pytorch 中的正则化公式是什么?

2023-12-27

我一直在尝试对 PyTorch 中的二元分类模型进行 L2 正则化,但是当我匹配 PyTorch 的结果和临时代码时,它不匹配, 火炬代码:

class LogisticRegression(nn.Module):
  def __init__(self,n_input_features):
    super(LogisticRegression,self).__init__()
    self.linear=nn.Linear(4,1)
    self.linear.weight.data.fill_(0.0)
    self.linear.bias.data.fill_(0.0)

  def forward(self,x):
    y_predicted=torch.sigmoid(self.linear(x))
    return y_predicted

model=LogisticRegression(4)

criterion=nn.BCELoss()
optimizer=torch.optim.SGD(model.parameters(),lr=0.05,weight_decay=0.1)
dataset=Data()
train_data=DataLoader(dataset=dataset,batch_size=1096,shuffle=False)

num_epochs=1000
for epoch in range(num_epochs):
  for x,y in train_data:
    y_pred=model(x)
    loss=criterion(y_pred,y)
    loss.backward()
    optimizer.step()
    optimizer.zero_grad()

暂存代码:

def sigmoid(z):
    s = 1/(1+ np.exp(-z))
    return s  

def yinfer(X, beta):
  return sigmoid(beta[0] + np.dot(X,beta[1:]))

def cost(X, Y, beta, lam):
    sum = 0
    sum1 = 0
    n = len(beta)
    m = len(Y)
    for i in range(m): 
        sum = sum + Y[i]*(np.log( yinfer(X[i],beta)))+ (1 -Y[i])*np.log(1-yinfer(X[i],beta))
    for i in range(0, n): 
        sum1 = sum1 + beta[i]**2
        
    return  (-sum + (lam/2) * sum1)/(1.0*m)

def pred(X,beta):
  if ( yinfer(X, beta) > 0.5):
    ypred = 1
  else :
    ypred = 0
  return ypred
beta = np.zeros(5)
iterations = 1000
arr_cost = np.zeros((iterations,4))
print(beta)
n = len(Y_train)
for i in range(iterations):
    Y_prediction_train=np.zeros(len(Y_train))
    Y_prediction_test=np.zeros(len(Y_test)) 

    for l in range(len(Y_train)):
        Y_prediction_train[l]=pred(X[l,:],beta)
    
    for l in range(len(Y_test)):
        Y_prediction_test[l]=pred(X_test[l,:],beta)
    
    train_acc = format(100 - np.mean(np.abs(Y_prediction_train - Y_train)) * 100)
    test_acc = 100 - np.mean(np.abs(Y_prediction_test - Y_test)) * 100   
    arr_cost[i,:] = [i,cost(X,Y_train,beta,lam),train_acc,test_acc]
    temp_beta = np.zeros(len(beta))

    ''' main code from below '''

    for j in range(n): 
        temp_beta[0] = temp_beta[0] + yinfer(X[j,:], beta) - Y_train[j]
        temp_beta[1:] = temp_beta[1:] + (yinfer(X[j,:], beta) - Y_train[j])*X[j,:]
    
    for k in range(0, len(beta)):
        temp_beta[k] = temp_beta[k] +  lam * beta[k]  #regularization here
    
    temp_beta= temp_beta / (1.0*n)
    
    beta = beta - alpha*temp_beta

损失图 https://i.stack.imgur.com/3ubJI.png

训练准确率图 https://i.stack.imgur.com/PwN1e.png

测试准确度图 https://i.stack.imgur.com/SPJn3.png

有人可以告诉我为什么会发生这种情况吗? L2值=0.1


很好的问题。我挖掘了很多PyTorch文档并找到了答案。答案很tricky。基本上有two计算方法正则化。 (夏季跳转到最后一部分)。

The PyTorch使用第一种(其中正则化因子不除以批量大小)。

这是一个示例代码,它演示了:

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import torch.optim as optim
 
class model(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(1, 1)
        self.linear.weight.data.fill_(1.0)
        self.linear.bias.data.fill_(1.0)

    def forward(self, x):
        return self.linear(x)


model     = model()
optimizer = optim.SGD(model.parameters(), lr=0.1, weight_decay=1.0)

input     = torch.tensor([[2], [4]], dtype=torch.float32)
target    = torch.tensor([[7], [11]], dtype=torch.float32)

optimizer.zero_grad()
pred      = model(input)
loss      = F.mse_loss(pred, target)

print(f'input: {input[0].data, input[1].data}')
print(f'prediction: {pred[0].data, pred[1].data}')
print(f'target: {target[0].data, target[1].data}')

print(f'\nMSEloss: {loss.item()}\n')

loss.backward()

print('Before updation:')
print('--------------------------------------------------------------------------')
print(f'weight [data, gradient]: {model.linear.weight.data, model.linear.weight.grad}')
print(f'bias [data, gradient]: {model.linear.bias.data, model.linear.bias.grad}')
print('--------------------------------------------------------------------------')
 
optimizer.step()

print('After updation:')
print('--------------------------------------------------------------------------')
print(f'weight [data]: {model.linear.weight.data}')
print(f'bias [data]: {model.linear.bias.data}')
print('--------------------------------------------------------------------------')

which outputs:

input: (tensor([2.]), tensor([4.]))
prediction: (tensor([3.]), tensor([5.]))
target: (tensor([7.]), tensor([11.]))

MSEloss: 26.0

Before updation:
--------------------------------------------------------------------------
weight [data, gradient]: (tensor([[1.]]), tensor([[-32.]]))
bias [data, gradient]: (tensor([1.]), tensor([-10.]))
--------------------------------------------------------------------------
After updation:
--------------------------------------------------------------------------
weight [data]: tensor([[4.1000]])
bias [data]: tensor([1.9000])
--------------------------------------------------------------------------

Here m = 批量大小 = 2,lr = alpha = 0.1,lambda = Weight_decay = 1.

现在考虑张量weight其中有值 = 1 且等级 = -32

情况1(类型1正则化):

 weight = weight - lr(grad + weight_decay.weight)
 weight = 1 - 0.1(-32 + 1(1))
 weight = 4.1

case2(类型2正则化):

 weight = weight - lr(grad + (weight_decay/batch size).weight)
 weight = 1 - 0.1(-32 + (1/2)(1))
 weight = 4.15

来自output我们可以看到更新了重量 = 4.1000。至此结束PyTorch uses type1正则化。

所以最后在你的代码中你遵循type2正则化。所以只需将最后几行更改为:

# for k in range(0, len(beta)):
#    temp_beta[k] = temp_beta[k] +  lam * beta[k]  #regularization here

temp_beta= temp_beta / (1.0*n)

beta = beta - alpha*(temp_beta + lam * beta)

还有 PyTorchloss功能doesn't包括正则化项(在内部实现优化器)所以也删除正则化您的自定义中的条款cost功能。

总之:

  1. Pytorch用这个正则化功能:

  2. 正则化是在里面实现的优化器(权重衰减参数)。

  3. PyTorch 损失功能doesn't包括正则化项。

  4. Bias也是正则化的如果使用正则化。

  5. 要使用正则化,请尝试:

    torch.nn.optim.optimiser_name(model.parameters(),lr,weight_decay=lambda).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 pytorch 中的正则化和临时代码不匹配?pytorch 中的正则化公式是什么? 的相关文章

随机推荐

  • _AppStart.cshtml、PackageManager、WebMatrix

    我认为将 SimpleMembersihp 添加到 MVC4 Web 是一件简单的事情 并非如此 模板化代码 例如 C 非常适合支持它 但 web config 大多是不可知的 缺乏配置任何特定安全机制的元素 我正在关注 Scott All
  • 在 XSL 翻译中更改 XML 文件的命名空间

    所以我有一个输入文件 它在默认命名空间中使用我公司的命名空间 xmlns companyURL 但我希望我的输出文件使用默认命名空间以外的其他内容 xmlns cmp companyURL 所以我使用以下方法构建我的文件cmp命名空间 但我
  • numpy 数组到文件,np.savetxt

    当我使用 np savetxt file txt arr1 arr2 arr3 时 将多个 numpy 数组保存到文件的最佳方法是什么 数组按列保存 而不是按行保存 因此很难导入到 Excel 中 如何以更标准的方式保存数组 Thanks
  • 如何屏蔽文本中的信用卡号掩码?

    我的网站上有一个表格 我的客户用此表格向我发送消息 有时他们会在消息上写下信用卡号码 所以这非常关键 我想屏蔽这些信用卡号码 但卡号当然不会定期出现 示例1 1111222233334444 示例2 4444 3333 2222 1111
  • 更改传单中标记的大小

    我在传单的地图上有一个标记 var centerMarker L marker centerPoint title unselected bindLabel schools i 0 centerMarker on click selectM
  • 为什么应该在 Android 中使用自定义内容提供程序?

    使用自定义内容提供商有哪些优势 为什么这样的内容提供者优于包装 SQL 查询的普通类 内容提供程序可以从其他进程中使用 并且是 Android 上的某些机制 例如全局搜索 所需要的 还有一些可用的类可以帮助您处理内容提供 者 从而节省您管理
  • .NET 6:如何在控制台应用程序启动中使用方法重载?

    NET 6 在控制台应用程序 Startup 类中提供了样板删除功能 我尝试运行这个简单的测试代码 Console WriteLine Hello World static void Test int a int b static void
  • 对数时间并行减少

    Given n部分和 可以在 log2 并行步骤中对所有部分和进行求和 例如 假设有八个线程 有八个部分和 s0 s1 s2 s3 s4 s5 s6 s7 这可以减少log2 8 3像这样的连续步骤 thread0 thread1 thre
  • 我可以让 html.HiddenFor / Html.Hidden 创建一个 id 还是应该手动创建它?

    我这样做 它创建了一个隐藏的输入 但没有id just name 我需要id 我可以让它创建一个id also atm 我这样做 一种更干净的方法是 但除此之外 你现有的方法就可以了 如果您确实想要一个简单的语法 您可以创建一个调用 Hid
  • 如何创建 python selenium 应用程序及其驱动程序?

    我刚刚开始使用 python 和爬行 我使用selenium和beautifulsoup来解析和抓取页面 我的问题是我是否必须用它制作一个应用程序或将其部署在某些iis服务器上 或我不知道的任何其他方式 比如它是如何工作的 我不知道即使确定
  • 如何实现 hashCode 和 equals 方法从 ArrayList 中删除重复项

    我正在从数据库模型 Income 获取数据 这就是它的样子 Table name Income public class Income extends Model Column name AmountDate public String a
  • Oracle SQL 约束 where 子句

    我在 oracle 上有一个包含以下列的 Tester 表 TesterID 测试者姓名 是默认值 应用程序ID TesterID 是主键 现在我希望只能有一个默认测试器 这意味着只有一个测试器可以在 ApplicationID 处具有计算
  • GDB 中的断点命名

    有没有办法在 GDB 中命名一个断点 以便在断点被击中时 GDB 给出一些名称而不是数字 IE 在方法 main 中命中断点 非常重要的断点 不 没有办法做到这一点 但您可以使用 命令 命令和打印命令 e g break main comm
  • 如何使用变量名调用java方法?

    假设我有 Method1 void Method2 void 有没有办法我可以选择其中一个带有变量的方法 String MyVar 2 MethodMyVar 使用反射 Method method WhateverYourClassIs c
  • 如何根据单个用户定义的文字自动添加文字定义?

    C 11 offers 用户定义的文字 http en wikipedia org wiki C 2B 2B11 User defined literals 我刚刚开始使用它们 这让我想知道是否可以自动添加所有SI 乘数 http en w
  • Keras + DataFrameMapper + make_pipeline,input_dim 困境

    我的数据看起来像这样 import pandas as pd from sklearn pandas import DataFrameMapper CategoricalImputer from sklearn preprocessing
  • 法罗双重调度

    有人可以解释一下 Pharo 4 0 中使用 Smalltalk 进行双重调度的过程吗 我是 Smalltalk 的新手 很难掌握这个概念 因为与 Smalltalk 相比 它在 Java 中的实现方式非常不同 如果有人能用一个例子来解释它
  • 组合 XPATH 轴(前同级和后同级)

    假设我有以下 UL ul li barry li li bob li li carl li li dave li li roger li li steve li ul 我需要获取鲍勃和罗杰之间的所有 LI 我可以抓住鲍勃之后的一切 ul l
  • 编写一个函数来删除对象(如果存在)

    我正在尝试编写一个函数来删除对象 如果存在 原因是我想摆脱日志消息错误 未找到对象 arg 我尝试了以下方法 ifrm lt function arg if exists as character substitute arg rm arg
  • 为什么 pytorch 中的正则化和临时代码不匹配?pytorch 中的正则化公式是什么?

    我一直在尝试对 PyTorch 中的二元分类模型进行 L2 正则化 但是当我匹配 PyTorch 的结果和临时代码时 它不匹配 火炬代码 class LogisticRegression nn Module def init self n