TensorFlow MLP 示例输出二进制而不是十进制

TensorFlow MLP example outputs binary instead of decimal

我正在尝试训练多层感知器根据给定的输入在真假之间进行分类。 到目前为止,我正在使用示例:

https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/multilayer_perceptron.py

但这给了我一个二进制值的输出,我宁愿有一个基于小数或百分比的输出。

我尝试过的:

我尝试更改其他可用优化器但没有成功。

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

优化器不会改变层实际给出的输出。

提供的示例对层使用 ReLu,这对 class化很有用,但对概率建模它不起作用。你最好使用 sigmoid 函数。

sigmoid函数可以用来建模概率,而ReLu可以用来建模正实数。

为了使其适用于提供的示例,请将 multilayer_perceptron 函数更改为:

def multilayer_perceptron(_X, _weights, _biases):
    layer_1 = tf.sigmoid(tf.add(tf.matmul(_X, _weights['h1']), _biases['b1']), name="sigmoid_l1") #Hidden layer with sigmoid activation
    layer_2 = tf.sigmoid(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2']), name="sigmoid_l2") #Hidden layer with sigmoid activation
    return tf.matmul(layer_2, _weights['out'], name="matmul_lout") + _biases['out']

它基本上取代了 S 型函数的 ReLu 激活。

然后,对于评估,使用 softmax 如下:

output1 = tf.nn.softmax((multilayer_perceptron(x, weights, biases)), name="output")
avd = sess.run(output1, feed_dict={x: features_t})

它将为每个 class 提供 0 到 1 之间的范围。此外,您可能必须增加纪元数才能使其正常工作。