Softmax用于基本逻辑分类器 - Tensorflow

时间:2017-07-11 11:46:58

标签: tensorflow neural-network

我正在研究基本的神经网络分类器。目标是基于3标签数据组训练NN,然后预测值。数据原理图如下:enter image description here

我的代码提供了垃圾回答。有什么建议吗?

目前的代码如下:

import tensorflow as tf
import numpy as np

#increased the number of epoch
epochs = 100000
# For eq100tion y = b + 0.1, sample data below
myImportedDatax1_np = np.array([[.1],[.1],[.2],[.2],[.3],[.3],[.4],[.4],[.1],[.1],[.2],[.2],],dtype=float)
myImportedDatax2_np = np.array([[.1],[.2],[.1],[.2],[.3],[.4],[.3],[.4],[.3],[.4],[.3],[.4]],dtype=float)
combined_Imported_Data_x = np.append(myImportedDatax1_np, myImportedDatax2_np, axis=1)
myImportedDatay_np = np.array([0,0,0,0,1,1,1,1,2,2,2,2],dtype=int)

number_unique_labels = myImportedDatay_np.max()+1 
myImportedDatay_np_one_hot = np.zeros((myImportedDatay_np.size, number_unique_labels))

myImportedDatay_np_one_hot[np.arange(myImportedDatay_np.size),myImportedDatay_np] = 1

print(myImportedDatay_np_one_hot)

x = tf.placeholder(tf.float32, [None, 2], name='x')

y_true = tf.placeholder(tf.float32, [None, number_unique_labels], name='y_true')

nodes_Hidden_Layer_1 = 6
number_Inputs = 2
number_Outputs = 3

W1 = tf.Variable(tf.random_normal([number_Inputs, nodes_Hidden_Layer_1], stddev=0.03), name='W1')
b1 = tf.Variable(tf.random_normal([nodes_Hidden_Layer_1]), name='b1')
W2 = tf.Variable(tf.random_normal([nodes_Hidden_Layer_1, number_Outputs], stddev=0.03), name='W2')
b2 = tf.Variable(tf.random_normal([number_Outputs]), name='b2')

hidden_out = tf.add(tf.matmul(x, W1), b1)
hidden_out = tf.nn.relu(hidden_out)

y_ = (tf.add(tf.matmul(hidden_out, W2), b2))

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_))

optimiser = tf.train.GradientDescentOptimizer(0.7).minimize(cost)

init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    # initialise the variables
    sess.run(init_op)
    for epoch in range(epochs):
        _, cost_now = sess.run([optimiser, cost], {x: combined_Imported_Data_x, y_true: myImportedDatay_np_one_hot})
    print("Predicted values are:")
    print(sess.run(y_, {x: combined_Imported_Data_x}))

1 个答案:

答案 0 :(得分:1)

因此,简而言之,代码中缺少的内容如下:

  • 最后,您正在尝试打印y_,但这是原始的 你不能轻易解释的神经元,这就是为什么它看起来像垃圾,但基本上它是正确的。

  • 您需要通过softmax传递原始输出,以便将其压缩为可以解释为概率的内容。你的代码通过调用softmax来通过tf.nn.softmax_cross_entropy_with_logits,但这最终会在图形的一个单独的分支中出现,这不是你为自己的眼睛打印的东西 - TF得到它cost计算,但你看不到它

  • 因此,只需单独通过softmax运行原始输出,然后获取该输出的argmaxArgmax为您提供输入中最大元素的索引,因此基本上是您要查找的类。这最终你需要将其视为预测值。

  • 如果您逐步打印预测的输出,您将看到网络“学习”(基本上是记忆)它是什么 需要做第200次迭代(所以不需要100,000 时代!)。不要忘记,这是一个微不足道的问题 并没有数据集的变化,所以即使你的糟糕6 神经元,网络基本上记住了需要做的事情。 但这可以很好地说明它是如何学习的。

要记住的其他事项要小心:

  1. 有一个tf.one_hot()函数,因此无需手动执行任何操作
  2. 您的学习率通常过高。似乎没问题,但在其他情况下,优化器会跳回来 在这个速度下过多,请记住这一点。
  3. 所以我在代码中添加了一些调整。这是它的样子。我认为这应该没问题:

    import tensorflow as tf
    import numpy as np
    
    #increased the number of epoch
    epochs = 1000
    step = 5
    # For eq100tion y = b + 0.1, sample data below
    myImportedDatax1_np = np.array([[.1],[.1],[.2],[.2],[.3],[.3],[.4],[.4],[.1],[.1],[.2],[.2],],dtype=float)
    myImportedDatax2_np = np.array([[.1],[.2],[.1],[.2],[.3],[.4],[.3],[.4],[.3],[.4],[.3],[.4]],dtype=float)
    combined_Imported_Data_x = np.append(myImportedDatax1_np, myImportedDatax2_np, axis=1)
    myImportedDatay_np = np.array([0,0,0,0,1,1,1,1,2,2,2,2],dtype=int)
    
    number_unique_labels = myImportedDatay_np.max()+1
    myImportedDatay_np_one_hot = np.zeros((myImportedDatay_np.size, number_unique_labels))
    
    myImportedDatay_np_one_hot[np.arange(myImportedDatay_np.size),myImportedDatay_np] = 1
    
    print('x {}\n{}\n*****'.format(combined_Imported_Data_x.shape, combined_Imported_Data_x))
    print('y {}\n{}\n*****'.format(myImportedDatay_np_one_hot.shape, myImportedDatay_np_one_hot))
    
    x = tf.placeholder(tf.float32, [None, 2], name='x')
    
    y_true = tf.placeholder(tf.float32, [None, number_unique_labels], name='y_true')
    
    nodes_Hidden_Layer_1 = 6
    number_Inputs = 2
    number_Outputs = 3
    
    W1 = tf.Variable(tf.random_normal([number_Inputs, nodes_Hidden_Layer_1], stddev=0.03), name='W1')
    b1 = tf.Variable(tf.random_normal([nodes_Hidden_Layer_1]), name='b1')
    W2 = tf.Variable(tf.random_normal([nodes_Hidden_Layer_1, number_Outputs], stddev=0.03), name='W2')
    b2 = tf.Variable(tf.random_normal([number_Outputs]), name='b2')
    
    hidden_out = tf.add(tf.matmul(x, W1), b1)
    hidden_out = tf.nn.relu(hidden_out)
    
    y_ = (tf.add(tf.matmul(hidden_out, W2), b2))
    ys = tf.nn.softmax(y_, name='ys')
    pred = tf.argmax(ys, axis=1)
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_))
    
    optimiser = tf.train.GradientDescentOptimizer(0.7).minimize(cost)
    
    init_op = tf.global_variables_initializer()
    
    with tf.Session() as sess:
        # initialise the variables
        sess.run(init_op)
        for epoch in range(epochs):
            _, cost_now, p = sess.run([optimiser, cost, pred], {x: combined_Imported_Data_x, y_true: myImportedDatay_np_one_hot})
            if epoch % step == 0:
                print('Step {}, Predictions: {}'.format(epoch, p))