TensorFlow实战Google深度学习框架

本文介绍了深度学习的基础概念和TensorFlow的入门,讲解了张量、计算图以及变量的使用。接着深入探讨了神经网络的前向传播、损失函数、反向传播算法和优化策略,包括激活函数、损失函数的选择以及梯度下降法的局限。通过实例展示了如何使用TensorFlow训练神经网络解决MNIST手写数字识别问题,比较了不同模型的表现,并提出了优化方法,如正则化和滑动平均模型,以提高模型性能。
摘要由CSDN通过智能技术生成

深度学习介绍

传统机器学习算法:
输入—>人工特征提取—>权重学习—>预测结果
深度学习算法
输入—>基础特征提取—>多层复杂特征提取—>权重学习—>预测结果
Tensorflow的安装,个人认为比较好的安装教程:
http://www.jianshu.com/p/fd27a586f8c2
tensorflow安装成功的测试样例

import tensorflow as tf;
a=tf.constant([1.0,2.0],name="a");
b=tf.constant([2.0,3.0],name="b");
result=a+b;
sess=tf.Session()
print(sess.run(result))

Tensorflow入门

我用的tensorflow 1.4.0
计算图的概念
tensor:张量,用人话说:多维数组;表明了它的数据结构;
flow:表明了计算模型;直观地表达了张量之间通过计算相互转化的过程;Tensorflow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系;
计算图的使用
Tensorflow一般分为两个阶段:

  1. 定义计算图中所有的计算
  2. 执行计算
    tf在加载过程中会自动地将定义的计算转化为计算图上的节点。在tf程序中,系统会自动维护一个默认的计算图。
    示例:获取默认计算图 tf.get_default_graph() 以及查看一个运算所属的计算图 a.graph
print(a.graph is tf.get_default_graph())   //输出为True

tf支持通过tf.Graph函数来生成新的计算图。不同计算图上的张量和运算都不会共享。
示例:在不同计算图上定义和使用变量

import tensorflow as tf
g1=tf.Graph()
g2=tf.Graph()
with g1.as_default():
    v=tf.get_variable("v1",[1],initializer=tf.zeros_initializer())

with g2.as_default():
    v=tf.get_variable("v2",[1],initializer=tf.ones_initializer())

with tf.Session(graph=g1) as sess:
    tf.global_variables_initializer().run() #初始化全局变量,这是一个坑,已经错过一次了
    with tf.variable_scope("",reuse=True):
        print(sess.run(tf.get_variable("v1")))

with tf.Session(graph=g2) as sess:
    tf.global_variables_initializer().run() #初始化全局变量,这是一个坑,已经错过一次了
    with tf.variable_scope("",reuse=True):
        print(sess.run(tf.get_variable("v2")))

Cannot execute operation using run(): No default session is registered. 初始化全局变量只有在指定会话时才需要使用
tf中的计算图不仅仅可以用来隔离张量和计算,还提供了管理张量和计算的机制

import tensorflow as tf

a=tf.constant([1.0,2.0],name="a");
b=tf.constant([2.0,3.0],name="b");
g=tf.Graph()
with g.device('gpu:0'):
    result=a+b#以上计算定义
    sess=tf.Session()
    print(sess.run(result)) #执行计算

数据模型——张量

张量是tf中管理数据的形式
张量的概念
tf中所有的数据都通过张量的形式来表示的;
从功能上来看:张量就是多维数组;零阶张量表示标量,一个数;第一阶张量为向量,一维数组;第n阶张量为一个n维数组;但是——》张量中没有真正保存数字,它保存的是如何得到这些数字的计算过程。
示例:得到对结果的一个引用

import tensorflow as tf
a=tf.constant([1.0,2.0],name="a");
b=tf.constant([2.0,3.0],name="b");
result=tf.add(a,b,name="add")
print(result)

Tensor(“add:0”, shape=(2,), dtype=float32)
张量中保存了:名字、维度、类型

  • 名字不仅是标量的唯一标识符,同样也给出了这个张量是如何计算出来的;node:src_output中node为节点的名称,src_output为当前张量来自节点的第几个输出;上例中result这个张量是计算节点add输出的第一个结果。
  • 张量的维度描述了一个张量的维度信息, shape=(2,)说明张量是一个一维数组,这个数组的长度为2。
  • 类型,每一个张量会有一个唯一的类型。tf会对所有参与计算的张量进行类型检查,类型不匹配时就会报错。一般建议通过dtype来明确指出变量或者常量的类型。tf支持的数据类型:实数(tf.float32,tf.float64),整数(tf.int8,tf.int16,tf.int32,tf.int64,tf.uint8),布尔型(tf.bool),复数(tf.complex64、tf.complex128)

如果想要得到结果:

import tensorflow as tf
a=tf.constant([1.0,2.0],name="a");
b=tf.constant([2.0,3.0],name="b");
result=tf.add(a,b,name="add")
#方法1
# sess=tf.Session()
# print(sess.run(result))
# sess.close()

