上图是一个mnist手写数据集,如果想要它通过训练被识别出来,需要选定一个模型,用简单的线性模型肯定是走不通的,事实上,现在大部分的数据集都不可能达到一种线性拟合状态,除非是人为自己定义的。所以,这里引出分类的概念,线性模型只有一种情况,当我们有多种结果产生(0,1,2…)时,就需要用到分类了,本节主要记录了使用梯度下降求解逻辑回归的案例。
首先谈谈softmax这个函数(激活函数):
Softmax 在机器学习和深度学习中有着非常广泛的应用。尤其在处理多分类(C > 2)问题,分类器最后的输出单元需要Softmax 函数进行数值处理。关于Softmax 函数的定义如下所示:
比如上面的图片,左边有3张图片,看第一张图片,它是“猫”的可能性为5,“狗”的可能性为4,“马”的可能性为2,那么把它们利用softmax进行计算:
【1】(2.71)^5 =146.2
【2】(2.71)^4=53.9
【3】(2.71)^2=7.3
【1】/【1】+【2】+【3】=146.2/207.4=0.705左右,同理,一次利用softmax计算出方块内所有的概率。概率最高的即为最相似的值。一般来说,softmax满足以下条件:
下面看一下实例:
(同样用mnist数据集进行训练)
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("mnist/", one_hot=True)
def logistic_regression():
x = tf.placeholder(shape=[None, 784], dtype=tf.float32)
y = tf.placeholder(shape=[None, 10], dtype=tf.float32)
w = tf.Variable(tf.zeros(shape=[784, 10]), dtype=tf.float32)
b = tf.Variable(tf.zeros(shape=[1, 10]), dtype=tf.float32)
y_ = tf.nn.softmax(tf.add(tf.matmul(x, w), b)) # softmax函数分类(概率最大的)
loss = -tf.reduce_sum(y * tf.log(y_)) # 交叉熵损失函数
step = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(loss) # 最小排放错误
acc_mat = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
acc_ret = tf.reduce_sum(tf.cast(acc_mat, tf.float32))
init = tf.global_variables_initializer() # 初始化变量
with tf.Session() as sess:
sess.run(init)
for i in range(10000):
batch_xs, batch_ys = mnist.train.next_batch(100) # 小批量训练
sess.run(step, feed_dict={x: batch_xs, y: batch_ys}) # 喂训练数据
if (i + 1) % 1000 == 0:
curr_acc = sess.run(fetches=acc_ret,
feed_dict={x: mnist.test.images[:1000], y: mnist.test.labels[:1000]}) # 喂测试数据
print("curr_acc:", (curr_acc / 10), "%")
# print(sess.run(b))
if __name__ == "__main__":
logistic_regression()
训练结果: