《深度学习入门》4.4.2神经网络的梯度代码分析(内含为什么不能把loss(x,t)方法当成numerical_gradient(f,x)的参数f传进去)

本文通过分析代码和示例解释了为什么不能将loss(x,t)方法直接作为numerical_gradient(f,x)的参数f。错误在于这样做会导致交叉熵值直接计算出来,而无法进行梯度计算。文中详细讨论了Python语法、axis参数的理解以及y[np.arange(batch_size), t]的含义,并给出了up主的解释。" 136563334,7400371,自定义UDP传输:ThingsBoard UDP Transport实现指南,"['物联网平台', 'ThingsBoard框架', 'UDP传输', '服务器开发', '网络通信']
摘要由CSDN通过智能技术生成

这段代码不长,实现的原理也不是很难理解。

但是它的实现的代码来来回回看了很久才懂,主要是python语法的查阅等等耗时很久。

感谢B站致敬大神up主在群里对我提出的问题做出的解答。

B站传送地址:https://space.bilibili.com/389455044?spm_id_from=333.788.b_765f7570696e666f.1

 

先来贴上正确的代码我对其的注释

gradient_simplenet.py

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录中的文件而进行的设定
import numpy as np
from common.functions import softmax, cross_entropy_error
from common.gradient import numerical_gradient


class simpleNet:
    #https://www.jianshu.com/p/608263a1f0c6 如何通俗解释python中的init ?
    #https://www.jianshu.com/p/d75931b2586c python类定义中__init__()的作用
    #https://blog.csdn.net/geerniya/article/details/77487941 类中为什么要定义__init__()方法
    def __init__(self):
        self.W = np.random.randn(2,3)#利用高斯分布进行初始化生成W的矩阵

    def predict(self, x):
        #进行矩阵的计算
        return np.dot(x, self.W)

    def loss(self, x, t):
        z = self.predict(x)
        y = softmax(z)
        loss = cross_entropy_error(y, t)#调用的common/functions中的代码

        return loss

x = np.array([0.6, 0.9])#输入的图像数据
t = np.array([0, 0, 1])#正确标签

#初始化神经网络(就是权重之类的)(实例化simpleNet类)
net = simpleNet()
#这里定义的参数w是一个伪参数
f = lambda w: net.loss(x, t)
#这里的梯度就是损失函数f对权重net.W的偏微分
dW = numerical_gradient(f, net.W)#调用的common/gradient中的代码
#这里lambda等价于以下:
#def f(W):
#    return net.loss(x,t)
#dW = numerical_gradient(f,net.W)

print(dW)

执行结果如下

其中调用的别处的代码cross_entropy_error(y,t)以及numerical_gradient(f,net.W)也贴上来,这样有个较为完整的理解,它们分别在common/fun

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值