机器学习与TensorFlow编程(3)Softmax回归

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/irving512/article/details/72834196

0. 参考资料


1. 总体介绍

  • Softmax Regression模型是Logistic Regression在多分类问题上的推广。
  • 总体思路:
    • 假设一共有m个训练样本,输入一共n个属性,输出分类共有K类。
    • 输入矩阵X为m*(n+1)维矩阵。
    • 参数矩阵  θ  (n+1)*K维矩阵。  θj  (n+1)*1维向量,代表取第j类的参数向量。
    • 输出矩阵  hθ(x)  与样本结果y均为m*K维矩阵。
    • 输入矩阵、参数矩阵通过Softmax函数,转换为输出矩阵。输出矩阵  hθ(x)  代表每个分类的概率。
    • 通过概率获取代价函数:  log(hθ(x)) 
      • 概率接近1时,函数取值很小。
      • 概率接近0时,函数取值很大。
    • 求导获取参数每次的变化量,并通过梯度下降等优化算法获取结果。

2. Softmax函数

  • 本函数很高端,是Logistic函数的一般形式:
    • Softmax函数将取值范围在 (,+) 上的的K维向量,转换为取值范围在 (0,1] K维向量。
    • 具体参考Wiki知乎
  • 函数形式,将K维向量 θx 转换为K维向量 hθ(x)
    hθ(x)=P(y=1|x;θ)P(y=2|x;θ)P(y=K|x;θ)=1Kj=1exp(θTjx)exp(θT1x)exp(θT2x)exp(θTKx)

3. 代价函数(Loss Function)

  • 函数形式
    J(θ)=1mi=1mj=1K1{y(i)=j}logexp(θTjx(i))Kl=1exp(θTlx(i))
  • 提取Softmax部分
    p(y(i)=j|x(i);θ)=exp(θTjx(i))Kl=1exp(θTlx(i))
  • 经过求导(比较复杂,请参考文章1文章2),得到(n+1)维向量
    jJ(θ)=1mi=1m[x(i)(1{y(i)=j}p(y(i)=j|x(i);θ))]
  • 其他:
    • 代价函数的本质是交叉熵代价函数(Cross-entropy cost function)。

4. TensorFlow代码

  • Softmax Regression是TensorFlow Tutorial中的一部分,具体请参考这里
  • 以下代码是我自己手写的,参考了例程。
  • 数据来源:[mnist dataset][10]
  • Softmax Regression
import tensorflow as tf
import numpy as np
import mnist_dataset as md  # 自己写的代码,可以参考Github源码

# 获取训练数据
train_images = md.load_train_images_file()  # 60000*784
train_labels = md.load_train_labels_file()  # 60000*10
train_images_2 = np.concatenate((np.zeros([60000, 1]), train_images), 1)

# 获取测试数据
test_images = md.load_test_images_file()  # 10000*784
test_labels = md.load_test_labels_file()  # 10000*10
test_images_2 = np.concatenate((np.zeros([10000, 1]), test_images), 1)

# 构建Softmax Regression模型
x = tf.placeholder(tf.float32, [None, 785])
y_ = tf.placeholder(tf.float32, [None, 10])
W = tf.Variable(tf.zeros([785, 10]))
y = tf.matmul(x, W)

# 构建代价函数
cross_entropy = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))

# 设置优化算法参数
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

# 建立TensorFlow Session,并初始化所有参数
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()

# 梯度下降算法
for i in range(1000):
  sess.run(train_step, feed_dict={x: train_images_2, y_: train_labels})

# 使用测试数据,判断模型的准确性
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: test_images_2,
                                    y_: test_labels}))
# 测试结果为0.9202
# 运行了7分钟

[10/p/ffa51250ba2e

猜你喜欢

转载自blog.csdn.net/irving512/article/details/72834196