python logistic回归因子权重_Python Theano:Logistic回归权重不会更新

我已经广泛地比较了现有的教程,但我无法弄清楚为什么我的权重不会更新.这是返回更新列表的函数:

def get_updates(cost, params, learning_rate):

updates = []

for param in params:

updates.append((param, param - learning_rate * T.grad(cost, param)))

return updates

它在任何类之外的顶层定义.这是每个参数的标准梯度下降.这里的’params’参数以mlp.params形式输入,这只是每层的参数列表的连接列表.除了逻辑回归之外,我删除了每一层,以找出为什么我的成本没有降低的原因.以下是MLP构造函数中mlp.params的定义.它遵循每个层的定义及其各自的参数列表.

self.params = []

for layer in self.layers:

self.params += layer.params

以下是火车功能,我在每个纪元期间为每个小批量调用:

train = theano.function([minibatch_index], cost,

updates=get_updates(cost, mlp.params, learning_rate),

givens= {

x: train_set_x[minibatch_index * batch_size : (minibatch_index + 1) * batch_size],

y: train_set_y[minibatch_index * batch_size : (minibatch_index + 1) * batch_size]

})

我不知道有多少人使用Theano(看起来不是很多);如果你已经读到这一点,谢谢你.

修正:我已经确定我不能使用平均误差作为成本函数.在用负对数似然替换它之后,它照常工作.

最佳答案 这种行为是由一些事情引起的,但它归结为没有正确计算的成本.在您的实现中,LogisticRegression图层的输出是每个输入数字(使用argmax操作获得)的预测类,您可以获取它与预期预测之间的平方差.

这将为模型中的任何参数提供0s wrt的梯度,因为argmax(预测类)输出的梯度与argmax(类概率)的输入将为0.

相反,LogisticRegression应该输出类的概率:

def output(self, input):

input = input.flatten(2)

self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b)

return self.p_y_given_x

然后在MLP课程中,您计算​​成本.您可以使用每个类的所需概率与模型计算的概率之间的均方误差,但人们倾向于使用期望类的负对数似然,您可以在MLP类中实现它:

def neg_log_likelihood(self, x, y):

p_y_given_x = self.output(x)

return -T.mean(T.log(p_y_given_x)[T.arange(y.shape[0]), y])

然后您可以使用此功能计算您的成本和模型列车:

cost = mlp.neg_log_likelihood(x_, y)

一些额外的东西:

>在第215行,当您打印成本时,将其格式化为整数值,但它是浮点值;这将失去监控的精确度.

>通常不建议像在LogisticRegression类中那样将所有权重初始化为0.重量应在原始值上有所不同,以帮助打破对称性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值