theano中符号变量自动更新
Symbolic variables automatically update in theano
我正在按照给定 here 的 theano 教程进行简单的随机梯度下降。然而,在这里我无法理解在这个块中 p_y_given_x
和 y_pred
的值是如何根据 W
和 b
的值自动更新的,因为后来当我们运行 test_logistic() 我们只更新 W
和 b
的值?
谢谢
class LogisticRegression(object):
def __init__(self, input, n_in, n_out):
self.W = theano.shared(
value=numpy.zeros(
(n_in, n_out),
dtype=theano.config.floatX
),
name='W',
borrow=True
)
# initialize the baises b as a vector of n_out 0s
self.b = theano.shared(
value=numpy.zeros(
(n_out,),
dtype=theano.config.floatX
),
name='b',
borrow=True
)
self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b)
self.y_pred = T.argmax(self.p_y_given_x, axis=1)
self.params = [self.W, self.b]
def negative_log_likelihood(self, y):
return -T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]), y])
# end-snippet-2
def errors(self, y):
if y.ndim != self.y_pred.ndim:
raise TypeError(
'y should have the same shape as self.y_pred',
('y', y.type, 'y_pred', self.y_pred.type)
)
# check if y is of the correct datatype
if y.dtype.startswith('int'):
# the T.neq operator returns a vector of 0s and 1s, where 1
# represents a mistake in prediction
return T.mean(T.neq(self.y_pred, y))
else:
raise NotImplementedError()
p_y_given_x
和 y_pred
是符号变量(只是来自 Theano 的 python 对象)。那些指向 Theano 对象的 python 变量不会得到更新。它们只是代表我们想要做的计算。像伪代码一样思考。
编译Theano函数时会用到。只有到那时才会计算该值。但这不会导致指向对象 p_y_given_x
和 y_pred
的 python 变量发生任何变化。对象未更改。
了解这种区别对某些人来说需要时间。这是一种新的思维方式。所以不要犹豫,问问题。有帮助的一件事是始终问自己是在符号世界还是数字世界。数字世界只发生在编译的 Theano 函数上。
我正在按照给定 here 的 theano 教程进行简单的随机梯度下降。然而,在这里我无法理解在这个块中 p_y_given_x
和 y_pred
的值是如何根据 W
和 b
的值自动更新的,因为后来当我们运行 test_logistic() 我们只更新 W
和 b
的值?
谢谢
class LogisticRegression(object):
def __init__(self, input, n_in, n_out):
self.W = theano.shared(
value=numpy.zeros(
(n_in, n_out),
dtype=theano.config.floatX
),
name='W',
borrow=True
)
# initialize the baises b as a vector of n_out 0s
self.b = theano.shared(
value=numpy.zeros(
(n_out,),
dtype=theano.config.floatX
),
name='b',
borrow=True
)
self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b)
self.y_pred = T.argmax(self.p_y_given_x, axis=1)
self.params = [self.W, self.b]
def negative_log_likelihood(self, y):
return -T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]), y])
# end-snippet-2
def errors(self, y):
if y.ndim != self.y_pred.ndim:
raise TypeError(
'y should have the same shape as self.y_pred',
('y', y.type, 'y_pred', self.y_pred.type)
)
# check if y is of the correct datatype
if y.dtype.startswith('int'):
# the T.neq operator returns a vector of 0s and 1s, where 1
# represents a mistake in prediction
return T.mean(T.neq(self.y_pred, y))
else:
raise NotImplementedError()
p_y_given_x
和 y_pred
是符号变量(只是来自 Theano 的 python 对象)。那些指向 Theano 对象的 python 变量不会得到更新。它们只是代表我们想要做的计算。像伪代码一样思考。
编译Theano函数时会用到。只有到那时才会计算该值。但这不会导致指向对象 p_y_given_x
和 y_pred
的 python 变量发生任何变化。对象未更改。
了解这种区别对某些人来说需要时间。这是一种新的思维方式。所以不要犹豫,问问题。有帮助的一件事是始终问自己是在符号世界还是数字世界。数字世界只发生在编译的 Theano 函数上。