2

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

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

- TensorFlow always return same result

这里是我的代码:

在:

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) 

出:

(20,1) (20,1)

在:

# 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 }) 

出:

array([[ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.]], dtype=float32) 

我试图玩我的超参数,如学习率或训练时期的数量。 我将激活功能从softmax更改为relu。 我改变了我的数据框以获得更多示例,但没有发生任何事情。 我也尝试为我的权重添加随机数,但没有任何变化,成本刚刚开始增加。

回答

3

从快速浏览代码看,它对我来说看起来还可以(也许是将权重初始化为零,通常你想要一个不同于零的小数以避免一个小问题),而我不认为你可以用线性回归来拟合整数奇偶性的问题。

的一点是,你正在试图将

x % 2 

与形式

activation(x * w + b) 

的预测,并没有办法找到好的wb来解决这个问题。

理解这一点的另一种方法是绘制您的数据:x奇偶校验的散点图是两条直线,并且用直线拟合它们的唯一方法是用一条扁平线(这将具有较高的无论如何成本)。

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

+0

坦克!我会尝试与其他数据,并随机起始重量。 –

3

我看到的主要问题是您用W来初始化W矩阵中的权重。你在线性层中的操作基本上是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

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

您正在使用最简单的网络架构(1维perceptron)。你有两个变量(W和B)要学习和输出你的决策规则如下

decision formula of the pereceptron

如果你减去由W你

rearraged decision rule

b和鸿沟

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

虽然decinding如果一个数字是奇数,甚至似乎是一个超级平凡的任务,我们人类它不是一个单一的感知器。

相关问题