私はテンソルフローを完全に理解するために、何が起こっているのかを理解するための簡単な実験を設計しました。私は、システムが次のようになり、入力のスケーリングされたバージョンを生成するためにconvnetを養成しようとしているTensorFlow conv2dが期待した結果に収束しない
:
トレーニングデータを見て、私はshape=[1, 1, n, 1]
のMATLABで作成されたベクターであり、このような:
input = [a, a, a, ..., a]
output = 0.25 * [a, a, a, ..., a]
と私は、W
はshape=[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})
物事]それが働いていると確信している
- 私はあなたが0.25の値で何かをconv2dた場合、それは私が損失をたくさん試してみた0.25
- ことによってそれをスケーリングすることを確認しました。
huber_loss
,absolute_difference
,tf.square(Y - y_p)
。常に〜2/3が低すぎます。 - 私はオプティマイザでプレイしました。
AdamOptimizer
,GradientDescentOptimizer
。学習率を変更しました。常に〜2/3が低すぎます。 - このフィルターの重さは、0.189 (absolute_difference and mean_squared_error)に収まります。興味深いことに、データを拡大すると、テンソルフローは5000ステップごとに重み値が繰り返されているようです。それは別の日の話です。
ありがとうございます!入力データの形状がオフでした。 XとYに 'shape = [1,1、FLAGS.num_samples]'という形を使用し、 'shape = [FLAGS.num_samples、1,1,1]の形はすべてをクリアしました。 –