我正在阅读http://deeplearning.net/tutorial/logreg.html给出的后勤功能代码。我对inputs
&之间的区别感到困惑。函数的givens
个变量。计算模型在小批量上所犯错误的函数是:
test_model = theano.function(inputs=[index],
outputs=classifier.errors(y),
givens={
x: test_set_x[index * batch_size: (index + 1) * batch_size],
y: test_set_y[index * batch_size: (index + 1) * batch_size]})
validate_model = theano.function(inputs=[index],
outputs=classifier.errors(y),
givens={
x: valid_set_x[index * batch_size:(index + 1) * batch_size],
y: valid_set_y[index * batch_size:(index + 1) * batch_size]})
为什么不能/不会只是制造x& y共享输入变量并在创建实际模型实例时定义它们吗?
答案 0 :(得分:23)
givens
参数允许您分离模型的描述和输入变量的确切定义。这是给定参数的作用的结果:在编译之前修改图形以进行编译。换句话说,我们用图表替换带有关联值的给定键。
在深度学习教程中,我们使用普通的Theano变量来构建模型。我们使用givens
来加速GPU。在这里,如果我们将数据集保存在CPU上,我们将在每个函数调用时将一个小批量传输到GPU。当我们对数据集进行多次迭代时,我们最终会将数据集多次传输到GPU。由于数据集足够小以适应GPU,我们将其放入共享变量中,以便将其传输到GPU(如果有的话)(如果图形处理单元被禁用,则保留在中央处理单元上)。然后在编译函数时,我们将输入与对应于要使用的小批量数据集的切片交换。然后,Theano函数的输入就是我们想要使用的小批量的索引。
答案 1 :(得分:1)
我认为没有什么能阻止你这样做(我没有直接使用输入变量尝试updates=
字典,但为什么不这样做)。但请注意,为了以有用的方式将数据推送到GPU,您需要将其放在共享变量中(在此示例中从x
和y
获取)。