Tensorflow:易分类不会收敛

时间:2017-09-03 21:37:09

标签: python tensorflow

我试图移植" MNIST For ML Beginners"教程到其他数据集。作为我的数据集,我选择了wine,它似乎很好地用于分类测试任务。 我根据程序员指南文章阅读了CSV,这篇文章似乎不再可用了?

问题是我的准确性没有收敛。值是例如

0.0
0.0
0.266667
0.6
0.666667
0.666667
0.466667
0.266667
0.0
0.133333
0.0666667
0.0
0.0
0.0666667
0.333333
0.4
0.866667
0.4
0.466667
0.266667
0.133333
0.133333
0.133333
0.0666667
0.0
0.0
0.333333
0.6
0.733333
0.733333
0.333333
0.133333
0.266667
0.0666667

我尝试打印我的重量矩阵,如果它在一些时期之后发生了变化并且它被改变了。那么为什么我的网络没有收敛?

我已经使用了高级Estimater API,它对这个数据集很有效,但我也想从低级别学习它。

也许问题是正常化?规范化是否正确按列进行标准化?

我的代码是

from __future__ import print_function
import tensorflow as tf

### some constants ####
MAX_STEPS = 1000
NUM_ATTRIBUTES = 13
NUM_TYPES = 3


def read_from_cvs(filename_queue):
    reader = tf.TextLineReader()
    _, value = reader.read(filename_queue)
    record_defaults = [[] for col in range(
        NUM_ATTRIBUTES + 1)]
    features = tf.decode_csv(value, record_defaults=record_defaults)
    examples = tf.stack(features[1:], name="features")
    labels = tf.one_hot(tf.cast(tf.stack(features[0]), tf.int32), NUM_TYPES + 1, name="labels")
    return examples, labels


def input_pipeline(filename='my_dataset.csv', batch_size=15, num_epochs=None):
    filename_queue = tf.train.string_input_producer([filename], num_epochs=num_epochs, shuffle=True)
    features, labels = read_from_cvs(filename_queue)

    min_after_dequeue = 2 * batch_size
    capacity = min_after_dequeue + 3 * batch_size
    feature_batch, label_batch = tf.train.shuffle_batch(
        [features, labels], batch_size=batch_size, capacity=capacity,
        min_after_dequeue=min_after_dequeue)
    return feature_batch, label_batch

def softmax():
    x, y_ = input_pipeline()

W = tf.Variable(tf.truncated_normal([NUM_ATTRIBUTES, NUM_TYPES + 1], stddev=0.1), name="weights")
b = tf.Variable(tf.truncated_normal([NUM_TYPES + 1], stddev=0.1), name="bias")    
    y = tf.nn.softmax(tf.matmul(x, W) + b)

    cross_entropy = tf.reduce_mean(
        tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
    train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

    sess = tf.InteractiveSession()


    tf.global_variables_initializer().run()

    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord, sess=sess)

    x = tf.nn.l2_normalize(x,1) # is my dataset normalized right this way?
    try:
        i = 0
        while not coord.should_stop() and i < MAX_STEPS:
            _, accu = sess.run([train_step, accuracy])
            print(accu)
            i += 1
    except tf.errors.OutOfRangeError:
        pass

    coord.request_stop()
    coord.join(threads)

    sess.close()

if __name__ == '__main__':
    softmax()

非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

数据集功能高度非规范化。将数据集的每一列除以其平均值,然后除以输入管道中的标准差。

还要考虑不同的优化器。梯度下降在概念上很简单,但实际上会被其他人从水中吹走。我个人最喜欢的是AdamOptimizer,但你可以和其他人一起玩。