Назначение переменных "givens" в Theano.function
Я читал код для логистической функции, указанный в http://deeplearning.net/tutorial/logreg.html. Я смущен различием между переменными inputs
и givens
для функции. Функции, которые вычисляют ошибки, сделанные моделью на мини-баре, заключаются в следующем:
test_model = theano.function(inputs=[index],
outputs=classifier.errors(y),
givens={
x: test_set_x[index * batch_size: (index + 1) * batch_size],
y: test_set_y[index * batch_size: (index + 1) * batch_size]})
validate_model = theano.function(inputs=[index],
outputs=classifier.errors(y),
givens={
x: valid_set_x[index * batch_size:(index + 1) * batch_size],
y: valid_set_y[index * batch_size:(index + 1) * batch_size]})
Почему бы не сделать/не просто сделать x & y общих входных переменных и определить их при создании фактического экземпляра модели?
Ответы
Ответ 1
Параметр givens
позволяет отделить описание модели и точное определение переменной ввода. Это является следствием того, что делает данный параметр: измените граф для компиляции перед его компиляцией. Другими словами, мы заменяем на графике ключ в givens со связанным значением.
В учебнике глубокого обучения мы используем обычную переменную Theano для построения модели. Мы используем givens
для ускорения работы графического процессора. Здесь, если мы сохраним набор данных на процессоре, мы передадим мини-пакет на GPU при каждом вызове функции. Поскольку мы выполняем много итераций в наборе данных, мы в конечном итоге переносим множество данных на GPU. Поскольку набор данных достаточно мал, чтобы соответствовать графическому процессору, мы помещаем его в общую переменную, чтобы передать его на GPU, если он доступен (или оставаться на центральном процессоре, если модуль обработки графики отключен). Затем при компиляции функции мы меняем ввод с помощью среза, соответствующего мини-пакетному набору данных для использования. Тогда вход функции Anano является только индексом той мини-партии, которую мы хотим использовать.
Ответ 2
Я не думаю, что что-то не мешает вам делать это таким образом (я не пробовал словарь updates=
, используя входную переменную напрямую, но почему бы и нет). Однако обратите внимание, что для точного ввода данных в графический процессор вам понадобится быть в общей переменной (из которой в этом примере берутся x
и y
).