# 方法2
# with tf.Session() as sess:
#     print(sess.run(result))

#方法3
sess=tf.Session()
with sess.as_default():
    print(sess.run(result))
    print(result.eval(session=sess))

#方法4
# sess=tf.InteractiveSession()
# print(result.eval())
# sess.close()

张量的使用
张量使用主要可以总结为两大类

  1. 对中间计算结果的引用
    当一个计算包含很多中间结果时,使用张量可以大大提高代码的可读性(类似与java中设置多个变量,不赘述)。同时通过张量来存储中间结果,可以方便获取中间结果。
    在卷积神经网络中,卷积层或者池化层有可能改变张量的维度,通过result.get_shape来获取结果张量的维度信息可以免去人工计算的麻烦;

  2. 计算图构造完成后,张量可以用来获得计算机结果,也就是得到真实的数字。张量本身没有存储具体的数字,但是通过会话就可以得到这些具体的数字。

    tensorflow运行模型——会话
    会话拥有并管理tf程序运行时的所有资源。当所有计算完成后需要关闭会话来帮助系统系统回收资源,否则会出现资源泄露问题。
    tf使用会话有两种模式:

  3. 需要明确调用会话并生成函数和关闭函数
#方法1
sess=tf.Session()
sess.run()
sess.close()

上面这种模式,如果程序发生异常退出时,关闭会话的函数可能不被执行;此时,可以通过python的上下文管理器来使用会话:

# 方法2
with tf.Session() as sess:
    sess.run()
    #把所有的计算都放在with内部。上下文管理器退出时会自动释放所有资源

如前所述,tf会自动生成一个默认的计算图,但如果没有特殊指定,运算会自动加入这个到这个计算图中;
tf的会话也有类似的机制,但tf不会自动生成默认的对话,需要手动指定。默认的对话被指定后可以tf.Tensor.eval来计算一个张量的取值。
示例:通过设定默认会话计算张量的取值

#方法3
sess=tf.Session()
with sess.as_default():
    print(sess.run(result))
    #print(result.eval(session=sess))

交互式环境下,通过设置默认会话的方式来获取张量的取值更加方便。所以tf提供了一种在交互式环境下直接构建默认会话的函数——tf.InteractiveSession().这个函数会自动将生成的会话注册为默认会话

#方法4
sess=tf.InteractiveSession()
print(result.eval())
sess.close()

tf实现神经网络
介绍神经网络的主要功能以及计算流程,前向传播算法及其代码实现,通过tf中的参数表达神经网络中的参数,神经网络方向传播算法及原理,tf对反向传播算法的支持,一个完整的神经网络的例子;
tf游乐场及神经网络介绍
http://playground.tensorflow.org
特征提取(把实际问题变成平面上的一个点)。
在机器学习中,用于描述实体的数字的组合就是一个实体的特征向量,特征向量是神经网络的输入。
目前的主流神经网络都是分层的结构;第一层是输入层,代表特征向量中每一个特征的取值。每一层只和下一层连接,直到最后一层作为输出层得到计算结果;
输入层和输出层之间称为隐藏层;隐藏层的每一层有节点数,此外,还有学习率、激活函数、正则化都与学习效果密切相关。
使用神经网络解决分类问题的4个步骤:

  1. 提取问题中实体的特征向量作为神经网络的输入,不同实体可以提取不同的特征向量;
  2. 前向传播算法:定义神经网络的结构,并定义如何从神经网络的输入得到输出;
  3. 通过训练数据来调整神经网络中参数的取值,即训练神经网络。 后面会介绍表示神经网络参数的方法,神经网络优化算法的框架,如何通过tf实现这个框架;
  4. 使用训练好的神经网络来预测未知的数据。

前向传播算法简介
神经网络最后的输出是通过前向传播算法得到最后的输出的;
不同的神经网络结构前向传播的方式也不一样,本节介绍最简单的全连接网络结构的前向传播算法。
一个最简单的神经元结构:
这里写图片描述

一个神经元有多个输入和一个输出/没个神经元既可以是其他神经元的输出,也可以是整个神经网络的输入。神经网络的结构就是不同神经元之间的连接结构。
神经网络的优化过程就是优化神经元中参数取值的过程。
图3-5:三层全连接神经网络:相邻两层之间任意两个节点之间都有连接
这里写图片描述
上图中除了输入层之外的所有节点都代表了一个神经元的结构

计算神经网络的前向传播结果需要三部分信息:

  1. 神经网络的输入,即从实体中提取出的特征向量;
  2. 神经网络的连接结构。神经网络是由神经元构成的,神经网络的结构给出不同神经元之间输入输出的关系。后面把神经元统称为节点;
  3. 每个节点的参数
    给定神经网络的输入,神经网络的结构以及边上权重,就可以通过前向传播算法来计算出神经网络的输出。
    【小tip】
    tf中的矩阵乘法:
a=tf.matual(x,w1)

示例:tf实现三层全连接神经网络

import tensorflow as tf

#定义变量
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
# w1:[[-0.81131822  1.48459876  0.065329
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值