莫凡Pytorch学习笔记
2022-11-30 本文已影响0人
午字横
1:Pytorch中几种基本的激活函数
在计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。
在神经网络中,激活函数是一个非线性函数。因为倘若是线性函数,那么由线性函数的齐次性和可加性就可以将这些线性函数全部等效为一个线性函数,从而失去深度网络模型强大的表示能力。
Pytorch中常用的几个激活函数import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
# fake data
x = torch.linspace(-5, 5, 200) # x data (tensor)
print(x.shape,x)
x_np = x.numpy()
y_relu = F.relu(x).numpy()
y_sigmoid = F.sigmoid(x).numpy()
y_tanh = F.tanh(x).numpy()
y_softplus = F.softplus(x).numpy()
plt.figure(1, figsize=(8, 6))
plt.subplot(221)
plt.plot(x_np, y_relu, c='red', label='relu')
plt.ylim(0, 5)
plt.legend(loc='best')
plt.subplot(222)
plt.plot(x_np, y_sigmoid, c='g', label='sigmoid')
plt.ylim(0, 1)
plt.legend(loc='best')
plt.subplot(223)
plt.plot(x_np, y_tanh, c='b', label='tanh')
plt.ylim(-1, 1)
plt.legend(loc='best')
plt.subplot(224)
plt.plot(x_np, y_softplus, c='k', label='softplus')
plt.ylim(0, 5)
plt.legend(loc='best')
plt.show()
Regression 回归模型的搭建
随机点注意点:
- 一般把网络中具有可学习参数的层(如全连接层、卷积层等)放在构造函数init()中,当然我也可以吧不具有参数的层也放在里面;
- 一般把不具有可学习参数的层(如ReLU、dropout、BatchNormanation层)可放在构造函数中,也可不放在构造函数中,如果不放在构造函数init里面,则在forward方法里面可以使用nn.functional来代替;
- forward方法是必须要重写的,它是实现模型的功能,实现各个层之间的连接关系的核心。
import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # x data (tensor), shape=(100, 1)
y = x.pow(2) + 0.2*torch.rand(x.size()) # noisy y data (tensor), shape=(100, 1)
# plt.scatter(x.data.numpy(), y.data.numpy())
# plt.show()
class Net(torch.nn.Module):
#out_channel 使用的神经元个数
def __init__(self,input_channel,out_channel,output):
super(Net, self).__init__()
self.hidden=torch.nn.Linear(input_channel,out_channel)
self.predict=torch.nn.Linear(out_channel,output)
def forward(self,x):
x=F.relu(self.hidden(x))
return self.predict(x)
net=Net(1,10,1)
print(net)
optimizer=torch.optim.SGD(net.parameters(),lr=0.5)
loss_fn=torch.nn.MSELoss()
plt.ion()
for step in range(100):
prediction=net(x)
loss=loss_fn(prediction,y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if step % 20 == 0:
# plot and show learning process
plt.cla()
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
plt.text(0.5, 0, 'Loss=%.4f' % loss.data)
plt.savefig("./img/02_" + str(step) + ".png")
plt.pause(0.1)
plt.ioff()
plt.show()
02_0.png
02_20.png
02_40.png
02_60.png
02_80.png