pytorch梯度下降函数_Pytorch学习笔记6:激活函数/单层感知机/梯度下降求最小值实例...

#添加到学习笔记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函数优化例子——————————')

你可能感兴趣的:(pytorch梯度下降函数)