0

分類に Theano を使用しています (畳み込みニューラル ネットワーク)

以前は、(平坦化された) 画像のピクセル値を NN の特徴として使用していました。ここで、追加機能を追加したいと思います。
追加機能のベクトルを平坦化された画像機能に連結し、それを完全に接続されたレイヤーへの入力として使用できると言われましたが、それには問題があります。

まず、それは正しいアプローチですか?

ここにいくつかのコードスニペットと私のエラーがあります:
いくつかの変更を加えたサイトから提供された例に似ています

(モデルを構築するクラスから)

 # allocate symbolic variables for the data
 self.x = T.matrix('x')   # the data is presented as rasterized images
 self.y = T.ivector('y')  # the labels are presented as 1D vector of [int] labels
 self.f = T.matrix('f') # additional features

以下、変数vおよびrngは以前に定義されています。重要なことは次のlayer2_inputとおりです。

layer2_input = self.layer1.output.flatten(2)
layer2_input = T.concatenate([layer2_input, self.f.flatten(2)])
self.layer2 = HiddenLayer(rng, input=layer2_input, n_in=v, n_out=200, activation=T.tanh)

(訓練するクラスから)

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

ただし、train_model が呼び出されるとエラーが発生します。

ValueError: GpuJoin: Wrong inputs for input 1 related to inputs 0.!
Apply node that caused the error: GpuJoin(TensorConstant{0}, GpuElemwise{tanh,no_inplace}.0, GpuFlatten{2}.0)
Inputs shapes: [(), (5, 11776), (5, 2)]
Inputs strides: [(), (11776, 1), (2, 1)]
Inputs types: [TensorType(int8, scalar), CudaNdarrayType(float32, matrix), CudaNdarrayType(float32, matrix)]

入力形状は、それぞれxyおよびの形状を表していfますか?

もしそうなら、3 番目は正しいように見えます (batchsize=5、2 つの余分な機能) が、最初がスカラーで 2 番目が行列である理由は何ですか?

詳細:

train_set_x.shape = (61, 19200) [61 flattened images (160x120), 19200 pixels]
train_set_y.shape = (61,) [61 integer labels]
train_set_f.shape = (61,2) [2 additional features per image]
batch_size = 5

私は正しい考えを持っていますか、それともこれを達成するためのより良い方法はありますか? エラーが発生する理由についての洞察はありますか?

4

1 に答える 1

1

問題は、間違った軸で連結していたことです。

layer2_input = T.concatenate([layer2_input, self.f.flatten(2)])

になるはずだった

layer2_input = T.concatenate([layer2_input, self.f.flatten(2)], axis=1)
于 2014-07-31T15:28:02.613 に答える