【问题标题】:Grouping placeholders with common input in tensorflow在张量流中对具有共同输入的占位符进行分组
【发布时间】:2018-03-26 13:44:44
【问题描述】:

我有 n 个网络,其中所有输入都带有占位符,我想将所有这些网络链接到另一个占位符(之后创建)作为公共输入。

class GroupOfNetworks(object):
    def __init__(self,subtask_nets,ob_space):
        self.x_inputs = [st_net.x for st_net in subtask_nets]    #list of network inputs

其中st_net.x 是一个占位符,声明如下。

class Network(object):
     def __init__(self, ob_space):
          self.x = tf.placeholder(tf.float32, [None] + list(ob_space)) `#single network input

我希望对所有这些网络都有一个共同的输入,因此我只需要在我的feed_dict 中有一个键值对。我尝试对占位符进行分配操作(下面的代码 sn-p),但这会引发错误,因为它们是张量而不是变量。

#in class GroupOfNetworks...
common_x = tf.placeholder(tf.float32, [None] + list(ob_space),"common_input")
set_input = tf.assign(self.x_inputs[0].x,common_x,"link_subtask_input") # DOES NOT WORK

到目前为止,我一直使用以编程方式生成的 feed_dict(如下所示),但这不在图表上,并且在从 .meta 文件加载图表时无法导入。

def make_common_feed_dict(self,x):
    return {placeholder:x for placeholder in self.x_inputs}

有人知道更好的解决方案吗?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    由于您的网络中的每个网络都需要一个占位符(因此需要相同的输入),因此只需在任何地方使用相同的占位符即可。

    不要在对象__init__ 方法中创建占位符,而是在外部创建它并将其传递给您创建的每个对象。 做这样的事情:

    # Define your network in this way
    class Network(object):
         def __init__(self, placeholder):
              self.x = placeholder
    

    然后,在初始化 Network 对象之前定义占位符,然后使用它

    input_placeholder = tf.placeholder(tf.float32, [None] + list(ob_space))
    
    network_a = Network(input_placeholder)
    network_b = Network(input_placeholder)
    

    它们,假设Network 对象有一个get 方法来获取输出张量,你可以执行network_anetwork_b 给它们提供相同的值:

    sess.run([network_a.get(), network_b.get()], feed_dict={input_placeholder: value})
    

    【讨论】:

    • 是的,如果我根本不需要独立运行 Network 对象并且可以修改它们,这将起作用。您是否知道是否有任何方法可以处理我无法修改 Network 对象而只能使用对占位符的引用的情况?
    猜你喜欢
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 2018-02-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多