2017-09-15 11 views
0

私はテンソルフローを完全に理解するために、何が起こっているのかを理解するための簡単な実験を設計しました。私は、システムが次のようになり、入力のスケーリングされたバージョンを生成するためにconvnetを養成しようとしているTensorFlow conv2dが期待した結果に収束しない

enter image description here

トレーニングデータを見て、私はshape=[1, 1, n, 1]のMATLABで作成されたベクターであり、このような:

input =   [a, a, a, ..., a] 
output = 0.25 * [a, a, a, ..., a] 

と私は、Wshape=[1, 1, 1, 1]

のトレーニングですよフィルタカーネル

私はWの値が0.25に訓練されるべきだと想像しますが、それは0.189に訓練します。同様に、初期スケール係数0.5で入力と出力を作成すると、システムは0.378になります。

私はとても混乱しています。 なぜフィルタートレインは期待値の2/3になるでしょうか

は、ここに私のコードです:
I/O生成(MATLAB)

data = []; 
numPts = 500; 
for indx = 0:19999 
    data(end+1).x = rand(1,1).*ones(1,numPts); 
    data(end).y = .25 * data(end).x; 
end 

モデルとトレーニング(Pythonのtensorflow)
[私はポストのサイズを小さくするために私の入力機能を削除しましたが、私は私がやった

tf.app.flags.DEFINE_integer('max_steps', 50000,"""Number of batches to run.""") 
tf.app.flags.DEFINE_integer('num_samples', 500,"""Samples per vect.""") 
tf.app.flags.DEFINE_integer('filter_size', 1,"""Size of filter.""") 

with tf.Graph().as_default(): 
    global_step = tf.contrib.framework.get_or_create_global_step() 

    d1, d2 = inputs() 

    # Placeholders 
    X = tf.placeholder(tf.float32, name="X") 
    Y = tf.placeholder(tf.float32, shape=(1, 1, FLAGS.num_samples, 1), name="Y") 

    # TRAINABLE FILTER KERNEL 
    W = tf.Variable(tf.random_normal([1, FLAGS.filter_size, 1, 1]), dtype=tf.float32) 

    # MODEL 
    x = tf.reshape(X, shape=[1, 1, FLAGS.num_samples, 1]) 
    y_predicted = tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

    # LOSS AND STUFF 
    Y = tf.reshape(Y, shape=[1, 1, FLAGS.num_samples]) 
    y_p = tf.reshape(y_predicted, shape=[1, 1, FLAGS.num_samples]) 

    loss = tf.losses.mean_squared_error(labels=Y, predictions=y_p) 

    opt = tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(loss) 

    init_op = tf.group(tf.global_variables_initializer(), 
         tf.local_variables_initializer()) 

    with tf.Session() as sess: 

     sess.run(init_op) 

     tf.train.start_queue_runners(coord=tf.train.Coordinator()) 

     loss_vals, w_vals = [], [] # for storage 

     for n in range(0, FLAGS.max_steps): 
      x_data = sess.run(d1) 
      y_data = sess.run(d2) 

      sess.run(opt, feed_dict={ 
          X: x_data, 
          Y: y_data 
         }) 

      # DISPLAY PROGRESS 
      if n % 500 == 0: 
       print(n) 

      # STORE LOSS AND FILTER 
      if n % 100 == 0: 
       w_vals.append(sess.run([W])) 
       loss_vals.append(
        sess.run(loss, feed_dict={ 
         X: x_data, 
         Y: y_data 
        })) 

     # SAVE TO MATLAB 
     sio.savemat('./params.mat', {'loss': loss_vals, 'w': w_vals}) 

物事]それが働いていると確信している

  1. 私はあなたが0.25の値で何かをconv2dた場合、それは私が損失をたくさん試してみた0.25
  2. ことによってそれをスケーリングすることを確認しました。 huber_loss,absolute_difference,tf.square(Y - y_p)。常に〜2/3が低すぎます。
  3. 私はオプティマイザでプレイしました。 AdamOptimizer,GradientDescentOptimizer。学習率を変更しました。常に〜2/3が低すぎます。
  4. このフィルターの重さは、0.189 (absolute_difference and mean_squared_error)に収まります。興味深いことに、データを拡大すると、テンソルフローは5000ステップごとに重み値が繰り返されているようです。それは別の日の話です。

