#添加到学习笔记2末尾,直接运行。代码意义可以看注释。
#需要import以下库
import torch
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#需要import以上库
print('——————————激活函数——————————')
grad1=torch.linspace(-100,100,10)
print(grad1)
sigmoid=torch.sigmoid(grad1)
print(sigmoid)
grad2=torch.linspace(-2,2,10)
print(grad2)
tanh=torch.tanh(grad2)
print(tanh)
grad3=torch.linspace(-1,1,10)
print(grad3)
relu=torch.relu(grad3)
print(relu)
print('——————————激活函数——————————')
print('——————————求导——————————')
x=torch.ones(1)
w=torch.full([1],2.0,requires_grad=True)
mse=torch.nn.functional.mse_loss(torch.ones(1),x*w)#mse就是loss
print(mse)
grad=torch.autograd.grad(mse,[w])#loss对w求导
print(grad)
mse=torch.nn.functional.mse_loss(torch.ones(1),x*w)#梯度的另一种计算方法
mse.backward()
print(w.grad)
print(w.norm())
print(w.grad.norm())
#softmax激活函数
a=torch.rand(3,requires_grad=True)
print(a)
p=torch.nn.functional.softmax(a,dim=0)#dimd的参数表示在哪个维度上进行softmax
print(p)
grad=torch.autograd.grad(p[0],a,retain_graph=True)#第一个参数是pred,即y,第二个参数为label,即x
print(grad)
grad=torch.autograd.grad(p[1],a,retain_graph=True)#第一个参数是pred,即y,第二个参数为label,即x
print(grad)
grad=torch.autograd.grad(p[2],a,retain_graph=True)#第一个参数是pred,即y,第二个参数为label,即x
print(grad)
print('——————————求导——————————')
print('——————————单层感知机——————————')
x=torch.rand(1,10)
print(x)
w=torch.randn(1,10,requires_grad=True)
print(w)
o=torch.sigmoid([email protected]())
print(o)
loss=torch.nn.functional.mse_loss(torch.full([1,1],3.0),o)
print(loss)
loss.backward()
print(w.grad)
print('——————————单层感知机——————————')
print('——————————多层感知机——————————')
x=torch.rand(1,10)
print(x)
w=torch.rand(2,10,requires_grad=True)
print(w)
o=torch.sigmoid([email protected]())
print(o)
loss=torch.nn.functional.mse_loss(torch.ones(1,2),o)#第一个参数为预测值,第二个参数为计算值
print(loss)
loss.backward()
print(w.grad)
print('——————————多层感知机——————————')
print('——————————2D函数优化例子——————————')
def himmelblau(x):
return (x[0]**2+x[1]-11)**2+(x[0]+x[1]**2-7)**2
#画出图形
x=np.arange(-6,6,0.1)
y=np.arange(-6,6,0.1)
print('x,y range:',x.shape,y.shape)
X,Y=np.meshgrid(x,y)
print('X,Y maps:',X.shape,Y.shape)
Z=himmelblau([X,Y])
fig=plt.figure('himmelblau')#画出函数图像
ax=fig.gca(projection='3d')
ax.plot_surface(X,Y,Z,color='b', shade=True, alpha=0.7,cmap=plt.get_cmap('rainbow'),vmax=1500,vmin=0)
ax.view_init(60,-30)
ax.set_xlabel('x axis')
ax.set_ylabel('y axis')
#plt.show()
#迭代优化过程
x=torch.tensor([-2.,-2.],requires_grad=True)#赋初始值
optimizer=torch.optim.Adam([x],lr=1e-3)
for step in range(20000):
pred=himmelblau(x)
optimizer.zero_grad()#梯度清零
pred.backward()#求梯度
optimizer.step()#迭代
if step % 250 == 0:
print('step {}:x = {},f(x) = {}'.format(step,x.tolist(),pred.item()))
xx=x.tolist()#这里要转化成标量
mx=xx[0]
my=xx[1]
mp=pred.item()
ax.scatter(mx,my,mp)
plt.show()
print('——————————2D函数优化例子——————————')