使用类先验优化输入图像

2024-03-06

我正在尝试实现谷歌博客条目的第一部分起始论:深入探讨神经网络 https://research.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html在 TensorFlow 中。到目前为止,我发现了一些资源可以解释它自然语言 https://stackoverflow.com/questions/32856606/google-inceptionism-obtain-images-by-class或专注于其他部分或给出其他框架的代码片段 https://stackoverflow.com/questions/30994563/google-deep-dream-art-how-to-pick-a-layer-in-a-neural-network-and-enhance-it。我理解相对于先前的类优化随机输入图像的想法以及此中给出的其背后的数学论文,第 2 节 https://arxiv.org/pdf/1312.6034v2.pdf,但我无法自己使用 TensorFlow 实现它。

From 这个问题 https://stackoverflow.com/questions/39856291/how-to-visualize-dnns-dependent-of-the-output-class-in-tensorflow/39858096?noredirect=1#comment67705644_39858096以及有用的评论etarion,我现在知道您可以向优化器提供变量列表,而所有其他变量均保持不变。然而,当给优化器一个随机图像作为变量时会导致

File "mnist_test.py", line 101, in main
    optimizer2 = tf.train.AdamOptimizer(learning_rate).minimize(-cost, var_list=[rnd_img])
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 198, in minimize
  name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 309, in apply_gradients
  (converted_grads_and_vars,))
ValueError: No gradients provided for any variable: ((None,<tensorflow.python.ops.variables.Variable object at 0x7feac1870410>),)

出于测试目的,我使用了一个精简的 MNIST 示例。我尝试使其尽可能短,同时仍具有可读性和可执行性:

def main():
    # parameters
    learning_rate = 0.001
    train_batches = 1000
    batch_size = 128
    display_step = 50

    # net parameters
    n_input = 784 #28x28
    n_classes = 10
    keep_prob = 0.75

    weights = {
        'wc1': tf.Variable(tf.truncated_normal([5, 5, 1, 32])),
        'wc2': tf.Variable(tf.truncated_normal([5, 5, 32, 64])),
        'wd1': tf.Variable(tf.truncated_normal([7*7*64, 1024])),
        'out': tf.Variable(tf.truncated_normal([1024, n_classes]))
    }

    biases = {
        'bc1': tf.Variable(tf.constant(0.1, shape=[32])),
        'bc2': tf.Variable(tf.constant(0.1, shape=[64])),
        'bd1': tf.Variable(tf.constant(0.1, shape=[1024])),
        'out': tf.Variable(tf.constant(0.1, shape=[n_classes]))
    }

    # tf inputs
    x = tf.placeholder(tf.float32, [None, n_input])
    y = tf.placeholder(tf.float32, [None, n_classes])
    dropout = tf.placeholder(tf.float32)

    # create net
    net = create_net(x, weights, biases, keep_prob)

    # define loss
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(net, y))

    # define optimizer
    optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)

    # evaluation
    pred_correct = tf.equal(tf.argmax(net, 1), tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(pred_correct, tf.float32))

    print "loading mnist data"
    from tensorflow.examples.tutorials.mnist import input_data
    mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

    sess = tf.Session()
    sess.run(tf.initialize_all_variables())

    for i in xrange(train_batches):
        batch_x, batch_y = mnist.train.next_batch(batch_size)

        sess.run(optimizer, feed_dict={x: batch_x, y: batch_y, dropout: keep_prob})

        if i % display_step == 0:
            loss, acc = sess.run([cost, accuracy], feed_dict={x: batch_x, y: batch_y, dropout: 1.0})
            print "batch: %i, loss: %.5f, accuracy: %.5f" % (i, loss, acc)

    acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels, dropout: 1.0})
    print "test accuracy: %.5f" % (acc)

    # ====== this is where the reconstruction begins =====

    rnd_img = tf.Variable(tf.random_normal([1, n_input]))
    one_hot = np.zeros(10)
    one_hot[4] = 1;

    # the next line causes the error
    optimizer2 = tf.train.AdamOptimizer(learning_rate).minimize(-cost, var_list=[rnd_img])

    for i in xrange(1000):
        session.run(optimizer2, feed_dict={x: rnd_img, y: one_hot, dropout: 1.0})

    sess.close()

if __name__ == "__main__":
    main()

我使用的辅助函数:

