Получение выходной классификации с лазаньей

Получение выходной классификации с помощью Lasagne/Theano

Я переношу свой код с чистого Theano на Lasagne. У меня был этот определенный код из учебника, чтобы получить результат прогноза с определенными данными, и я сгенерировал файл csv для отправки в kaggle. Но с лазаньей это не работает. Я пробовал несколько вещей, но все они дают ошибки.

Я был бы рад, если бы кто-нибудь помог мне понять, что не так!

Я вставил весь код сюда: http://pastebin.com/e7ry3280

test_data  = np.loadtxt("../inputData/test.csv", dtype=np.uint8, delimiter=',', skiprows=1)

# The inputs are vectors now, we reshape them to monochrome 2D images,
# following the shape convention: (examples, channels, rows, columns)
data = data.reshape(-1, 1, 28, 28)
test_data = test_data.reshape(-1, 1, 28, 28)

index = T.lscalar()  # index to a [mini]batch
preds = []
for it in range(len(test_data)):
        test_data = test_data[it]
        N = len(test_data)
        # print "N : ", N
        test_data = theano.shared(np.asarray(test_data, dtype=theano.config.floatX))

        test_labels = T.cast(theano.shared(np.asarray(np.zeros(batch_size), dtype=theano.config.floatX)),'uint8')

        ###target_var
        #y = T.ivector('y')  # the labels are presented as 1D vector of [int] labels
        #index = T.lscalar()  # index to a [mini]batch

        ppm = theano.function([index],lasagne.layers.get_output(network, deterministic=True),
                              givens={
                                  input_var: test_data[index * batch_size: (index + 1) * batch_size],
                                  target_var: test_labels
                              }, on_unused_input='warn')

        p = [ppm(ii) for ii in range(N // batch_size)]

        p = np.array(p).reshape((N, 10))
        print (p)
        p = np.argmax(p, axis=1)
        p = p.astype(int)
        preds.append(p)

subm = np.empty((len(preds), 2))
subm[:, 0] = np.arange(1, len(preds) + 1)
subm[:, 1] = preds

np.savetxt('submission.csv', subm, fmt='%d', delimiter=',',header='ImageId,Label', comments='')

return preds

Код не работает в строке, которая начинается с ppm = theano.function...:

TypeError: невозможно преобразовать тип TensorType (float32, 3D) (переменного субтензора {int64: int64:}.0) в тип TensorType (float32, 4D). Вы можете попробовать вручную преобразовать Subtensor{int64:int64:}.0 в TensorType(float32, 4D).

Я просто пытаюсь ввести тестовые данные в CNN и получить результаты в файл CSV. Как мне это сделать? Я знаю, что должен использовать мини-пакеты, потому что все тестовые данные не помещаются на GPU.


person SHASHA    schedule 24.09.2015    source источник
comment
Код дает сбой именно в строке ppm.   -  person SHASHA    schedule 25.09.2015
comment
Какова размерность test_data? input_var — это четырехмерный тензор, поэтому test_data также должен быть четырехмерным тензором. Это сообщение об ошибке предполагает, что test_data является трехмерным тензором.   -  person Daniel Renshaw    schedule 25.09.2015
comment
Обновленный пост. Объясняя больше.   -  person SHASHA    schedule 25.09.2015


Ответы (1)


Как указано в сообщении об ошибке и в комментариях Даниэля Реншоу, проблема заключается в несоответствии размеров между test_data и input_var. В первой строке цикла вы пишете:

test_data = test_data[it]

Что превращает 4D-массив test_data в 3D-массив с тем же именем (поэтому никогда не рекомендуется использовать одно и то же имя переменной для разных типов :)). После этого вы инкапсулируете его в общую переменную, которая не меняет размерность, а затем нарезаете ее, чтобы присвоить input_var, что опять же не меняет размерность.

Если я понимаю ваш код, я думаю, вам следует просто удалить эту первую строку. Таким образом, test_data остается списком примеров, и вы можете нарезать его, чтобы создать партию.

person Djizeus    schedule 27.09.2015