Я новичок в theano и пытаюсь настроить здесь скрипт автоэнкодера для работы по текстовым данным. Этот код использует набор данных MNIST в качестве обучающих данных. Эти данные представлены в виде двухмерного массива numpy.
Мои данные представляют собой разреженную матрицу csr из примерно 100 000 экземпляров с примерно 50 000 функций. Матрица является результатом использования tfidfvectorizer 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 млн. Для одной обучающей эпохи с размером пакета из 20 обучающих экземпляров.
Любая помощь или советы, которые вы могли бы дать, были бы очень признательны!