Нов съм в theano и се опитвам да адаптирам скрипта за автоматично кодиране тук, за да работи върху текстови данни. Този код използва набора от данни MNIST като данни за обучение. Тези данни са под формата на numpy 2d масив.
Моите данни са csr разредена матрица от около 100 000 екземпляра с около 50 000 функции. Матрицата е резултат от използването на tfidfvectorizator на sklearn за напасване и трансформиране на текстовите данни. Тъй като използвам разредени матрици, променям кода, за да използвам пакета theano.sparse, за да представя моя вход. Моят тренировъчен набор е символичната променлива:
train_set_x = theano.sparse.shared(train_set)
Матриците theano.sparse обаче не могат да изпълняват всички операции, използвани в оригиналния скрипт (има списък с редки операции тук). Кодът използва точка и сума от тензорните методи на входа. Промених точката на sparse.dot, но не мога да намеря с какво да заменя сумата, така че конвертирам тренировъчните партиди в плътни матрици и използвам оригиналните тензорни методи, както е показано в тази функция на разходите:
def get_cost(self):
tilde_x = self.get_corrupted_input(self.x, self.corruption)
y = self.get_hidden_values(tilde_x)
z = self.get_reconstructed_input(y)
#make dense, must be a better way to do this
L = - T.sum(SP.dense_from_sparse(self.x) * T.log(z) + (1 - SP.dense_from_sparse(self.x)) * T.log(1 - z), axis=1)
cost = T.mean(L)
return cost
def get_hidden_values(self, input):
# use theano.sparse.dot instead of T.dot
return T.nnet.sigmoid(theano.sparse.dot(input, self.W) + self.b)
Методите get_corrupted_input и get_reconstructed_input остават както са в връзката по-горе. Въпросът ми е има ли по-бърз начин да направя това?
Преобразуването на матриците в плътни прави обучението много бавно. Понастоящем са необходими 20,67 m, за да се направи една тренировъчна епоха с размер на партида от 20 тренировъчни инстанции.
Всяка помощ или съвети, които можете да дадете, ще бъдат много оценени!