我的培训功能:
然后来自其他地方:
我希望你们能够帮我实现这样的效果:
更新2:
每次运行它时,即使在每次运行时X和y都被初始化为随机值,我仍然得到相同的输出。
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都被初始化为随机值,我仍然得到相同的输出。