此文为了记录一下学习过程中的错误,刚开始学pytorch水平辣鸡,如有错误请大佬指出~ 也希望能帮到一些遇到同样错误的小伙伴~
使用版本
python 3.7
pytorch 1.4.0
原始代码(错误)
import torch
from torch.autograd import Variable
batch_n = 64
hidden_layer = 100
input_data = 1000
output_data = 10
#构建一个继承了torch.nn.Module的新类,来完成对前向传播函数和后向传播函数的重写
class Model(torch.nn.Module): #通过class Model(torch.nn.Module)完成类继承
def __init__(self): #类的初始化
super(Model,self).__init__()
def forward(self,input,w1,w2):#forward函数,实现模型的前向传播中的矩阵运算
x = torch.mm (input,w1)
x = torch.clamp(x,min = 0)
x =torch.mm(x,w2)
return x
def backward(self): #backward函数,实现模型的后向传播中的自动梯度计算
pass
#对模型进行训练和对参数进行优化
x = Variable(torch.randn(batch_n, input_data), requires_grad = False)
y = Variable(torch.randn(batch_n, output_data), requires_grad = False)
w1 =Variable(torch.randn(input_data, hidden_layer), requires_grad = True)
w2 =Variable(torch.randn(hidden_layer, output_data), requires_grad = True)
epoch_n = 30 #训练的次数
learning_rate = 1e-6 #学习速率
for epoch in range(epoch_n):
y_pred = Model(x,w1,w2)
loss = (y_pred-y).pow(2).sum()
#print ("Epoch:{}, Loss:{:.4f}".format(epoch, loss.data[O]))
print ("Epoch:{}, Loss:{:.4f}".format(epoch, loss.data))
loss.backward()
w1.data -= learning_rate * w1.grad.data
w2.data -= learning_rate * w2.grad.data
w1.grad.data.zero_()
w2.grad.data.zero_()
该代码参考《深度学习之PyTorch实战计算机视觉》,由于自己的疏忽,把书中一句重要的代码遗漏了,所以有了上述错误代码。运行后报错:
TypeError: __init__() takes 1 positional argument but 4 were given
错误解决
使用以下语句对重写后的类进行调用:
model = Model()
并将 y_pred = Model(x,w1,w2) 改为:
y_pred = model(x,w1,w2)
反思
本身这个代码就是在书上看到的,拿来实际试一下并进一步理解,结果自己漏掉一句代码,出了这个错。查了很久别人如何解决这个问题的,很多解决方法都是基于没有self这个情况。果然还是对类这个概念不太熟悉,调用都不会-_-||
参考博客
看了以下博客才意识到自己的错误,在此表示感谢。
改正后的代码
import torch
from torch.autograd import Variable
batch_n = 64
hidden_layer = 100
input_data = 1000
output_data = 10
#构建一个继承了torch.nn.Module的新类,来完成对前向传播函数和后向传播函数的重写
class Model(torch.nn.Module): #通过class Model(torch.nn.Module)完成类继承
def __init__(self): #类的初始化
super(Model,self).__init__()
def forward(self,input,w1,w2):#forward函数,实现模型的前向传播中的矩阵运算
x = torch.mm (input,w1)
x = torch.clamp(x,min = 0)
x =torch.mm(x,w2)
return x
def backward(self): #backward函数,实现模型的后向传播中的自动梯度计算
pass
model = Model()
#对模型进行训练和对参数进行优化
x = Variable(torch.randn(batch_n, input_data), requires_grad = False)
y = Variable(torch.randn(batch_n, output_data), requires_grad = False)
w1 =Variable(torch.randn(input_data, hidden_layer), requires_grad = True)
w2 =Variable(torch.randn(hidden_layer, output_data), requires_grad = True)
epoch_n = 30 #训练的次数
learning_rate = 1e-6 #学习速率
for epoch in range(epoch_n):
y_pred = model(x,w1,w2)
loss = (y_pred-y).pow(2).sum()
#print ("Epoch:{}, Loss:{:.4f}".format(epoch, loss.data[O]))
print ("Epoch:{}, Loss:{:.4f}".format(epoch, loss.data))
loss.backward()
w1.data -= learning_rate * w1.grad.data
w2.data -= learning_rate * w2.grad.data
w1.grad.data.zero_()
w2.grad.data.zero_()