4

私はTheanoを初めて使用しています...これが明らかな場合は申し訳ありません。

LeNet チュートリアルに基づいて、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: ('名前 ":103" のインデックス 0 (0 ベース) の theano 関数への入力引数が正しくありません', '配列のようなオブジェクトが必要でしたが、変数が見つかりました: おそらく、(おそらく共有)数値配列の代わりに変数?')

したがって、共有変数を Theano 関数への入力として使用することはできないと思います。では、どうすればいいのでしょうか…?

4

1 に答える 1

5

コンパイルされた Theano 関数へのすべての入力 (つまり、 への呼び出しの出力theano.function(...)) は常に具体的な値である必要があり、通常はスカラーまたは numpy 配列です。共有変数は、numpy 配列をラップしてシンボリック変数のように扱う方法ですが、データが入力として渡される場合、これは必要ありません。

したがって、データとターゲット値を共有変数としてラップすることを省略し、代わりに次のことを実行できるはずです。

cost_ij = train_model(data, target)

GPU を使用している場合、これはデータがコンピューターのメイン メモリに存在することを意味し、入力として渡す各部分を個別に GPU メモリにコピーする必要があるため、オーバーヘッドが増加し、速度が低下することに注意してください。また、データを分割し、その一部のみを渡す必要があることに注意してください。このアプローチの変更では、データセット全体が GPU メモリに収まらない場合、データセット全体に対して一度に GPU 計算を行うことはできません。

于 2015-08-13T13:03:36.290 に答える