def create_net(x, weights, biases, dropout):
    x = tf.reshape(x, shape=[-1, 28, 28, 1])

    conv1 = conv2d_relu(x, weights['wc1'], biases['bc1'])
    conv1 = maxpool2d(conv1, 2)

    conv2 = conv2d_relu(conv1, weights['wc2'], biases['bc2'])
    conv2 = maxpool2d(conv2, 2)

    fc1 = fullyconnected_relu(conv2, weights['wd1'], biases['bd1'])
    fc1 = tf.nn.dropout(fc1, dropout)

    out = tf.add(tf.matmul(fc1, weights['out']), biases['out'])

    return out

def conv2d_relu(x, W, b, stride=1):
    conv = tf.nn.conv2d(x, W, strides=[1, stride, stride, 1], padding='SAME')
    conv = tf.nn.bias_add(conv, b)
    return tf.nn.relu(conv)

def maxpool2d(x, k=2, stride=2, padding='VALID'):
    return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, stride, stride, 1], padding=padding)

def fullyconnected_relu(x, W, b):
    fc = tf.reshape(x, [-1, W.get_shape().as_list()[0]])
    fc = tf.add(tf.matmul(fc, W), b)
    fc = tf.nn.relu(fc)

我发现一些消息来源说,当输出和要优化的变量之间的计算图中没有路径时,就会发生此错误,但我不明白为什么会出现这种情况。

我的问题是:

  1. 为什么优化器无法应用任何梯度?
  2. 这是实现类可视化的正确方法吗?

提前致谢。

Edit:

在合并已接受的答案之后,这里再次是完整的代码(对于任何感兴趣的人)。无论如何,结果仍然不符合预期,因为脚本在 100000 轮重建后基本上产生了随机图像。欢迎提出想法。

import tensorflow as tf
import numpy as np
import skimage.io

def conv2d_relu(x, W, b, stride=1):
    conv = tf.nn.conv2d(x, W, strides=[1, stride, stride, 1], padding='SAME')
    conv = tf.nn.bias_add(conv, b)
    return tf.nn.relu(conv)

def maxpool2d(x, k=2, stride=2, padding='VALID'):
    return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, stride, stride, 1], padding=padding)

def fullyconnected_relu(x, W, b):
    fc = tf.reshape(x, [-1, W.get_shape().as_list()[0]])
    fc = tf.add(tf.matmul(fc, W), b)
    fc = tf.nn.relu(fc)

    return fc;

def create_net(x, weights, biases, dropout):
    x = tf.reshape(x, shape=[-1, 28, 28, 1])

    conv1 = conv2d_relu(x, weights['wc1'], biases['bc1'])
    conv1 = maxpool2d(conv1, 2)

    conv2 = conv2d_relu(conv1, weights['wc2'], biases['bc2'])
    conv2 = maxpool2d(conv2, 2)

    fc1 = fullyconnected_relu(conv2, weights['wd1'], biases['bd1'])
    fc1 = tf.nn.dropout(fc1, dropout)

    out = tf.add(tf.matmul(fc1, weights['out']), biases['out'])

    return out

def save_image(img_data, name):
    img = img_data.reshape(28,28)

    mi = np.min(img)
    ma = np.max(img)

    img = (img-mi)/(ma-mi)
    skimage.io.imsave(name, img)

