【问题标题】:Theano - Shared variable as input of function for large datasetTheano - 共享变量作为大型数据集的函数输入
【发布时间】:2015-11-06 10:40:16
【问题描述】:

我是 Theano 的新手...如果这很明显,我深表歉意。

我正在尝试基于LeNet tutorial 训练一个 CNN。与本教程的一个主要区别是我的数据集太大而无法放入内存,因此我必须在训练期间加载每个批次。

原来的模型是这样的:

train_model = theano.function(
    [index],
    cost,
    updates=updates,
    givens={
        x: train_set_x[index * batch_size: (index + 1) * batch_size],
        y: train_set_y[index * batch_size: (index + 1) * batch_size]
    }
)

...这对我不起作用,因为它假定 train_set_x 完全加载到内存中。

所以我切换到这个:

train_model = theano.function([x,y], cost, updates=updates)

并尝试用以下方式调用它:

data, target = load_data(minibatch_index)  # load_data returns typical numpy.ndarrays for a given minibatch

data_shared = theano.shared(np.asarray(data, dtype=theano.config.floatX), borrow=True)
target_shared = T.cast(theano.shared(np.asarray(target, dtype=theano.config.floatX), borrow=True), 'int32')

cost_ij = train_model(data_shared ,target_shared )

但是得到了:

TypeError: ('Bad input argument to theano function with name ":103" at index 0(0-based)', '期望一个类似数组的对象,但找到了一个变量:也许你正在尝试调用一个函数在(可能是共享的)变量而不是数字数组上?')

所以我想我不能使用共享变量作为 Theano 函数的输入。但是,我应该如何继续......?

【问题讨论】:

    标签: python theano conv-neural-network


    【解决方案1】:

    编译后的 Theano 函数的所有输入(即调用 theano.function(...) 的输出)应该始终是具体值,通常是标量或 numpy 数组。共享变量是一种包装 numpy 数组并将其视为符号变量的方法,但当数据作为输入传递时,这不是必需的。

    因此,您应该能够省略将数据和目标值包装为共享变量,而是执行以下操作:

    cost_ij = train_model(data, target)
    

    请注意,如果您使用的是 GPU,这意味着您的数据将驻留在计算机的主内存中,并且您作为输入传递的每个部分都需要单独复制到 GPU 内存中,这会增加开销并减慢速度.另请注意,您必须将数据分开并仅传递其中的一部分;如果整个数据集不适合 GPU 内存,这种方法的改变将不允许您一次对整个数据集进行 GPU 计算。

    【讨论】:

    • 谢谢!只是为了确保我理解:我虽然该共享变量与 GPU 的内存“共享”。但实际上“共享”的意思是“变量的符号包装”。并且任何变量(共享与否)都可以传递给 GPU。那正确吗?然后为了尽量减少开销,我应该尽量让我的批次尽可能大,对吗?
    • 共享变量是一大块内存的包装器。如果您设置为device=gpu,它们会包装一些GPU 内存,如果device=cpu,它们会包装一些主内存。它们是“共享的”,因为许多 Theano 函数可以引用它们并共享(和更新)它们的内部状态。如果您使用的是 GPU,则必须将所有数据复制到 GPU 内存中,以便 GPU 操作对其进行处理。共享变量会提前进行复制,并根据需要将数据作为函数输入传递。而且,是的,使您的批次更大可以最大限度地减少开销,但可以改变模型训练行为。
    猜你喜欢
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    相关资源
    最近更新 更多