在tensorflow中使用自定义错误函数

时间:2018-02-28 10:35:32

标签: tensorflow

我有一个训练有素的卷积神经网络 A ,它输出给定图片包含正方形或圆形的可行性。

另一个网络 B 拍摄随机噪音图像。我的想法是拥有一堆卷积层,以便输出是一个新生成的方块。 作为错误函数,我想将生成的图像输入 A ,并从 A 的softmax张量中学习 B 的过滤器。根据我的理解,这是一种生成性的对抗性网络,除了 A 没有学习。在尝试实现这一点时,我遇到了两个问题。

  1. 我已经在 B 中导入了 A 的图层,如下所示:

    with gfile.FastGFile("shape-classifier.pb", 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        image_input_layer, extern_softmax_tensor = tf.import_graph_def(
            graph_def, name="", return_elements=["image_input", "Softmax"])
    

    我想避免使用两次sess.run()三次。 (生成随机图像,从 A 获取softmax值,调整 B 的权重)。 有没有办法直接连接张量,这样我只有一张图?

    通话:

    logits = extern_softmax_tensor(my_generated_image_tensor)
    

    抛出:

    TypeError: 'Operation' object is not callable
    

    “Graph-Connected”和“Feed-Connected”方法让我感到困惑。

  2. logits = extern_softmax_tensor(my_generated_image_tensor) # however you would call it
    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=label_input,
                                                            logits=logits)
    cross_entropy_mean = tf.reduce_mean(cross_entropy_tensor)
    optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
    learning_step = optimizer.minimize(cross_entropy_mean)
    

    使用该逻辑,错误将首先通过 A 传回。 有没有办法使用 A 计算的softmax来直接调整 B 的图层?

  3. 如果我的想法确实有效,那么实际上是否可以在tensorflow中构建它?我希望我能把问题弄清楚。

    非常感谢

1 个答案:

答案 0 :(得分:0)

是的,connect two models可以这样做。

# Generator networ
my_generated_image_tensor = ...
# Read classifier
with gfile.FastGFile("shape-classifier.pb", 'rb') as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
    # Map generator output to classifier input
    extern_softmax_tensor, = tf.import_graph_def(
        graph_def, name="", input_map={"image_input": my_generated_image_tensor},
        return_elements=["Softmax:0"])
# Define loss and training step
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(
    labels=label_input, logits=extern_softmax_tensor)
cross_entropy_mean = tf.reduce_mean(cross_entropy_tensor)
optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
learning_step = optimizer.minimize(cross_entropy_mean)

作为附注:1)tf.nn.softmax_cross_entropy_with_logits期望logits作为输入,即之前的值通过softmax函数传递,所以如果Softmax张量在加载模型是softmax操作的输出,您应该更改它以使用输入logits。 2)请注意,tf.nn.softmax_cross_entropy_with_logits现已弃用,请参阅tf.nn.softmax_cross_entropy_with_logits_v2