Machine Learning

Tensorflow 对数几率回归

Submitted by Lizhe on Tue, 08/22/2017 - 13:47

线性回归模型所预测的是一个连续值或任意实数

对数几率回归则用于预测 Y/N 

f(x) = 1/(1+e-x)

log

随着x值(横轴)的变化, y值(纵轴)会在0~1 这个区间内变化, 这里1表示Y, 0表示位N 

这个函数接收单个输入值所以这里如果我们需要使用多个输入值的话,需要将多个值合并成单个值使用

例如如果数据中是 

姓名    年龄    性别

Tom    20       Male

可能需要合并成 Tom_20_Male之后才能放入上面的公式参与计算

这里的例子是计算泰坦尼克的乘客的幸存概率,原始数据为

Tensorflow 线性回归

Submitted by Lizhe on Fri, 08/18/2017 - 11:31

在有监督学习问题中, 线性回归是一种最简单的建模手段.

给定一个数据点集合作为训练集, 线性回归的目标是找到一个与这些数据最为吻合的线性函数.

y(x1,x2,x3,...,xk) = w1x1+w2x2+w3x3+...+wkxk+b

Y 为待预测值

X 是一组独立的预测变量

w 为权值 (可学习)

b 为偏移量 (可学习)

上面的公式用代码表示应该是

Tensorflow 有监督学习

Submitted by Lizhe on Fri, 08/18/2017 - 09:20

有监督的学习在于

使用某个带标注信息的输入数据集合(其中的每个样本都标注了真是的或者期望的输出), 去训练一个推断模型,

该模型能够覆盖一个数据集, 并可对不存在于初始训练集合中的新样本的输出进行干预

这个推断模型实际上是一系列的数学运算, 运算使用的公式是固定的,但是参与运算的值 都是模型的参数, 在训练过程中会被不断更新, 以使模型能够学习,并对其输出进行调整

462

首先需要对模型参数进行初始化. 通常采用对参数随机赋值的方法, 但对于比较简单的模型,也可以将各个参数的初始值全部设置为0

读取训练数据(包括每个数据样本及其期望输出). 通常人们会在这些数据送入模型之前随机打乱样本的次序

在训练数据上执行推断模型. 这样, 在当前模型的参数配置下, 每个训练样本都会得到一个输出值

Tensorflow Summary

Submitted by Lizhe on Thu, 08/17/2017 - 17:27

直接上例子

import tensorflow as tf

data = tf.Variable(0, trainable=False)
increment_data = tf.assign_add(data, tf.constant(1))
tf.scalar_summary('increment_data', data)

sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)

summary_writer = tf.train.SummaryWriter('./my_graph', sess.graph)

Tensorflow Name Scope

Submitted by Lizhe on Thu, 08/17/2017 - 16:50

Name scope 是TensorFlow数据流图的核心构件.

当节点过多时, 我们需要一种机制可以有效的组织节点, 降低图的复杂性

Name scope可以帮助用户组织流程图

Name scope允许用户将Op划分到一些较大的, 可以命名的语句块中, 当使用TensorBoard加载数据流图时,

每个名称的作用域都将对其自己的Op进行封装, 从而得到更好的可视化效果

看下面的例子

Tensorflow Variable

Submitted by Lizhe on Thu, 08/17/2017 - 11:51

Tensor对象和Operation对象都是不可变的,如果需要可变对象需要使用Variable对象

a=tf.Variable(3, name="my_variable")

variable对象可以代替Tensor对象传入Tensorflow函数或Operation中使用

例如

add = tf.add(a, 5)

variable对象的初始值通常是0,1或者随机数填充的阶数较高的张量,不过可以使用辅助Op来初始化特定的值

tf.zeros()

Tensorflow placeholder

Submitted by Lizhe on Thu, 08/17/2017 - 10:45

tf.placeholder 可以创建一个占位符用来等待feed_dict为其提供数据

import tensorflow as tf
a=tf.placeholder(tf.float32)
b=tf.placeholder(tf.float32)
c=tf.add(a,b)

with tf.Session() as sess:
    print(sess.run(c,feed_dict={a:10,b:30}))
 

 

使用tf.placeholder() 时 dtype 参数是必须指定的, shape可选默认是None,接收任意类型

不能直接将placeholder的值(上面代码中的a和b) 传入session.run(), 这些值是无法进行计算的,直接传入run方法会触发一个异常

例如将上面例子中run方法的第一个参数改成a

Tensorflow Session

Submitted by Lizhe on Thu, 08/17/2017 - 09:53

tf.Session() 接收3个可选参数

target 该参数用于在分布式设置中指定连接不同的tf.train.Server实例, 一般来说默认是空字符串

graph 参数指定了将要在Session对象中加载的Session对象, 默认值是None, 表示使用当前默认的数据流

config 参数允许用户指定配置, 如cpu或gpu内核数

 

一旦创建了Session对象之后, 就可以使用session.run()方法来计算Tensor对象的输出

run方法接收一个参数fetches 以及 3个可选参数 feed_dict, options 和 run_metadata

fetches参数接收任意的数据流图元素 ( Operation 和 Tensor) , 如果是Tensor对象, run会输出一个NumPy数组, 如果是Operation则输出None

feed_dict参数用于覆盖数据流图中的Tensor对象的原始值, 它接收一个字典参数, key为要覆盖值的句柄, 值类型必需与原类型相同或者可以相互转换

下面的例子输出6 而不是 3

Tensorflow Graph

Submitted by Lizhe on Wed, 08/16/2017 - 18:08

要创建Graph对象需要使用下面的语句

g1 = tf.Graph()
g2 = tf.Graph()

然后使用来使用这个g1对象的上下文

with g1.as_default():

    ....

不过你可能会奇怪为什么之前我们没有创建过这个对象

当TensorFlow库被加载时, 它会自动创建一个Graph对象,并将其作为默认的数据流图

因此, 在Graph.as_default() 上下文管理器 (例如 g1.as_default())之外定义的任何Op和Tensor对象都会自动被放置在这个默认的Graph中

Tensorflow 张量

Submitted by Lizhe on Wed, 08/16/2017 - 16:09

张量是n维矩阵的抽象

简单来说, 1D张量也就是一个向量, 2D张量是一个矩阵

之前的例子中我们使用了两个参数, 分别是5和3

如果将两个参数合并成一个1D张量

import tensorflow as tf

sess = tf.Session()

a = tf.constant([5,3],name="user_input_2")
b = tf.reduce_prod(a, name="mul_op")
c = tf.reduce_sum(a, name="add_op")
d = tf.add(b,c, name="sum_op")
print(d)
print(sess.run(d))
writer = tf.train.SummaryWriter('./my_graph3',sess.graph)