您的位置:首页 > 其它

tensorflow入门(4)逻辑回归分类器

2017-05-27 13:53 555 查看

1、逻辑回归

Logistic回归是一种广义线性模型(generalized linear model),一般用于分类问题。其因变量可以是二分类的,也可以是多分类的。

如果因变量是连续的,就是多重线性回归;

如果因变量是二项分布,就是Logistic回归;

如果因变量是Poisson分布,就是Poisson回归;

如果因变量是负二项分布,就是负二项回归。

逻辑回归与线性回归的区别在于:增加了一个logitstic函数,把输出从负无穷到正无穷,压缩到0和1之间,变成概率(可能性)



2、逻辑回归分类器

2.1 原理

逻辑回归分类器(multinonial logistic classification)



原理图



计算过程

输入一个样本X—>logit分数—>概率值probability—>标签向量label

其中用到了线性模型、softmax函数和One-Hot编码。



2.2 模型构建

广义线性模型:向量表示。y=wx+b

softmax函数:把结果(score/logit)转换成概率(probability),结果越大,概率越大;概率之和为1。

softmax(a) 当a为数组时,返回相同大小的数据;当a为矩阵时,返回相同大小的矩阵,将每一列看作一个样本,因此每一列的和为1。

注意:等比例增加数组a中的每一个值,可以分类更加明显,比如,softmax(10*a)与softmax(a/10)的区别。

sigmoid和softmax函数的区别:

sigmoid将一个实数real value映射到(0,1)的区间

s(x)=L/1+e−k(x−x0)

其中,x0表示了函数曲线的中心(sigmoid midpoint),k是曲线的坡度。

softmax函数的本质就是将一个K 维的任意实数向量压缩(映射)成另一个K维的实数向量,其中向量中的每个元素取值都介于(0,1)之间。

s(x)j=exj/∑k=1Kexk

One-Hot编码:把概率(probability)转换成标签(label)



优点:简单方便

缺点:当遇到数以万计的分类类别时,One-Hot编码向量会非常大,而且里面有很多0。可以用嵌入的方法来解决该问题。

2.3 性能评价

交叉熵:通过计算概率向量与经过One-Hot编码的标签向量的距离,来衡量分类的优劣。



罚函数loss

先对训练集中每一个样本与其对应标签的距离求和,再求平均。



2.4 模型求解方法

梯度下降法:找到权重项w和偏差b使罚函数loss最小。



2.5正则化输入与初始化参数

问题1:图像如何输入?

问题2:如何初始化参数?

问、为什么要使正则化变量(使其均值为0且尽可能同方差)?

1、保证数值计算的稳定性:极大的数和极小的数相加会有错误。

比如:设一个变量是10亿 1 billion (10^9), 然后向它加 10^(-6) 加一百万 (10^6) 次,然后再减去10亿,结果是0.95,而不是1。

2、优化理论证明:当计算的值均值为0且尽可能同方差,优化搜索更快。



正则化输入(训练数据)



初始化参数(随机权重和偏差):从正态分布(0,sigma)中随机抽样作为权重和偏差



sigma值决定了在初始点输出的数量级,sigma越大,分布越扁,意味着有很大可能取到峰值;sigma越小,分布越集中,意味着取值越不确定。一般是开始于一个不确定的分布,随着训练的过程越来越优。因此sigma取值要偏小。

3、tensorflow代码

# encoding: utf-8
import input_data
import tensorflow as tf

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 建立抽象模型
x = tf.placeholder(tf.float32, [None, 784])  # 占位符
y = tf.placeholder(tf.float32, [None, 10])
W = tf.Variable(tf.zeros([784, 10]))  # matrix 784*10
b = tf.Variable(tf.zeros([10]))  # matrix 1*10
# a = f(W*x + b)
a = tf.nn.softmax(tf.matmul(x, W) + b)

# 定义损失函数和训练方法
# tow_loss = E[1/2*(y-a)^2]
# cross_loss = E[y*ln(a)+(1-y)ln(1-a)]
# reduce_sum(input_tensor, reduction_indices)
# function: return the mean of a tensor on row or column
# input_tensor: a matrix
# reduction_indices: which index? none:all, 0: each column, 1: each row
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(a), reduction_indices=[1]))  # 损失函数为交叉熵
optimizer = tf.train.GradientDescentOptimizer(0.5)  # 梯度下降法,学习速率为0.5
train = optimizer.minimize(cross_entropy)  # 训练目标:最小化损失函数

# Test trained model
# argmax(input, axis=None, name=None, dimension=None)
# function: return maximum value of a tensor on row or column
# axis is opposite to dimension: axis=0 means dimension=1
# equal(x, y, name=None)
# function: return boolean value of two tensors
# cast(x, dtype, name=None):
# function: Casts a tensor to a new type.
correct_prediction = tf.equal(tf.argmax(a, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# Train
sess = tf.InteractiveSession()      # 建立交互式会话
tf.initialize_all_variables().run()
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
train.run({x: batch_xs, y: batch_ys})
print(sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels}))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: