Logistic 回归 简介
Logistic模型


损失函数(交叉熵损失)

softmax多分类

Tensorflow Logistic回归
导入 mnist数据集
1 | import tensorflow as tf |
Extracting ./data/train-images-idx3-ubyte.gz
Extracting ./data/train-labels-idx1-ubyte.gz
Extracting ./data/t10k-images-idx3-ubyte.gz
Extracting ./data/t10k-labels-idx1-ubyte.gz
设置参数
1 | # Parameters |
构建模型
1 | # tf Graph Input |
定义损失函数(交叉熵)
1 | # Minimize error using cross entropy |
补充: reduction_indices参数[1]
在tensorflow的使用中,经常会使用tf.reduce_mean,tf.reduce_sum等函数,在函数中,有一个reduction_indices参数,表示函数的处理维度,直接上图,一目了然:
tf.reduce_sum(x) ==> 如果不指定第二个参数,那么就在所有的元素求和
tf.reduce_sum(x, 0) ==> 指定第二个参数为0,则第一维的元素求和,即每一列求和
tf.reduce_sum(x, 1) ==> 指定第二个参数为1,则第二维的元素求和,即每一行求和
设置优化器(SGD)
1 | # Gradient Descent |
训练
1 | # Initialize the variables (i.e. assign their default value) |
Epoch: 0001 cost= 1.183862086
Epoch: 0002 cost= 0.665185326
Epoch: 0003 cost= 0.552937392
Epoch: 0004 cost= 0.498404927
Epoch: 0005 cost= 0.465865389
Epoch: 0006 cost= 0.442440675
Epoch: 0007 cost= 0.425578112
Epoch: 0008 cost= 0.412035317
Epoch: 0009 cost= 0.401478231
Epoch: 0010 cost= 0.392347213
Epoch: 0011 cost= 0.384493829
Epoch: 0012 cost= 0.377989292
Epoch: 0013 cost= 0.372704204
Epoch: 0014 cost= 0.366971537
Epoch: 0015 cost= 0.362937522
Epoch: 0016 cost= 0.358783882
Epoch: 0017 cost= 0.355023325
Epoch: 0018 cost= 0.351152160
Epoch: 0019 cost= 0.348280402
Epoch: 0020 cost= 0.345466763
Epoch: 0021 cost= 0.342640696
Epoch: 0022 cost= 0.340194521
Epoch: 0023 cost= 0.338306610
Epoch: 0024 cost= 0.335532565
Epoch: 0025 cost= 0.333705268
Optimization Finished!
Accuracy: 0.889
补充 tf.argmax:[2]
简单的说,tf.argmax就是返回最大的那个数值所在的下标。
tf.argmax(array, 1)和tf.argmax(array, 0)的区别看下面的例子:
1
2
3 test = np.array([[1, 2, 3], [2, 3, 4], [5, 4, 3], [8, 7, 2]])
np.argmax(test, 0) #输出:array([3, 3, 1]
np.argmax(test, 1) #输出:array([2, 2, 0, 0]
axis = 0:
你就这么想,0是最大的范围,所有的数组都要进行比较,只是比较的是这些数组相同位置上的数:1
2
3
4
5test[0] = array([1, 2, 3])
test[1] = array([2, 3, 4])
test[2] = array([5, 4, 3])
test[3] = array([8, 7, 2])
# output : [3, 3, 1]axis = 1:
等于1的时候,比较范围缩小了,只会比较每个数组内的数的大小,结果也会根据有几个数组,产生几个结果。1
2
3
4test[0] = array([1, 2, 3]) #2
test[1] = array([2, 3, 4]) #2
test[2] = array([5, 4, 3]) #0
test[3] = array([8, 7, 2]) #0
Tensorflow Eager API Logistic回归
1 | from __future__ import absolute_import, division, print_function |
设置 Eager API
1 | # Set Eager API |
导入数据
1 | # Import MNIST data |
Extracting ./data/train-images-idx3-ubyte.gz
Extracting ./data/train-labels-idx1-ubyte.gz
Extracting ./data/t10k-images-idx3-ubyte.gz
Extracting ./data/t10k-labels-idx1-ubyte.gz
设置变量
1 | # Parameters |
调用 Dataset API 读取数据[3]
Dataset API是TensorFlow 1.3版本中引入的一个新的模块,主要服务于数据读取,构建输入数据的pipeline。
如果想要用到Eager模式,就必须要使用Dataset API来读取数据。
之前有用 placeholder 读取数据,tf.data.Dataset.from_tensor_slices 是另一种方式,其主要作用是切分传入 Tensor 的第一个维度,生成相应的 dataset。以下面的例子为例,是对 mnist.train.images 按batch_size 进行切分。
在Eager模式中,创建Iterator的方式是通过 tfe.Iterator(dataset) 的形式直接创建Iterator并迭代。迭代时可以直接取出值,不需要使用sess.run()。
1 | # Iterator for the dataset |
定义模型(公式+损失函数+准确率计算)
1 | # Variables |
补充: tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None):[4]
- 第一个参数logits:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batchsize,num_classes],单样本的话,大小就是num_classes
- 第二个参数labels:实际的标签,大小同上
执行下面两步操作:
返回值是一个向量,对向量求 tf.reduce_mean,得到loss。
设置优化器(SGD)
1 | # SGD Optimizer |
训练
1 | # Training |
Initial loss= 2.302585363
Step: 0001 loss= 2.302585363 accuracy= 0.1172
Step: 0100 loss= 0.952338576 accuracy= 0.7955
Step: 0200 loss= 0.535867393 accuracy= 0.8712
Step: 0300 loss= 0.485415280 accuracy= 0.8757
Step: 0400 loss= 0.433947176 accuracy= 0.8843
Step: 0500 loss= 0.381990731 accuracy= 0.8971
Step: 0600 loss= 0.394154936 accuracy= 0.8947
Step: 0700 loss= 0.391497582 accuracy= 0.8905
Step: 0800 loss= 0.386373132 accuracy= 0.8945
Step: 0900 loss= 0.332039326 accuracy= 0.9096
Step: 1000 loss= 0.358993709 accuracy= 0.9002
测试
1 | # Evaluate model on the test image set |
Testset Accuracy: 0.9083
参考
[1] tensorflow reduction_indices理解

