【LRY】Tf 学习笔记总结


#1

2017年11月2日,开始做个自律的人,学习每一天,成长每一天。:smile_cat:fighting~~~~


#2

[Week1 理论学习任务]

1、机器学习中,监督学习 or 非监督学习概念区分,应用场景调研?

**监督学习:**通过已有的训练样本进行训练(该样本既含有数据也有数据对应的结果),训练得到一个最优模型也可以看做一个函数,然后利用这个模型,将所有新的输入映射为相应的输出。监督学习可分为“回归”和“分类”问题。在回归问题中,我们会预测一个连续值。也就是说我们试图将输入变量和输出用一个连续函数对应起来;而在分类问题中,我们会预测一个离散值,我们试图将输入变量与离散的类别对应起来。

**非监督学习:**同样给了数据,但是这些数据没有对应的结果,需要直接对数据进行分析建模。我们可以通过聚类的方式从数据中提取一个特殊的结构。在无监督学习中给定的数据是和监督学习中给定的数据是不一样的。在无监督学习中给定的数据没有任何标签或者说只有同一种标签。

**半监督学习:**因为实际问题中,很难获取到大量有标签的数据,所以形成一种监督学习与无监督学习相结合的学习方法,即半监督学习,它有两个样本集,一个有标记,一个没有标记。

2、做机器学习项目,有哪些环节?

答:

1、 理解实际问题,抽象为机器学习能处理的数学问题,明确可以获得哪些数据,明确目标是分类、回归还是聚类。

2、获取数据:包括获取原始数据以及从原始数据中经过特征工程从原始数据中提取训练、测试数据。 数据决定机器学习结果的上限,而算法只是尽可能的逼近这个上限,数据要具有“代表性”。还要对评估数据的量级,样本数量、特征数量,估算训练模型对内存的消耗。如果数据量太大可以考虑减少训练样本、降维或者使用分布式机器学习系统。

3、特征工程:包括从原始数据中特征构建、特征提取、特征选择。

4、模型训练、诊断、调优:模型诊断中至关重要的是判断过拟合、欠拟合;诊断后的模型需要进行进一步调优,调优后的新模型需要重新诊断,这是一个反复迭代不断逼近的过程。

5、模型验证、误差分析:通过测试数据,验证模型的有效性,观察误差样本,分析误差产生的原因;误差分析主要是分析出误差来源与数据、特征、算法。

6、模型融合:根据实际问题,训练出多个功能强大学习器,为了进一步提高学习器的能力,可以尝试将这些学习组合起来。

3、深度学习,目前有哪些应用领域?

计算机视觉、语音识别、自然语言处理等领域。

4、数据预处理,需要注意哪些?

数据预处理有四个任务,数据清洗、数据集成、数据变换和数据规约。

  1. 数据清洗包括缺失值处理和异常值处理。

  2. 数据集成将多个数据源放在一个统一的数据仓库中。

  3. 数据变换对数据进行规范化处理。

  4. 数据规约降低无效,错误数据对建模的影响,提高建模的准确性。

5、tensorflow运行原理,架构有哪些核心点?

运行原理:使用数据流图来进行数值计算。图中每个节点表示一次数学运算,每条边表示运算之间的依赖关系,负责传输多维数据。

架构核心点:Tensorflow的系统以c API为界,将系统分为前端和后端两个子系统。前端系统提供多语言编程环境,提供统一的编程模型支撑用户构造计算图。通过Session的形式,连接后端的运行时,启动计算图的执行过程。后端系统:提供运行时环境,负责执行运算图。Tensorflow使用Tensor数据结构来表示数据,计算图中操作间传递的都是tensor。Tensorflow使用计算图来表示计算任务,操作时分为构建和运行计算图两步。tensorflow通过变量输入数据,维护状态。

6、学习中知识点的收获记录

之前未接触过tensorflow,对机器学习、深度学习的了解大多都是理论方面,现在开始学习Tensorflow官方文档。


#3

【Week1 实践任务】

1题: 答案:13.0

2题:

答案:[[12.]]


#4

Iry,您好,您可以把代码贴出来,我帮您调整。:wink:


#5

咦,我贴了图片?不行么?:frowning:


#6

咦,我贴了图片,不可以吗:frowning:


#7

可以的,只是贴代码可以显得更美观。:grin:


#8

好滴好滴,谢谢:blush:


#9

【Week2 动手任务1】

# 使⽤tf实现Logistic Regression算法

