2014-11-03 5 views
1

Вот очень простой вопрос начинающего Теана.Theano logistic SGD с уровнями обучения по размеру

Я пытаюсь изменить логический SGD-код, поставляемый с Deep Learning Tutorials, для перехода от одной скорости обучения к скорости обучения, которая будет специфичной для измерения. Например, если у меня есть 3 входных измерения, я бы хотел использовать 3 разных скорости обучения, по одному на измерение.

Оригинальные соответствующий код является:

learning_rate = 0.1 
x = T.matrix('x') 
y = T.ivector('y') 
classifier = LogisticRegression(input=x, n_in=3, n_out=2) 
cost = classifier.negative_log_likelihood(y) 

g_W = T.grad(cost=cost, wrt=classifier.W) 
g_b = T.grad(cost=cost, wrt=classifier.b) 

updates = [(classifier.W, classifier.W - learning_rate * g_W), 
      (classifier.b, classifier.b - learning_rate * g_b)] 

train_model = theano.function(inputs=[], 
     outputs=cost, 
     updates=updates, 
     givens={ 
      x: minibatch_x, 
      y: minibatch_y}) 

В NumPy, было бы просто вопрос о замене скорости обучения скалярного с массивом скоростей обучения и выполнить поэлементное умножение с градиентами g_W и G_B , В Theano это приводит к ошибке:

'Expected an array-like object, but found a Variable: maybe you are trying to call a function on a (possibly shared) variable instead of a numeric array?' 

Ясно, что есть что-то о Теано, которого я пропускаю. Может ли кто-нибудь просветить меня?

ответ

1

Действительно, вам нужно заменить скаляр скорости обучения на массив. Вы можете попробовать, например. следующее:

learning_rate = theano.shared(np.array([0.1, 0.2, 0.05])) 

Это может потребоваться транспонировать в зависимости от формы градиента, но по существу вы заявили правильный путь, и он должен работать, используя общую переменную.

Смежные вопросы