我用来检查小技术的以下Tensorflow代码会进行回归。
x = tf.placeholder(tf.float32, [None, input_size], name="input_data")
y = tf.placeholder(tf.float32, [None], name="input_data")
W1 = tf.get_variable("W1", [input_size, blocks[0]], initializer=tf.truncated_normal_initializer(stddev=0.1))
b1 = tf.get_variable("b1", [blocks[0]])
Lw = tf.nn.l2_loss(W1)
W2 = tf.get_variable("W2", [blocks[0], blocks[1]], initializer=tf.truncated_normal_initializer(stddev=0.1))
b2 = tf.get_variable("b2", [blocks[1]])
Lw = Lw + tf.nn.l2_loss(W2)
W3 = tf.get_variable("W3", [blocks[1], blocks[2]], initializer=tf.truncated_normal_initializer(stddev=0.1))
b3 = tf.get_variable("b3", [blocks[2]])
Lw = Lw + tf.nn.l2_loss(W3)
W4 = tf.get_variable("W4", [blocks[2], output_size], initializer=tf.truncated_normal_initializer(stddev=0.1))
b4 = tf.get_variable("b4", [output_size])
Lw = Lw + tf.nn.l2_loss(W4)
op1 = tf.sigmoid(tf.nn.bias_add(tf.matmul(x,W1),b1));
op2 = tf.sigmoid(tf.nn.bias_add(tf.matmul(op1,W2),b2));
op3 = tf.sigmoid(tf.nn.bias_add(tf.matmul(op2,W3),b3));
out = tf.nn.bias_add(tf.matmul(op3,W4),b4);
loss1 = tf.nn.l2_loss(out-y)
loss = loss1 + reg_param * Lw
此处input_size
,reg_param
,blocks
是函数的输入。 None
是网络的batch_size的占位符。
在训练期间,只要我使用batch_szie = 1
,我就会得到正确的输出。在大约6,000次迭代之后,网络收敛到期望的输出,并且我得到约0.001的输出误差。但每当我使用batch_size=2
或更多时,代码根本不会收敛,我尝试了多达100,000次迭代,但训练数据的平均输出误差就像~0.2。
起初我认为有些操作出错了。但是,在测试期间,我已将batch_size
更改为最多50,并且看到测试结果正确(在培训期间使用batch_size=1
进行培训时)。所以我认为,正向运作是可以的。
总之,我在这里不知所措。有谁知道我做错了什么?如何消除这种差异呢?
答案 0 :(得分:0)
line 2
的这一更正解决了所有问题:
y = tf.placeholder(tf.float32, [None,1], name="input_data")