def main():
    # parameters
    learning_rate = 0.001
    train_batches = 1000
    batch_size = 100
    display_step = 50

    # net parameters
    n_input = 784 #28x28
    n_classes = 10
    keep_prob = 0.75

    weights = {
        'wc1': tf.Variable(tf.truncated_normal([5, 5, 1, 32])),
        'wc2': tf.Variable(tf.truncated_normal([5, 5, 32, 64])),
        'wd1': tf.Variable(tf.truncated_normal([7*7*64, 1024])),
        'out': tf.Variable(tf.truncated_normal([1024, n_classes]))
    }

    biases = {
        'bc1': tf.Variable(tf.constant(0.1, shape=[32])),
        'bc2': tf.Variable(tf.constant(0.1, shape=[64])),
        'bd1': tf.Variable(tf.constant(0.1, shape=[1024])),
        'out': tf.Variable(tf.constant(0.1, shape=[n_classes]))
    }

    # tf inputs
    x = tf.placeholder(tf.float32, [None, n_input])
    y = tf.placeholder(tf.float32, [None, n_classes])
    dropout = tf.placeholder(tf.float32)

    # create net
    net = create_net(x, weights, biases, dropout)

    # define loss
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(net, y))

    # define optimizer
    optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)

    # evaluation
    pred_correct = tf.equal(tf.argmax(net, 1), tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(pred_correct, tf.float32))

    print "loading mnist data"
    from tensorflow.examples.tutorials.mnist import input_data
    mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

    sess = tf.Session()

    sess.run(tf.initialize_all_variables())

    for i in xrange(train_batches):
        batch_x, batch_y = mnist.train.next_batch(batch_size)

        sess.run(optimizer, feed_dict={x: batch_x, y: batch_y, dropout: keep_prob})

        if i % display_step == 0:
            loss, acc = sess.run([cost, accuracy], feed_dict={x: batch_x, y: batch_y, dropout: 1.0})
            print "batch: %i, loss: %.5f, accuracy: %.5f" % (i, loss, acc)

    acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels, dropout: 1.0})
    print "test accuracy: %.5f" % (acc)

    # reconstruction part
    rnd_img = tf.Variable(tf.random_normal([1, n_input]))

    one_hot = np.zeros((1, 10))
    one_hot[0,1] = 1;

    net2 = create_net(rnd_img, weights, biases, dropout)
    cost2 = -tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(net2, y))
    optimizer2 = tf.train.AdamOptimizer(learning_rate).minimize(cost2, var_list=[rnd_img])

    init_var_list = []

    for var in tf.all_variables():
        if(not tf.is_variable_initialized(var).eval(session=sess)):
            init_var_list.append(var)

    sess.run(tf.initialize_variables(init_var_list))

    save_image(rnd_img.eval(sess), "bevor.tiff")

    for i in xrange(100000):
        _, loss = sess.run([optimizer2, cost2], feed_dict={y: one_hot, dropout: 1.0})
        if(i%10000 == 0):
            cur_img = rnd_img.eval(session=sess)
            print "loss:", loss, "mi:", np.min(cur_img), "ma:", np.max(cur_img)

    save_image(rnd_img.eval(sess), "after.tiff")

    sess.close()

if __name__ == "__main__":
    main()

一些解释:使用新的输入变量和优化器重建图形后,我必须初始化新变量,即 rnd_img 和 Adam 优化器使用的一些辅助变量,因此循环 all_variables() 并检查初始化状态。如果有人知道更优雅的方式,请告诉我。或者也许这就是我没有得到任何结果的原因?


rnd_img 需要是您优化的图形的一部分。在您的情况下,您只需创建一个变量并告诉优化器对其进行优化,但该变量与图中的损失无关。例如,您可以做的是使用 rnd_image 而不是 x 使用另一个对 create_net 的调用(但使用相同的权重!),为此创建成本,然后为该成本创建一个最小化操作。然后为了优化你只需要输入 y 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用类先验优化输入图像 的相关文章

