mindspore 函数式自动微分
就是预测值和真实值之间的误差,对神经网络中的权重w和偏置b求导,希望误差越小越好,达到预测值和真实值之间的拟合。尽管对于神经网络为什么能达到这个预测的效果是黑盒模型,但是确实可以拟合实现预测效果。当进行模型训练的时候,会自动微分,反向传播,更新神经网络的参数。这里是简单的手动实现自动微分的示例。有时候,比如评估模型的时候,不需要计算梯度反向传播,可以通过stop_gradient停用计算梯度。这样
·
神经网络的参数更新方式是反向传播。就是预测值和真实值之间的误差,对神经网络中的权重w和偏置b求导,希望误差越小越好,达到预测值和真实值之间的拟合。尽管对于神经网络为什么能达到这个预测的效果是黑盒模型,但是确实可以拟合实现预测效果。
自动微分本身在mindspore内部已经实现。当进行模型训练的时候,会自动微分,反向传播,更新神经网络的参数。这里是简单的手动实现自动微分的示例。
import numpy as np
import mindspore
from mindspore import nn
from mindspore import ops
from mindspore import Tensor, Parameter
x = ops.ones(5, mindspore.float32) # input tensor
y = ops.zeros(3, mindspore.float32) # expected output
w = Parameter(Tensor(np.random.randn(5, 3), mindspore.float32), name='w') # weight
b = Parameter(Tensor(np.random.randn(3,), mindspore.float32), name='b') # bias
x = ops.ones(5, mindspore.float32) # input tensor
y = ops.zeros(3, mindspore.float32) # expected output
w = Parameter(Tensor(np.random.randn(5, 3), mindspore.float32), name='w') # weight
b = Parameter(Tensor(np.random.randn(3,), mindspore.float32), name='b') # bias
loss = function(x, y, w, b)
print(loss)
以上方式可以计算出预测值z和真实标签值y之间的损失值。
grad_fn = mindspore.grad(function, (2, 3))
grads = grad_fn(x, y, w, b)
print(grads)
def function_with_logits(x, y, w, b):
z = ops.matmul(x, w) + b
loss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z))
return loss, z
grad_fn = mindspore.grad(function_with_logits, (2, 3))
grads = grad_fn(x, y, w, b)
print(grads)
这样输出的grads包含两个元素,分别是对w和对b的梯度。
有时候,比如评估模型的时候,不需要计算梯度反向传播,可以通过stop_gradient停用计算梯度
def function_stop_gradient(x, y, w, b):
z = ops.matmul(x, w) + b
loss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z))
return loss, ops.stop_gradient(z)
grad_fn = mindspore.grad(function_stop_gradient, (2, 3))
grads = grad_fn(x, y, w, b)
print(grads)
神经网络一般封装好了反向传播。如果手写反向传播的梯度计算的话,这样:
# Define model
class Network(nn.Cell):
def __init__(self):
super().__init__()
self.w = w
self.b = b
def construct(self, x):
z = ops.matmul(x, self.w) + self.b
return z
# Instantiate model
model = Network()
# Instantiate loss function
loss_fn = nn.BCEWithLogitsLoss()
# Define forward function
def forward_fn(x, y):
z = model(x)
loss = loss_fn(z, y)
return loss
grad_fn = mindspore.value_and_grad(forward_fn, None, weights=model.trainable_params())
loss, grads = grad_fn(x, y)
print(grads)
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐

所有评论(0)