【问题标题】:TensorFlow: get_variable() but for placeholders?TensorFlow:get_variable() 但对于占位符?
【发布时间】:2018-03-14 06:02:26
【问题描述】:

有一个函数tf.get_variable('name') 允许“隐式”将参数传递给函数,例如:

def function(sess, feed):
    with tf.variable_scope('training', reuse=True):
        cost = tf.get_variable('cost')
    value = sess.run(cost, feed_dict=feed) 
    # other statements

但是如果想将tf.placeholder 传递给函数怎么办?占位符是否有相同的机制,例如tf.get_placeholder():

def function(sess, cost, X_train, y_train):
    # Note this is NOT a valid TF code
    with tf.variable_scope('training', reuse=True):
        features = tf.get_placeholder('features')
        labels = tf.get_placeholder('labels')
    feed = {features: X_train, labels: y_train}
    value = sess.run(cost, feed_dict=feed)
    print('Cost: %s' % value)    

或者在函数内部构造占位符并没有太大意义?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    占位符只是...占位符。就好像它具有某种状态一样“获取”一个占位符是没有意义的(这就是 get 变量所做的,返回一个处于当前状态的变量)。

    在任何地方都使用相同的 python 变量。

    此外,如果您不想传递 python 变量,因为您的方法 signaturl 变得丑陋,您可以利用您正在构建一个图表并且图表本身包含有关已声明占位符的信息这一事实。

    你可以这样做:

    #define your placeholder
    a = tf.placeholder(tf.float32, name="asd")
    
    # then, when you need it, fetch if from the graph
    graph = tf.get_default_graph()
    placeholder = graph.get_tensor_by_name("asd:0")
    

    【讨论】:

    • 好的,知道了。所以基本上,占位符是一种“无状态”,创建新的不会引入任何开销,对吧?
    • 是的。只有在使用时才会引入开销,因为从 python 到 tensorflow 的数据传输
    【解决方案2】:

    除了如果你在同一个脚本中工作,你不应该需要这个,你可以通过按名称获取张量来做到这一点,如Tensorflow: How to get a tensor by name?

    例如

    p = tf.placeholder(tf.float32)
    p2 = tf.get_default_graph().get_tensor_by_name(p.name)
    
    assert p == p2
    

    【讨论】:

    • 我明白了,太好了,谢谢。顺便说一句,你知道为什么变量的名称像 loss/loss:0 安装的只是 loss 吗?
    • 这以某种方式解释了它:stackoverflow.com/questions/36150834/…
    猜你喜欢
    • 2020-04-09
    • 2017-10-12
    • 2011-10-07
    • 2011-06-18
    • 2019-07-25
    • 1970-01-01
    • 2016-07-15
    • 2015-03-28
    相关资源
    最近更新 更多