我有以下代码,我在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
,其他时间变为6
或7
,但所有示例都会为同一次运行获得相同的数字。
知道它有什么问题吗?
修改:
我修复了最后一行的缩进(这是错误的),但结果仍然对所有测试示例都有相同的标签。
答案 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
和偏见一样。这将有助于网络训练,因为现在梯度不会为零。