python – theano定义了重复调用另一个函数的函数?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – theano定义了重复调用另一个函数的函数?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3634字,纯文字阅读大概需要6分钟。
内容图文
我的训练功能:
def fit(self, X, y):
batch_size = 20
index = T.lscalar() # index to a [mini]batch
updates = {}
return theano.function(
inputs=[index], outputs=self.cost, updates=updates,
givens={
self.sym_X: X[index * batch_size:(index + 1) * batch_size],
self.sym_y: y[index * batch_size:(index + 1) * batch_size]})
然后从其他地方:
fn = obj.fit(X, y)
for i in range(10):
fn(i)
所以我想要的是这样的
fn = obj.fit(X, y)
fn()
我真的不确定如何开始这个,因为theano对我来说仍然非常令人折服.我能够做到这一点,但循环是非常具有挑战性的.
我有一个模糊的概念,如果我可以将theano.function转换为theano.scan,然后在它周围放置一个外部theano.function – 这可能会起作用.然而,theano.scan对我来说仍然是神奇的(尽管我付出了最大的努力).
我怎样才能将循环的小型数据集合并到单个函数调用中?
更新:
我以为我拥有它!我懂了:
def fit(self, X, y):
batch_size = 20
n_batches = 5
index = theano.shared(0)
## index to a [mini]batch
updates = {
index: index + batch_size
}
return theano.function(
inputs=[], outputs=[self.cost] * n_batches, updates=updates,
givens={
index: 0,
self.sym_X: X[index * batch_size:(index + 1) * batch_size],
self.sym_y: y[index * batch_size:(index + 1) * batch_size]})
但不幸的是,似乎因为我使用索引来计算批次中的批次,我也无法更新它:
Traceback (most recent call last):
File "skdeeplearn/classifiers/test/test_classifiers.py", line 79, in test_logistic_sgd
fn = clf.fit(self.shared_X, self.shared_y)
File "skdeeplearn/classifiers/logistic_sgd.py", line 139, in fit
self.sym_y: y[index * batch_size:(index + 1) * batch_size]})
File "/Users/aelaguiz/workspace/pyvotune/venv/lib/python2.7/site- packages/theano/compile/function.py", line 206, in function
profile=profile)
File "/Users/aelaguiz/workspace/pyvotune/venv/lib/python2.7/site-packages/theano/compile/pfunc.py", line 461, in pfunc
no_default_updates=no_default_updates)
File "/Users/aelaguiz/workspace/pyvotune/venv/lib/python2.7/site-packages/theano/compile/pfunc.py", line 162, in rebuild_collect_shared
"to be replaced by %s." % (v_orig, v_repl))
AssertionError: When using 'givens' or 'replace' with several (old_v, new_v) replacement pairs, you can not have a new_v variable depend on an old_v one. For instance, givens = {a:b, b:(a+1)} is not allowed. Here, the old_v <TensorType(int64, scalar)> is used to compute other new_v's, but it is scheduled to be replaced by <TensorType(int64, scalar)>.
更新2:
def fit(self, X, y):
batch_size = 20
n_batches = 5
index = theano.shared(0)
## index to a [mini]batch
updates = {
index: index + batch_size
}
return theano.function(
inputs=[], outputs=[self.cost] * n_batches, updates=updates,
givens={
self.sym_X: X[index * batch_size:(index + 1) * batch_size],
self.sym_y: y[index * batch_size:(index + 1) * batch_size]})
这实际上运行,但它的输出很奇怪:
[array(0.6931471824645996, dtype=float32), array(0.6931471824645996, dtype=float32), array(0.6931471824645996, dtype=float32), array(0.6931471824645996, dtype=float32), array(0.6931471824645996, dtype=float32)]
我每次运行它都得到相同的输出,即使X& y被初始化为每次运行的随机值.
解决方法:
我认识的每个人都在python中循环使用minibatch.这可以通过扫描完成,但您在此处的所有尝试都没有使用扫描.所以他们没有工作是正常的.您需要在某处调用扫描功能才能使用它(或者更高级别的界面,如地图).事实上,在你的情况下,我认为你可以使用theano.scan(fn,theano.tensor.arange(N)).
我不能在这篇文章中回答你的所有问题,因为代码片段不完整,但这里有一些信息:
return theano.function(
inputs=[], outputs=[self.cost] * n_batches,
这里:[self.cost] * n_batches是纯Python代码.这将创建一个n_batches元素列表,其中每个元素都是self.cost.因此,如果n_batches为3,则输出= [self.cost,self.cost,self.cost].这就是为什么你多次输出相同的值.
我不能告诉你为什么你总是添加相同的答案,因为我需要未提供的信息.
内容总结
以上是互联网集市为您收集整理的python – theano定义了重复调用另一个函数的函数?全部内容,希望文章能够帮你解决python – theano定义了重复调用另一个函数的函数?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。