Tensorflow始终预测相同的输出

时间:2017-06-06 09:06:35

标签: python machine-learning tensorflow neural-network deep-learning

所以,我正在尝试学习张量流,为此,我尝试为某些东西创建一个分类器,我认为并不那么难。 我想预测一个数字是奇数还是偶数。 问题是Tensorflow总是预测相同的输出,我搜索了最后几天的答案,但没有任何帮助我...... 我看到了以下答案: - Tensorflow predicts always the same result

- TensorFlow always converging to same output for all items after training

- TensorFlow always return same result

这是我的代码:

在:

<toolkit:RichTextBox x:Name="_richTextBox" Margin="10" BorderBrush="Gray" Padding="10"
                     Text="{Binding YourRtfSourceProperty}" ScrollViewer.VerticalScrollBarVisibility="Auto">
    <toolkit:RichTextBox.TextFormatter>
        <toolkit:RtfFormatter />
    </toolkit:RichTextBox.TextFormatter>
</toolkit:RichTextBox>

出:

(20,1) (20,1)

在:

df
    nb  y1
0   1   0
1   2   1
2   3   0
3   4   1
4   5   0
...
19  20  1

inputX = df.loc[:, ['nb']].as_matrix()
inputY = df.loc[:, ['y1']].as_matrix()
print(inputX.shape)
print(inputY.shape)

出:

# Parameters
learning_rate = 0.00000001
training_epochs = 2000
display_step = 50
n_samples = inputY.size


x = tf.placeholder(tf.float32, [None, 1])   
W = tf.Variable(tf.zeros([1, 1]))           
b = tf.Variable(tf.zeros([1]))            
y_values = tf.add(tf.matmul(x, W), b)      
y = tf.nn.relu(y_values)                 
y_ = tf.placeholder(tf.float32, [None,1])  

# Cost function: Mean squared error
cost = tf.reduce_sum(tf.pow(y_ - y, 2))/(2*n_samples)
# Gradient descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# Initialize variabls and tensorflow session
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

for i in range(training_epochs):  
    sess.run(optimizer, feed_dict={x: inputX, y_: inputY}) # Take a gradient descent step using our inputs and labels

    # Display logs per epoch step
    if (i) % display_step == 0:
        cc = sess.run(cost, feed_dict={x: inputX, y_:inputY})
        print("Training step:", '%04d' % (i), "cost=", "{:.9f}".format(cc)) #, \"W=", sess.run(W), "b=", sess.run(b)

print ("Optimization Finished!")
training_cost = sess.run(cost, feed_dict={x: inputX, y_: inputY})
print ("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')

在:

Training step: 0000 cost= 0.250000000
Training step: 0050 cost= 0.250000000
Training step: 0100 cost= 0.250000000
...
Training step: 1800 cost= 0.250000000
Training step: 1850 cost= 0.250000000
Training step: 1900 cost= 0.250000000
Training step: 1950 cost= 0.250000000
Optimization Finished!
Training cost= 0.25 W= [[ 0.]] b= [ 0.]

出:

sess.run(y, feed_dict={x: inputX })

我尝试使用我的Hyper参数,例如学习率或训练时期的数量。 我将激活功能从softmax更改为relu。 我更改了我的数据框以获得更多示例但没有任何反应。 我也尝试为我的权重添加随机数,但没有任何改变,成本只是开始更高的价值。

3 个答案:

答案 0 :(得分:3)

从快速查看代码开始,它看起来对我来说很好(也许是将权重初始化为零,通常你想要一个不同于零的小数字以避免一个简单的解决方案),而我不认为你可以用线性回归拟合整数奇偶校验的问题。

重点是你正在努力适应

x % 2

预测表格

activation(x * w + b)

并且无法找到好的wb来解决此问题。

理解这一点的另一种方法是绘制数据:x奇偶校验的散点图是两行点,并且用一条线拟合它们的唯一方法是使用扁平线(这将是反正费用很高。)

我认为最好先改变数据,但是如果你想解决这个问题,你应该使用正弦或余弦作为激活函数来获得一些结果。

答案 1 :(得分:3)

我看到的主要问题是你在W矩阵中用0来初始化你的权重。您在线性层中的操作基本上是Wx + b。因此,相对于x的渐变是W.如果现在从零开始为W,那么渐变也是0并且您无法学习任何东西。尝试使用tensorflow.org上所述的随机初始值

# Create two variables.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")

答案 2 :(得分:2)

首先,我必须承认我从未使用过tensorflow。但我认为你在这里有一个建模问题。

您正在使用最简单的网络架构(一维perceptron)。您有两个要学习的变量(w和b),输出的决策规则如

decision formula of the pereceptron

如果你减去b除以w得到

rearraged decision rule

所以你基本上在寻找一个分隔奇数和偶数的门槛。无论你如何选择w和b,你总是将一半的数字错误分类。

虽然判断一个数字是奇数还是偶数对于我们人类来说似乎是一项非常重要的任务,但它不适用于单个感知器。