线性层公式:注意是左乘W的转置,才和pytorch中的实现是一样的。
在这个博客中,我们实现了一个包含线性层和激活函数的简单神经网络模型,并进行了PyTorch模型和Numpy模型之间的转换和对比。在代码解读部分,我们将详细解释线性层的计算过程和激活函数的作用。
- 在代码中,我们生成了一个随机输入
x,并分别使用PyTorch模型和Numpy模型进行前向传播计算。通过打印输出结果,可以观察到两种模型的输出结果非常接近,验证了Numpy模型的计算与PyTorch模型一致。首先,我们定义了一个神经网络模型Model,其中包含一个输入大小为input_size,隐藏层大小为hidden_size的线性层linear1,一个隐藏层大小到4的线性层linear2,以及ReLU和Sigmoid激活函数。在forward方法中,我们首先将输入x传入linear1进行线性变换,然后经过ReLU激活函数,再通过linear2进行另一次线性变换,最后通过Sigmoid激活函数输出。 - 接着,我们定义了一个NumpyModel类,包含权重w1和w2,以及偏置b1和b2。该类实现了Sigmoid和ReLU激活函数的计算方法,并定义了calculate方法用于前向传播计算。在calculate方法中,首先将输入x与w1的转置相乘,再加上偏置b1`,然后通过ReLU激活函数,接着进行第二次线性变换,最后通过Sigmoid激活函数得到输出。
- 在代码中,我们生成了一个随机输入x,并分别使用PyTorch模型和Numpy模型进行前向传播计算。通过打印输出结果,可以观察到两种模型的输出结果非常接近,验证了Numpy模型的计算与PyTorch模型一致。
import numpy as np
import torch
import torch.nn as nn
class Model(nn.Module):
def __init__(self, input_size, hidden_size):
super(Model, self).__init__()
self.linear1 = nn.Linear(input_size, hidden_size)
self.linear2 = nn.Linear(hidden_size, 4)
self.relu = nn.ReLU()
self.sigmoid = nn.Sigmoid()
def forward(self, x):
x = self.linear1(x)
x = self.relu(x)
x = self.linear2(x)
x = self.sigmoid(x)
return x
class NumpyModel():
def __init__(self, w1,b1,w2,b2):
self.w1 = w1
self.w2 = w2
self.b1 = b1
self.b2 = b2
def sigmoid(self, x):
return 1/(1+np.exp(-x))
def relu(self, x):
return np.maximum(x, 0)
def calculate(self, x):
x = np.dot(x, self.w1.T) + self.b1
x = self.relu(x)
x = np.dot(x, self.w2.T) + self.b2
x = self.sigmoid(x)
return x
x = np.random.rand(4,3)
input_size = 3
hidden_size = 2
model = Model(input_size, hidden_size)
model_dict = model.state_dict()
print(model_dict)
# 转换成numpy
w1,b1,w2,b2 = [i.numpy() for i in model_dict.values()]
print(w1,b1,w2,b2)
numpy_model = NumpyModel(w1,b1,w2,b2)
y = model.forward(torch.FloatTensor(x))
print(y)
# tensor([[0.6767, 0.5921, 0.5208, 0.3291],
# [0.6453, 0.6011, 0.5350, 0.3645],
# [0.6716, 0.5956, 0.5243, 0.3362],
# [0.6178, 0.6108, 0.5482, 0.3971]], grad_fn=<SigmoidBackward0>)
y = numpy_model.calculate(x)
print(y)
# [[0.67671876 0.59209415 0.52076253 0.32905723]
# [0.64530637 0.60113407 0.53496877 0.36448668]
# [0.67156238 0.59558471 0.52433283 0.33624309]
# [0.61784075 0.61080961 0.54817037 0.39712243]]
363

被折叠的 条评论
为什么被折叠?



