【发布时间】:2017-09-15 19:32:22
【问题描述】:
为了完全理解 tensorflow,我设计了一些简单的实验来验证我对正在发生的事情的理解。
我正在尝试训练一个 convnet 以生成输入的缩放版本,其中系统看起来像这样:
训练数据是我在 MATLAB 中创建的 shape=[1, 1, n, 1] 向量,如下所示:
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。
我很困惑。 为什么过滤器会训练到其预期值的三分之二?
这是我的代码:
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})
我做过的事情
- 我已经验证,如果你 conv2d 值为 0.25 的东西,它会缩放 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) 的漂亮图片。有趣的是,当您放大数据时,tensorflow 似乎每 5000 步重复选择权重值;但这是另一天的故事。
【问题讨论】:
标签: python tensorflow conv-neural-network