2015-11-15 7 views
4

Я смотрел раздел механики для Tensorflow, в частности на shared variables. В разделе «Проблема», они имеют дело с сверточной нейронной сетью, а также обеспечить следующий код (который запускает изображение через модель):Понимание примера области переменной в Tensorflow

# First call creates one set of variables. 
result1 = my_image_filter(image1) 
# Another set is created in the second call. 
result2 = my_image_filter(image2) 

Если модель была реализована таким образом, что тогда невозможно узнать/обновить параметры, потому что в моем наборе обучения есть новый набор параметров для каждого изображения?

Редактировать: Я также пробовал подход «проблемы» в простой линейной регрессии example, и, похоже, никаких проблем с этим методом реализации не возникает. Тренировка, похоже, работает, а также может быть показана последней строкой кода. Поэтому мне интересно, есть ли тонкое несоответствие в документации по тензону и что я делаю. :

import tensorflow as tf 
import numpy as np 

trX = np.linspace(-1, 1, 101) 
trY = 2 * trX + np.random.randn(*trX.shape) * 0.33 # create a y value which is   approximately linear but with some random noise 

X = tf.placeholder("float") # create symbolic variables 
Y = tf.placeholder("float") 


def model(X): 
    with tf.variable_scope("param"): 
     w = tf.Variable(0.0, name="weights") # create a shared variable (like theano.shared) for the weight matrix 

    return tf.mul(X, w) # lr is just X*w so this model line is pretty simple 


y_model = model(X) 

cost = (tf.pow(Y-y_model, 2)) # use sqr error for cost function 

train_op = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # construct an optimizer to minimize cost and fit line to my data 

sess = tf.Session() 
init = tf.initialize_all_variables() # you need to initialize variables (in this case just variable W) 
sess.run(init) 

with tf.variable_scope("train"): 
    for i in range(100): 
     for (x, y) in zip(trX, trY): 
     sess.run(train_op, feed_dict={X: x, Y: y}) 

print sess.run(y_model, feed_dict={X: np.array([1,2,3])}) 
+0

СМОТРИТЕ ЭТО ---> Вы получаете четкое представление о видимости переменных [ Нажмите [https://stackoverflow.com/a/43581502/6712021) – Stephen

ответ

9

Необходимо создать переменную, установленную только один раз за весь набор (и тестирование). Целью переменными областями является возможность модуляции подмножеств параметров, таких как принадлежащие слоям (например, когда архитектура слоя повторяется, в пределах каждого слоя могут использоваться одни и те же имена).

В вашем примере вы создаете параметры только в функции model. Вы можете распечатать ваши имена переменных, чтобы увидеть, что он назначен на указанной области:

from __future__ import print_function 

X = tf.placeholder("float") # create symbolic variables 
Y = tf.placeholder("float") 
print("X:", X.name) 
print("Y:", Y.name) 

def model(X): 
    with tf.variable_scope("param"): 
     w = tf.Variable(0.0, name="weights") # create a shared variable (like theano.shared) for the weight matrix 
    print("w:", w.name) 
    return tf.mul(X, w) 

Вызов sess.run(train_op, feed_dict={X: x, Y: y}) только оценивает значение train_op учитывая предоставленные значения X и Y. Здесь нет новых переменных (включая параметры); поэтому он не имеет никакого эффекта. Вы можете убедиться, что имена переменных остаются тем же, снова их печати:

with tf.variable_scope("train"): 
    print("X:", X.name) 
    print("Y:", Y.name) 
    for i in range(100): 
     for (x, y) in zip(trX, trY): 
      sess.run(train_op, feed_dict={X: x, Y: y}) 

Вы увидите, что имена переменных остаются такими же, как они уже инициализированы.

Если вы хотите получить переменную используя его объем, вы должны использовать get_variable в tf.variable_scope корпусе:

with tf.variable_scope("param"): 
    w = tf.get_variable("weights", [1]) 
print("w:", w.name) 
+0

, так что tf.get_variable работает, чтобы фактически «создать» переменную, а не просто «восстановить» ее, да? – Martian2049

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

  • Нет связанных вопросов^_^