在每个例子中使用tensorflow获得相同的预测

时间:2017-06-29 13:49:40

标签: python pandas numpy tensorflow

我有以下代码,我在MNIST数据集上训练神经网络。然后,通过训练有素的网络,我试图预测test_inputs中的值。

import pandas as pd
import numpy as np
import tensorflow as tf
from math import trunc
from subprocess import check_output

def make_one_hot(m):
    result = pd.DataFrame((np.asarray(m)[:,None] == np.arange(10)).astype(int))
    return result

train_data = pd.read_csv("../input/train.csv", delimiter=',')
train_labels = make_one_hot(train_data.ix[:, 0])
train_inputs = train_data.ix[:, 1:]
test_inputs = pd.read_csv("../input/test.csv", delimiter=',')    

x = tf.placeholder(tf.float32, [None, 784])

W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0)), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(cross_entropy)


sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
for _ in range(1000):
  batch_xs = train_inputs.sample(n=100)
  batch_ys = train_labels.sample(n=100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

y = tf.nn.softmax(tf.matmul(x,W) + b)
result = sess.run(y, feed_dict={x: test_inputs})

f = open("results.csv","w+")
f.write("ImageId,Label\n")
for i in range(0, len(result)):
  x = 0
  for j in range(0, 10):
      if(result.item(i, j) == 1):
          x = j
  f.write("{},{}\n".format(i+1, x))

但是,无论输入如何,网络始终会为所有示例预测数字相同的数字。

数字本身会发生变化,有时变为1,其他时间变为67,但所有示例都会为同一次运行获得相同的数字。

知道它有什么问题吗?

修改

我修复了最后一行的缩进(这是错误的),但结果仍然对所有测试示例都有相同的标签。

2 个答案:

答案 0 :(得分:2)

编辑以响应OP编辑

我仍然认为您在x次迭代中使用f.write是有意义的。现在,除了i次迭代和j次迭代的值之外,您不打印任何文件,但实际上并不是您的任何结果。

您是否正在尝试执行以下操作:

for i in range(0, len(result)):
    x = 0
    for j in range(0, 10):
        if(result.item(i, j) == 1):
            x = j
            f.write("{},{}\n".format(i+1, x))

或者也许:

for i in range(0, len(result)):

    for j in range(0, 10):
        x = result.item(i, j)
        f.write("{},{}\n".format(i+1, x))

原始回复

您需要修复缩进:

for j in range(0, 10):
    if(result.item(i, j) == 1):
        x = j
    f.write("{},{}\n".format(i+1, j))

以便f.write命令属于for j循环。现在,您正在编写最后一个j值,该值在range(0,10)后始终为9,这意味着每个i image_id都会获得标签{{1} }。 另外,你在用9做什么?您首先根据条件设置x然后x = 0,但实际上从未使用过它。

答案 1 :(得分:2)

变量的初始化将不允许网络训练。将偏差和权重初始化为零将导致无法训练,因为渐变始终为零。

使用截断法线,其均值不等于零(大约0.1是好的)。 https://www.tensorflow.org/api_docs/python/tf/truncated_normal

和偏见一样。这将有助于网络训练,因为现在梯度不会为零。