from : https://blog.csdn.net/wangyangzhizhou/article/details/75088106
关于多分类
我们常见的逻辑回归、SVM等常用于解决二分类问题,对于多分类问题,比如识别手写数字,它就需要10个分类,同样也可以用逻辑回归或SVM,只是需要多个二分类来组成多分类,但这里讨论另外一种方式来解决多分类——softmax。
关于softmax
softmax的函数为
P(i)=exp(θTix)∑Kk=1exp(θTkx)P(i)=exp(θiTx)∑k=1Kexp(θkTx)
可以看到它有多个值,所有值加起来刚好等于1,每个输出都映射到了0到1区间,可以看成是概率问题。
θTixθiTx为多个输入,训练其实就是为了逼近最佳的θTθT。
如何多分类
从下图看,神经网络中包含了输入层,然后通过两个特征层处理,最后通过softmax分析器就能得到不同条件下的概率,这里需要分成三个类别,最终会得到y=0、y=1、y=2的概率值。
继续看下面的图,三个输入通过softmax后得到一个数组[0.05 , 0.10 , 0.85],这就是soft的功能。
计算过程直接看下图,其中zLiziL即为θTixθiTx,三个输入的值分别为3、1、-3,ezez的值为20、2.7、0.05,再分别除以累加和得到最终的概率值,0.88、0.12、0。
使用场景
在多分类场景中可以用softmax也可以用多个二分类器组合成多分类,比如多个逻辑分类器或SVM分类器等等。该使用softmax还是组合分类器,主要看分类的类别是否互斥,如果互斥则用softmax,如果不是互斥的则使用组合分类器。
import tensorflow as tf
import numpy as np
x = tf.placeholder("float", [None,917])
w = tf.Variable(tf.zeros([917,22]))
b = tf.Variable(tf.zeros([22]))
y = tf.nn.softmax(tf.matmul(x,w) + b)
y_ = tf.placeholder("float", [None,22])
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_,logits=y))
#cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(cross_entropy)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
x_train_data = np.genfromtxt('train_data.x.data',delimiter=' ')
y_train_data = np.genfromtxt('train_data.y.data',delimiter=' ')
print("load x_train_data shape=",x_train_data.shape)
print("load y_train_data shape=",y_train_data.shape)
x_test_data = np.genfromtxt('train_data.x.data.test',delimiter=' ')
y_test_data = np.genfromtxt('train_data.y.data.test',delimiter=' ')
print("load x_test_data shape=",x_test_data.shape)
print("load y_test_data shape=",y_test_data.shape)
for i in range(10000):
sess.run(train_step, feed_dict={x: x_train_data, y_: y_train_data})
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print("iter i=",i," accuracy=",accuracy.eval(session=sess, feed_dict={x: x_test_data, y_: y_test_data}))