Вопрос

Я использую 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)]

Представляют ли входные фигуры формы x, y и f, соответственно?

Если это так, то третье кажется правильным (размер пакета =5, 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

Есть ли у меня правильная идея или есть лучший способ добиться этого?Есть какие-нибудь соображения о том, почему я получаю сообщение об ошибке?

Это было полезно?

Решение

Проблема заключалась в том, что я объединял данные не по той оси.

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

должно было быть

layer2_input = T.concatenate([layer2_input, self.f.flatten(2)], axis=1)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top