随机推荐

  • 每 n 个字符分割字符串新列

    假设我有一个像这样的数据框 带有字符串向量 var2 var1 var2 1 abcdefghi 2 abcdefghijklmnop 3 abc 4 abcdefghijklmnopqrst 将 var2 每 n 个字符拆分为新列直到每个
  • 图像大小调整后 OpenCV VideoWriter 不工作

    我正在使用 OpenCV 3 和 Visual Studio 这里的问题是 除了默认的完整相机分辨率之外 我无法保存任何特定分辨率的视频 没有错误 但视频文件不增长 它保持在 5 54kb 这是我的代码 include opencv2 op
  • 在 MongoDB 全文搜索中搜索特定字段中的值

    MongoDB 全文搜索 你好 我已经在索引中放入了一些字段 这就是我可以搜索的方式搜索关键字 BasicDBObject search new BasicDBObject search search keyword BasicDBObje
  • Rails 如何对 Javascript 进行 Gzip 压缩? (赫罗库)

    我已经运行了 google page speed 它说我应该 Gzip 我的 javascript 文件 如何对我的 javascript 文件进行 gzip 压缩 如果有的话 我的网站托管在 heroku 上 您可以使用 jammit g
  • 在RaspberryPi上连接华为E3372

    我尝试使用华为 e3372 的 LTE 棒连接到互联网 我安装了 usb modeswitch ppp 和 wvdial modewswitch 工作正常 该设备安装在 dev ttyUSB0 上 我可以在其中发送 AT 命令 我想使用 w
  • 收到“此应用程序正在从后台线程修改自动布局引擎”错误?

    在我的 OS X 中使用 swift 经常遇到这个错误 此应用程序正在从后台线程修改自动布局引擎 这可能会导致引擎损坏和奇怪的崩溃 这将在未来的版本中导致异常 我有一个我的NSWindow我正在交换观点contentView窗户的 我得到了
  • 当鼠标悬停时,Chartjs 显示标签和单位统计

    当我的鼠标指针悬停在图表上时是否可以显示标签和单位 目前只有数字 对于下面的例子 我想展示 58 标签1 0 标签2 0 标签3 0 标签4 0 标签5 我的选项如下所示 var options Boolean Show a backdro
  • 如何在 Java 代理中包含自行创建的 Java 文件

    In IBM Notes if I create a Java Agent how do I then include my own created java files 所以我创建了一个 cxmlCustom 包 我想将其包含在 prof
  • 如何在android中动态画线[重复]

    这个问题在这里已经有答案了 可能的重复 如何在android中画一条线 https stackoverflow com questions 3616676 how to draw a line in android 我必须匹配两个选项 就像
  • 通过膨胀布局创建自定义视图?

    我正在尝试创建一个自定义视图来替换我在多个地方使用的特定布局 但我正在努力做到这一点 基本上 我想替换这个
  • 带有 LaTeX 文本的参考文献

    在 LaTeX 中 您可以通过使用轻松引用某个部分 label 旁边的一个部分 然后 ref 创建参考 但是 参考文献仅包括节号或带有以下内容的页码 pageref 我想插入包含该部分文本的参考 Example section My Sec
  • 使用C#正则表达式删除HTML标签

    如何使用 C 正则表达式替换 删除所有 HTML 标记 包括尖括号 有人可以帮我解决代码吗 正如前面经常提到的 不应使用正则表达式来处理 XML 或 HTML 文档 它们在处理 HTML 和 XML 文档时表现不佳 因为无法以通用方式表达嵌
  • 相当于 VB.NET 中的 MoveNext

    由于 Recordset MoveNext 函数在 VB NET 中不再可用 在互联网上搜索了很多 我想要一种方法来解决我的问题 使用 MSSQL 刚刚在 SQLDATASET 不支持的地方看到 movenext 函数 我想使用类似于 Mo
  • 当我在线加载页面时,“web.config”文件出错

    我是 ASP NET 4 0 的新手开发人员 我开发了一个网站 它完全可以在我的本地系统中运行 但是现在我将所有文件上传到服务器 当我加载任何页面时 会出现错误网页配置 file 我的 Web Config 代码是这样的
  • Xcode 3.1.4 缺少代码签名权利选项?

    我使用的是 Xcode 3 1 4 并遇到了可怕的 可执行文件已使用无效权利签名 错误 我正在尝试在 BUILD 选项中添加 Entitlement plist 但我找不到放置它的位置 该选项曾经存在于 代码签名身份 之上 我认为它被称为
  • 用于网站流媒体的免费音频播放器

    我可以在我的网站中使用免费的音频播放器吗 它们可以定制吗 我听说过 Soundmanager 2 它是一个基于 Flash 的播放器 带有 JavaScript 前端 还有其他类似的免费播放器吗 如果您想要不需要加载 Flash 插件的东西
  • 何时以及为什么应该在 Scala 中使用 Applicative Functors

    我知道Monad在Scala中可以表示如下 trait Monad F def flatMap A B f A gt F B F A gt F B 我明白为什么它很有用了 例如 给定两个函数 getUserById userId Int O
  • 如何在 .NET 中表示一个非常大的整数?

    NET 是否提供了能够表示极大整数 例如 100 阶乘 的类 如果没有 有哪些好的第三方库可以实现这一点 NET 4 有一个大整数 http msdn microsoft com en us library system numerics
  • asp.net 添加 ApiController 作为依赖注入的服务

    你好 我走了本指南 http scottdorman github io 2016 03 17 integrating asp net core dependency injection in mvc 4 将 asp net core 依赖
  • 使用类先验优化输入图像

    我正在尝试实现谷歌博客条目的第一部分起始论 深入探讨神经网络 https research googleblog com 2015 06 inceptionism going deeper into neural html在 TensorF