这段代码不长,实现的原理也不是很难理解。
但是它的实现的代码来来回回看了很久才懂,主要是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