由于[NaN ... NaN]预测,使用softmax的张量流特征识别导致精度1

时间:2017-02-23 08:11:19

标签: tensorflow softmax

我正在尝试使用https://www.tensorflow.org/get_started/mnist/beginners中讨论的softmax回归方法来识别字符。

我的代码如下。

train_data = pd.read_csv('CharDataSet/train.csv')
print(train_data.shape)
x = tf.placeholder(tf.float32, [None, 130])
W = tf.Variable(tf.zeros([130, 26]))
b = tf.Variable(tf.zeros([26]))

y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 26])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()

for _ in range(10):
  batch_xs = train_data.iloc[:, 2:]
  print(batch_xs)
  batch_ys = getencodedbatch(train_data.iloc[:, 1])
  print(batch_ys)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

然而,我的准确度为1,但情况并非如此。 我得到它的原因是因为我的y张量结果与

这样的数组
[nan, ..., nan]

有人可以向我解释我的代码中有什么问题吗?

我使用下面的方法将每个字符转换为单热编码

def getencodedbatch(param):
    s = (param.shape[0],26)
    y_encode = np.zeros(s)
    row=0
    # print(y_encode)
    for val in param:
        col = ord(val)-97
        y_encode[row, col] = 1
        row += 1
    return pd.DataFrame(y_encode)

1 个答案:

答案 0 :(得分:0)

以下是您遇到的问题:

  • 您将初始权重和偏差设置为0(这是错误的,因为您的 网络不学习)。
  • 结果是y由全部零组成
  • 你取y的日志..并且没有定义0的日志...因此NaN。
祝你好运!

编辑告诉你如何解决它:寻找一个关于分类MNIST字符并看看它们做什么的例子。您可能希望将权重初始化为随机法线;)