我目前需要做一些与https://github.com/tensorflow/tensorflow/issues/6776类似的事情
例如,我有一批图像A、B、C……,我将为它们生成一批增强的图像a、b、c……
然后,我将A(或B或C)发送到一个Inception网络中,得到一个输出张量”output_1″,我需要将a(或b或c)发送到同一个Inception网络中,得到一个输出张量”output_2″,然后我将使用||”output1- output2″||作为对比损失。
目前,我不确定人们通常是如何在Tensorflow中处理这种操作的。我在网上搜索了,没有找到答案(虽然我猜这可能与网络的“重用”有关)。
以下是我的源代码的简化版本(我很抱歉只能在这里粘贴一个简化版本):
class MyModel: ...... def define_my_net(self): self.inputs_from_bloader = tf.placeholder(...) self.input = self.inputs_from_bloader self.output = slim.conv2d(self.input,...) ...... def update(sess, inputs): feed_dict = utility.build_feed_dict(self.inputs_from_bloader, inputs) sess.run([my_op_list], feed_dict = feed_dict) ......def train(): data = importlib.import_module('some.datasets.reader') data = data.DataReader() model = importlib.import_module('MyModel') model.MyModel() model.define_my_net() ### 这是定义网络的地方 batch = data.get_batch() ### 这是生成A、B、C和a、b、c的地方 model.update(sess, batch) ### 这是进行训练的地方
我想我可以从”batch=data.get_batch”输出一个像AaBbCc这样的批次,或者将其更改为”batch1, batch2 = data.get_batch”,但我不知道如何将batch1和batch2传递到已定义的网络中,因为这可能涉及到框架的一些架构修改。
如果你觉得上面的源代码太混乱,任何更简单的例子也将受到欢迎。
回答:
你可以实例化你的网络两次。这些实例通常被称为“塔”。两个塔将使用相同的变量,但有不同的输入和操作。
根据你使用的高等级API,你应该寻找一些控制变量reuse
的标志,以便在构建你的第二个塔时,不会创建新的变量。例如,在这里搜索reuse
https://www.tensorflow.org/guide/variables。