我已经编写了一些代码来实现具有逻辑激活函数和softmax输出的深度神经网络中的反向传播.
def backprop_deep(node_values, targets, weight_matrices):
delta_nodes = node_values[-1] - targets
delta_weights = delta_nodes.T.dot(node_values[-2])
weight_updates = [delta_weights]
for i in xrange(-2, -len(weight_matrices)- 1, -1):
delta_nodes = dsigmoid(node_values[i][:,:-1]) * delta_nodes.dot(weight_matrices[i+1])[:,:-1]
delta_weights = delta_nodes.T.dot(node_values[i-1])
weight_updates.insert(0, delta_weights)
return weight_updates
Run Code Online (Sandbox Code Playgroud)
代码运行良好,但当我切换到ReLU作为激活功能时,它停止工作.在backprop例程中,我只更改激活函数的导数:
def backprop_relu(node_values, targets, weight_matrices):
delta_nodes = node_values[-1] - targets
delta_weights = delta_nodes.T.dot(node_values[-2])
weight_updates = [delta_weights]
for i in xrange(-2, -len(weight_matrices)- 1, -1):
delta_nodes = (node_values[i]>0)[:,:-1] * delta_nodes.dot(weight_matrices[i+1])[:,:-1]
delta_weights = delta_nodes.T.dot(node_values[i-1])
weight_updates.insert(0, delta_weights)
return weight_updates
Run Code Online (Sandbox Code Playgroud)
然而,网络不再学习,并且权重很快变为零并保持在那里.我完全难过了.
我试图找出是否有可能在python类上定义算术运算。我想做些什么:
class a():
@classmethod
def __add__(cls, other):
pass
a + a
Run Code Online (Sandbox Code Playgroud)
但是,我当然知道:
TypeError: unsupported operand type(s) for +: 'type' and 'type'
这样的事情有可能吗?