# -*- coding: utf-8 -*-
"""
Created on Wed Nov 22 21:38:07 2017

@author: SydneyL
"""
#导入数据
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data/',one_hot=True)

import tensorflow as tf

#占位符,计算时接收输入值
#图像,28x28
x = tf.placeholder(tf.float32,[None,784])
#图像分类,10类
y_ = tf.placeholder("float",[None,10])

#两个变量,权重和偏置
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

#设置参数
learning_rate = 0.01
training_epochs = 200
batch_size = 50
step = 1

#计算输出y(用softmax),sigmoid用于二分类
y = tf.nn.softmax(tf.matmul(x,W) + b)

#优化
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=1))
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)

#初始化变量
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(training_epochs):
        avg_loss = 0.
        total_loss = 0.
        total_batch = int(mnist.train.num_examples/batch_size)
        for i in range(total_batch):
            batch = mnist.train.next_batch(batch_size)
            S,loss = sess.run([train_step,cross_entropy],feed_dict={x:batch[0],y_:batch[1]})
            total_loss += loss 
            
        avg_loss = total_loss / total_batch
        #打印每轮的损失
        if (epoch+1) % step == 0:
            print ("epoch:", '%04d' %(epoch+1), "loss=", "{:.9f}".format(avg_loss))
    print("Training is over!")
    #评估模型
    #tf.argmax给出某个tensor对象在某一维上的其数据最大值所在的索引值。
    #tf.equal检测我们的预测是否真实标签匹配(索引位置一样表示匹配)
    #返回一组布尔值,
    correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
    #计算所学习到的模型在测试数据集上面的正确率
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))
    
    print ("Accuracy:",accuracy.eval(feed_dict={x:mnist.test.images,y_:mnist.test.labels}))

结果:


#10

【Week2 理论学习】

1、back propagation算法原理理解

