2015-08-02 2 views
3

Привет Я следую учебнику по нейронной сети, где автор, кажется, использует общие переменные везде. По моему мнению, общая переменная в theanos просто является пространством в памяти, которое может использоваться кучей gpu и cpu. Во всяком случае, у меня есть две матрицы, которые я объявляю как общие переменные, и я хочу выполнить некоторую операцию над ними с помощью функции. (Вопрос 1) Мне бы это понравилось, если бы кто-нибудь мог объяснить, почему функция полезна против регулярной функции def. Во всяком случае, я устанавливаю мое определение, как например:Использование общей переменной в функции

import theano 
import theano.tensor as T 
from theano import function 
import numpy as np 

class Transform: 
    def __init__(self, dimg): 
     dimg = dimg.astype(theano.config.floatX) 
     self.in_t = theano.shared(dimg, name='dimg', borrow=True) 

    def rotate(self, ox, oy, radians): 
     value = np.zeros((2 * self.in_t.get_value().shape[0], 
          2 * self.in_t.get_value().shape[1])) 
     out_t = theano.shared(value, 
           name='b', 
           dtype=theano.config.floatX), 
           borrow=True)  
     din = theano.tensor.dmatrix('a') 
     dout = theano.tensor.dmatrix('b') 

     def atest(): 
      y = x + y 
      return y 

     f = function(inputs=[], 
        givens={x: self.in_t, 
          y: self.out_t}, 
        outputs=atest)  
     return f() 

Проблема заключается в том, что я понятия не имею, как использовать общие переменные в обычной функции-вывода вызова. Я понимаю, что я могу делать обновления через функцию ([], .. update = (shared_var_1, upate_function)). Но как мне получить доступ к ним в моей обычной функции?

ответ

4

Theano начинающий здесь, поэтому я не уверен, что мой ответ будет охватывать все технические аспекты.

Отвечая на ваш первый вопрос : вам нужно объявить Theano функцию вместо функции DEF, потому что Theano похож на «язык» в питоне и вызов theano.function вы собираете некоторые одноранговые C код выполнения вашей задачи под капот. Это то, что заставляет Theano быстро. Из documentation:

Это хорошо думать о theano.function как интерфейс для компилятора, который строит вызываемый объект с чисто символическим графиком. Одной из самых важных особенностей Theano является то, что theano.function может оптимизировать график и даже скомпилировать некоторые или все из них в нативные машинные инструкции.

О вашей второй quetion, чтобы получить доступ, что хранится в вашей общей переменной вы должны использовать

shared_var.get_value() 

Проверить these примеры:

Значение может быть и изменяемые по методам .get_value() и .set_value().

Этот код:

a = np.array([[1,2],[3,4]], dtype=theano.config.floatX) 
x = theano.shared(a) 
print(x) 

Выведет

<CudaNdarrayType(float32, matrix)> 

Но использование get_value():

print(x.get_value()) 

Он выводит

[[ 1. 2.] 
[ 3. 4.]] 

Edit: использовать общие переменные в функциях

import theano 
import numpy 
a = numpy.int64(2) 
y = theano.tensor.scalar('y',dtype='int64') 
z = theano.tensor.scalar('z',dtype='int64') 
x = theano.shared(a) 
plus = y + z 
theano_sum = theano.function([y,z],plus) 
# Using shared variable in a function 
print(theano_sum(x.get_value(),3)) 
# Changing shared variable value using a function 
x.set_value(theano_sum(2,2)) 
print(x.get_value()) 
# Update shared variable value 
x.set_value(x.get_value(borrow=True)+1) 
print(x.get_value()) 

Выведет:

5 
4 
5 
+0

Я понимаю, как получить доступ к общим переменным значения. Мне интересно, как вы относитесь к нему в своей anano.функции (выходы = some_function). –

+0

@ Dr.Knowitall Я отредактировал свой ответ, проверьте, помогает ли это – Vektor88

+0

Разве это не приведет к возврату х обратно к процессору и не вернет его обратно в gpu? –

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