我正在尝试训练一个多层感知器来根据给定的输入对真假进行分类。到目前为止,我使用的是以下示例:
但这给我的输出是一个二进制值,我更希望得到一个基于小数或百分比的输出。
我尝试过的方法:
我尝试过更改为其他可用的优化器,但没有成功。
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
回答:
优化器不会改变由层实际给出的输出。
提供的示例使用ReLu作为层的激活函数,这对于分类来说很好,但要建模概率就不行了。你最好改用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") #带有sigmoid激活的隐藏层 layer_2 = tf.sigmoid(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2']), name="sigmoid_l2") #带有sigmoid激活的隐藏层 return tf.matmul(layer_2, _weights['out'], name="matmul_lout") + _biases['out']
这基本上是用sigmoid激活函数替换了ReLu激活函数。
然后,对于评估,使用softmax如下:
output1 = tf.nn.softmax((multilayer_perceptron(x, weights, biases)), name="output")avd = sess.run(output1, feed_dict={x: features_t})
这将为每个类别提供一个介于0和1之间的范围。此外,你可能需要增加epoch的数量才能使其工作。