深入学习:Python中的反向传播代码

深入学习:Python中的反向传播代码,python,deep-learning,backpropagation,Python,Deep Learning,Backpropagation,我在读这本书,我正在努力处理其中的一些代码 (代码来源于迈克尔·尼尔森) 类网络(对象): def更新小批量(自我、小批量、eta): “”“通过应用更新网络的权重和偏差 梯度下降使用反向传播到单个小批量。 “mini_batch”是元组(x,y)和“eta”的列表 学习率是多少 nabla_b=[b在自偏压中的np.Zero(b.shape)] nabla_w=[np.零(w.形状)表示自权重中的w] 对于小批量中的x、y: delta_nabla_b,delta_nabla_w=self.b

我在读这本书,我正在努力处理其中的一些代码

(代码来源于迈克尔·尼尔森)

类网络(对象):
def更新小批量(自我、小批量、eta):
“”“通过应用更新网络的权重和偏差
梯度下降使用反向传播到单个小批量。
“mini_batch”是元组(x,y)和“eta”的列表
学习率是多少
nabla_b=[b在自偏压中的np.Zero(b.shape)]
nabla_w=[np.零(w.形状)表示自权重中的w]
对于小批量中的x、y:
delta_nabla_b,delta_nabla_w=self.backprop(x,y)
nabla_b=[nb+dnb代表nb,邮政编码中的dnb(nabla_b,delta_-nabla_b)]
nabla_w=[nw+dnw代表西北,dnw在zip中(nabla_w,delta_-nabla_w)]
自重=[w-(预计到达时间/长度(小批量))*nw
对于拉链中的w、nw(自重,nabla_w)]
自身偏差=[b-(eta/len(小批量))*nb
对于b,zip中的nb(自偏压,nabla_b)]
def后支撑(自、x、y):
nabla_b=[b在自偏压中的np.Zero(b.shape)]
nabla_w=[np.零(w.形状)表示自权重中的w]
#前馈
激活=x
activations=[x]#列出以逐层存储所有激活
zs=[]#列出以逐层存储所有z向量
对于拉链中的b、w(自偏压、自重量):
z=np.点(w,活化)+b
附加(z)
激活=乙状结肠(z)
activations.append(激活)
#向后传球
因为它说
mini\u batch
是元组列表
(x,y)
,所以函数
backprop
x
的参数是标量,对吗?如果是这样,因为
w
(权重)是一个矩阵(假设它的维数是
n*p
),它的行在
l
层有
n
个神经元,列在
l-1
层有
p
个神经元。然后,
x
必须是
nx1
向量。我感到困惑

在书中的例子中,它使用了
[2,3,1]
,即三层,分别有2,3和1个神经元。因为第一层输入,所以它有两个元素。所以第二层的权重矩阵有3*2维。似乎
x
应该是长度为2的向量,以便与
w
进行矩阵乘法

此外,关于激活a的
C_x
偏导数的代码如下:

def成本衍生工具(自身、输出激活、y):
“”“返回偏导数向量\partial C_x/
\部分a用于输出激活。”“”
返回(输出\激活-y)
我检查了公式,我知道(
输出\u激活-y
)意味着成本的变化。但这应该被激活的变化分开吗

你能帮我吗

因为它说“mini_batch”是元组列表(x,y)”,所以函数backprop中x的参数是标量,对吗

不是。单词“batch”对应于python列表。在batch/python列表中有类似于
(x,y)
的对,其中
x
表示输入向量,
y
表示标签。
x
的形状取决于创建网络对象的方式。在
[2,3,1]
的情况下,x应该是形状的向量
(2,)

但这应该被激活的变化分开吗

没有

首先,你所想的是所谓的“数值微分”。既然你没有改变成本,你就不应该通过改变激活来改变它

第二,作者使用的是所谓的“分析差异”。比如说,你有一个函数
f(x,y)=0.5*(x-y)^2
f
w.r.t.
x
的偏导数是
x-y
。因此,您不需要将其除以
x
的变化。但是,您需要注意使用的实际成本函数,以便导出正确的导数。有时,如何计算这些值并不明显。在这种情况下,损失是均方误差,如在线书籍中所述


对评论的答复:

输入为向量_x=(1,2,3)的训练集


培训集应该是一个包含一组培训样本的容器,其中每个培训样本由一个输入和相应的标签组成。因此,小批量的示例可能是一个python列表,如:
[([0,1],[1,2]),([2,1],[3,2])]
,这表明有两个训练样本。第一个是
([0,1],[1,2])
,第二个是
([2,1],[3,2])
。以第一个为例,其输入为
[0,1]
(形状向量
(2,)
),其输出为
[1,2]
,这意味着单个训练样本的输入和期望输出都可以是向量。你的问题有些含糊不清(
[(1,a)、(2,b)、(3,c)]
),所以我希望我能解释清楚。

你救了我!非常感谢你。关于mini_批,假设有一个训练集,其输入为vector_x=(1,2,3),其相应的输出为vector_y=(a,b,c)。而小批量的形式是[(向量x,向量y)],而不是[(1,a),(2,b),(3,c)],对吗?@I-FanLin我已经更新了我的答案。谢谢你的快速回复。这是非常清楚和有益的。