版权声明:本文为博主原创文章,未经博主允许不得转载。 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函数的一般形式:
- 函数形式,将
K
维向量θx 转换为K
维向量hθ(x)
hθ(x)=⎡⎣⎢⎢⎢⎢⎢P(y=1|x;θ)P(y=2|x;θ)⋮P(y=K|x;θ)⎤⎦⎥⎥⎥⎥⎥=1∑Kj=1exp(θTjx)⎡⎣⎢⎢⎢⎢⎢exp(θT1x)exp(θT2x)⋮exp(θTKx)⎤⎦⎥⎥⎥⎥⎥
3. 代价函数(Loss Function)
- 函数形式
J(θ)=−1m⎡⎣∑i=1m∑j=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(θ)=−1m∑i=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