参考: (http://blog.csdn.net/mao_xiao_feng/article/details/53048213) BP算法执行时,即把误差信号按原来正向传播的通路反向传回,并对每个隐层的各个神经元的权系数进行修改,以望误差信号趋向最小。该算法最主要一点就是链式法则的运用。

2、sigmoid函数、tanh函数和ReLu函数的区别?以及各自的优缺点?对应的tf函数是?

对应的tf函数: tf.nn.relu() tf.nn.sigmoid() tf.nn.tanh()


3、softmax和cross_entropy原理解释?

softmax: 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的Softmax值就是 神经网络分类应用: 一个很搞笑的总结: SVM只选择自己喜欢的男神,softmax把所有备胎全部拉出来评分,最后还归一化一下。

cross entropy: 描述连个分布的接近程度,若两分布一模一样则结果为0: 下式p(x)和q(x)分别为针对同一数据集合X的不同分布 在神经网络中,假设神经元输出为a,则这个神经元的交叉熵代价函数为: 这用来评估预测结果和实际值之间的差异程度,相较于常见的Loss函数就是均方误差分类效果更好。很多模型中,softmax 和 cross-entropy 是不分家的,在 tensorflow 中,有一个方法就叫softmax_cross_entropy_with_logits,意思就是对 logits 先 softmax,后 cross-entropy。所谓 logits 就是指还没有被概率化的输出。


4、tf.placeholder()、tf.constant()、tf.Variable()的区别?

tf.placeholder():placeholder是TensorFlow的占位符节点,由placeholder方法创建,其也是一种常量,但是由用户在调用run方法是传递的,也可以将placeholder理解为一种形参。即其不像constant那样直接可以使用,需要用户传递常数值。 tf.constant():constant是TensorFlow的常量节点,通过constant方法创建,其是计算图(Computational Graph)中的起始节点,是传入数据。 tf.Variable():Vatiable是tensorflow的变量节点,通过Variable(注:V大写)方法创建,并且需要传递初始值。在使用前需要通过tensorflow的初始化方法进行初始化。


5、举例说明:tf.Graph()概念理解?

tensorflow中的计算以图数据流的方式表示,一个图包含一系列表示计算单元的操作对象,以及在图中流动的数据单元以tensor对象表现,所以 tf.Graph 类中包含一系列表示计算的操作对象( tf.Operation),以及在操作之间流动的数据—张量对象( tf.Tensor)。


6、tf.name_scope()和tf.variable_scope()的理解?

在 TensorFlow 中有两个作用域( scope),一个是 name_scope,另一个是 variable_scope。

1、tf.name_scope():Graph中保存着一个属性_name_stack(string类型),_name_stack的值保存着当前的name_scope的名字,在这个图中创建的对象Variable、Operation、Tensor的名字之前都加上了这个前缀。它的主要目的是为了更加方便地管理参数命名。与 tf.Variable() 结合使用,简化了命名。

2、 tf.variable_scope:Graph中维护一个collection,这个collection中的 键_VARSCOPE_KEY对应一个 [current_variable_scope_obj],保存着当前的variable_scope。使用 get_variable() 创建变量的时候,就从这个collection 取出 current_variable_scope_obj,通过这个 variable_scope创建变量。

3、对比:

name_scope是给Op_name加前缀的,variable_scope是给变量variable_name和Op_name加前缀的.作用域在使用Tensorboard对Graph对象进行可视化的时候很有帮助,作用域会把一些Op划分到较大的语句块当中.使用tensorboard可视化数据流图的时候,每个作用域都对自己的Op进行封装,从而获得更好的可视化效果.

1、使用tf.Variable()的时候,tf.name_scope()和tf.variable_scope() 都会给 Variable 和 op 的 name属性加上前缀。2、使用tf.get_variable()的时候,tf.name_scope()就不会给 tf.get_variable()创建出来的Variable加前缀。

tf.get_variable() 创建的变量,name 属性值不可以相同;tf.Variable() 创建变量时,name 属性值允许重复(底层实现时,会自动引入别名机制) 此外 tf.get_variable() 与 tf.Variable() 相比,多了一个 initilizer (初始化子)可选参数;

tf.Variable() 对应地多了一个 initial_value 关键字参数,也即对于 tf.Variable 创建变量的方式,必须显式初始化;


7、tf.variable_scope()和tf.get_variable()的理解?

tf.variable_scope() 主要结合 tf.get_variable() 来使用,实现变量共享。如果tf.variable_scope函数使用参数reuse=None或者reuse=False创建上下文管理器,则tf.get_variable函数可以创建新的变量。但不可以创建已经存在的变量即为同名的变量。如果tf.variable_scope函数使用参数reuse=True创建上下文管理器,则tf.get_variable函数可以使用已在当前空间定义的变量赋值来创建变量。但不可以使用不存在的变量来创建。


8、tf.global_variables_initialize()什么时候使用?

在运行计算之前,需要先初始化创建的变量


9、学习中收获的知识点

a、tf.InteractiveSession 、tf.Session、tf.get_default_session 。

Tensorflow依赖于一个高效的C++后端来进行计算。与后端的这个连接叫做session。一般而言,使用TensorFlow程序的流程是先创建一个图,然后在session中启动它。启动图的第一步是创建一个 Session 对象。会话( session)提供在图中执行操作的一些方法。

InteractiveSession类更加方便,通过它,你可以更加灵活地构建你的代码。它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的。这对于工作在交互式环境中的人们来说非常便利,比如使用IPython。如果你没有使用InteractiveSession,那么你需要在启动session之前构建整个计算图,然后启动该计算图。tf.get_default_session() 返回当前线程的默认会话


b、混淆logistic、softmax、sigmoid。

logistic函数1516538765(1)

此图中μ=0, r=1

函数性质 : 关于(μ,0.5)中心对称 值域∈[0,1] 在x->∞时,梯度变化缓慢(为什么后来神经网络的激活函数不再使用它的原因,后续博文详细介绍)

sigmoid函数:是logistic函数的特殊情况,即μ=0,γ=1 。

导函数:
图像:与logistic函数图像相同

二项逻辑回归(解决二分类问题):用到的非线性变换函数是sigmoid函数 分类模型(记sigmoid函数为θ):

在给定的输入x下,上述两式分别求得Y=1和Y=0的概率,比较这两个概率值的大小, 将x分类到概率值大的那一类。(线性回归+sigmoid函数=二项逻辑回归)

softmax函数: softmax函数形式如下: softmax将一个k维向量映射到区间[0,1]的k维向量。

多项逻辑回归:用到的非线性变换函数是softmax函数 softmax回归其实是逻辑回归的一般化形式,是二项逻辑回归的扩展,多项逻辑回归即softmax回归,用来处理多分类问题。 X属于第j类的概率表示为: 具体的对于一个输入x,经过线性回归+softmax非线性转换将x映射到[0,1]区间的K个概率值,哪个概率大大就是哪个。其实多项逻辑回归就是K个线性分类器再加上Softmax函数的非线性转换,最终映射到[0,1]区间的概率值,哪一个线性分类器对应的概率值大,输入就属于该分类!