答えて

0

私にとっては問題ありません。

import tensorflow as tf 
import numpy as np 

FLAGS = tf.app.flags.FLAGS 
tf.app.flags.DEFINE_integer('max_steps', 50000, "Number of batches to run.""") 
tf.app.flags.DEFINE_integer('num_samples', 500, "Samples per vect.""") 
tf.app.flags.DEFINE_integer('filter_size', 1, "Size of filter.""") 

with tf.Graph().as_default(): 
    global_step = tf.contrib.framework.get_or_create_global_step() 

    # Placeholders 
    X = tf.placeholder(tf.float32, name="X") 
    Y = tf.placeholder(tf.float32, shape=(1, 1, FLAGS.num_samples, 1), name="Y") 

    # TRAINABLE FILTER KERNEL 
    W = tf.Variable(tf.random_normal([1, FLAGS.filter_size, 1, 1]), dtype=tf.float32) 

    # MODEL 
    x = tf.reshape(X, shape=[1, 1, FLAGS.num_samples, 1]) 
    y_predicted = tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

    # LOSS AND STUFF 
    y = tf.reshape(Y, shape=[1, 1, FLAGS.num_samples]) 
    y_p = tf.reshape(y_predicted, shape=[1, 1, FLAGS.num_samples]) 

    loss = tf.losses.mean_squared_error(labels=y, predictions=y_p) 

    opt = tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(loss) 

    init_op = tf.group(tf.global_variables_initializer(), 
         tf.local_variables_initializer()) 

    with tf.Session() as sess: 

     sess.run(init_op) 

     tf.train.start_queue_runners(coord=tf.train.Coordinator()) 

     loss_vals, w_vals = [], [] # for storage 

     for n in range(0, FLAGS.max_steps): 
      x_data = np.random.normal(size=(1, 1, FLAGS.num_samples, 1)) 
      y_data = x_data * 0.25 

      sess.run(opt, feed_dict={ 
          X: x_data, 
          Y: y_data 
         }) 

      # STORE LOSS AND FILTER 
      if n % 100 == 0: 
       w_vals.append(sess.run([W])) 
       loss_vals.append(
        sess.run(loss, feed_dict={ 
         X: x_data, 
         Y: y_data 
        })) 

      # DISPLAY PROGRESS 
      if n % 500 == 0: 
       print n, loss_vals[-1], w_vals[-1] 

を、出力はこのようなものです:私はpython.numpymatlabからの入力を変更した

0 0.0106585 [array([[[[ 0.14452107]]]], dtype=float32)] 
500 0.00148794 [array([[[[ 0.21119362]]]], dtype=float32)] 
1000 0.000211823 [array([[[[ 0.23576953]]]], dtype=float32)] 
1500 2.60087e-05 [array([[[[ 0.24478287]]]], dtype=float32)] 
2000 3.46493e-06 [array([[[[ 0.24807557]]]], dtype=float32)] 
2500 5.06054e-07 [array([[[[ 0.2492941]]]], dtype=float32)] 
3000 6.88539e-08 [array([[[[ 0.24974038]]]], dtype=float32)] 
3500 8.94391e-09 [array([[[[ 0.2499048]]]], dtype=float32)] 
4000 1.31581e-09 [array([[[[ 0.24996498]]]], dtype=float32)] 
4500 1.67827e-10 [array([[[[ 0.24998713]]]], dtype=float32)] 
5000 2.12909e-11 [array([[[[ 0.24999554]]]], dtype=float32)] 

たぶん、あなたは、MATLABデータのご入力を確認してください。

+0

ありがとうございます!入力データの形状がオフでした。 XとYに 'shape = [1,1、FLAGS.num_samples]'という形を使用し、 'shape = [FLAGS.num_samples、1,1,1]の形はすべてをクリアしました。 –

関連する問題