说在前面
前面几节课学习了mindspore的一些操作方法,接下来学习下稍微有一些技术含量的内容。
正向计算图
图中内容对应的代码如下,为了便于查看分析,增加了对数据的shape打印:
python
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
print(f"x shape {x.shape}")
print(f"y shape {y.shape}")
print(f"w shape {w.shape}")
print(f"b shape {b.shape}")
可以查看到输出的结果是
shell
x shape (5,)
y shape (3,)
w shape (5, 3)
b shape (3,)
简单理解是:
xshape为[5],和w[5, 3]相乘,获得的结果理论上是[3]的大小。之后和b相加,结果仍然是[3],也就是图片中的z
,其实应该有一个激活函数的,对应图片中的CE,也就是交叉熵损失函数。
对应的代码是
python
def function(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
模型网络正向逻辑介绍完毕。
反向计算逻辑
上面的公式中,w和b是模型训练过程中需要学习的参数,因此反向主要是更新w和b。
在mindspone中的方法是:
python
grad_fn = mindspore.grad(function, (2, 3))
获得计算结果:
到这里,也就介绍完毕算子的正向和反向的使用方法。
接下来会通过神经网络的例子,介绍自动微分的功能。
最后将x,y 导入,然后进行执行:
打卡
完成mindspone的自动微分学习,感觉使用起来没那么顺畅了。