2016-10-25 4 views
1

私はTensorFlowで Inceptionism: Going Deeper into Neural Networksの最初の部分を実装しようとしています。今まで私はnatural languageにそれを説明するか、またはother parts or give code snippets for other frameworksに焦点を当てるいくつかのリソースを見つけました。私はランダムな入力画像を先のクラスに関しても最適化し、このpaper, section 2で与えられた数学の後ろの数学を最適化する考えを理解していますが、TensorFlowを使ってそれを自分で実装することはできません。クラス前で入力画像を最適化する

this SO questionetarionによって役に立つコメントから、他のすべての変数は変更されませんが、私は今、あなたはオプティマイザに変数のリストを与えることができることを知っています。変数がつながるよう、テスト目的のために

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 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) 

は、私が見つけた:私が使用

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() 

ヘルパー関数:私はまだ読めると実行されながらできるだけ短く、それを維持しようとしました出力と最適化する変数との間の計算グラフ内のパスはありませんが、なぜこれがここに当てはまるのかわかりません。

私の質問は以下のとおりです。

  1. なぜオプティマイザは、任意のグラデーションを適用することはできないのですか?
  2. これはクラスの可視化を実装するための正しい方法ですか?

ありがとうございます。

編集:

ここでは(興味を持っている人のための)受け入れ答えの取り込み後に、再び完全なコードです。いずれにしても、スクリプトは基本的に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() 

いくつかの説明:新しい入力変数とオプティマイザでグラフを再構築した後、私は(all_variablesを超えるので、ループrnd_imgとアダム・オプティマイザが使用するいくつかのヘルパーの変数、すなわち、新しい変数を初期化する必要がありました)初期化の状態をチェックします。誰かがよりエレガントな方法を知っているなら、私に知らせてください。それとも、結果が得られないのはなぜですか?

答えて

1

rnd_imgは、最適化するグラフの一部にする必要があります。あなたのケースでは、変数を作成し、オプティマイザに最適化を指示しますが、変数はグラフの損失に接続されません。たとえば、xの代わりにrnd_imageを使ってcreate_netを呼び出すこともできます(ただし、同じ重みを使用します)。そのコストを作成し、そのコストの最小化演算を作成します。次に、最適化のためにyだけをフィードします。

+0

これは、ありがとうございました。すべてがうまくいきましたが、残念ながら期待通りにはできませんでした。つまり、100000回の再構成後でも基本的にはまだ少し乱雑な画像が残っています。 100000ラウンドは十分ではありませんか?質問を更新し、変更されたコードを追加します。 – thomas

+0

私は、コスト関数の入力イメージでL2正規化を省略したという事実が問題を引き起こすかもしれないことに気付きました。また、論文の文章では、後のクラスではなく、非正規化されたクラススコアを最小限にするとも考えました。したがって、cost2 = -tf.reduce_mean(tf.mul(net2、y))+ tf.nn.l2_loss(rnd_img)のようなものを使用してみます。このメイクのセンスはありますか? – thomas

関連する問題