01深度学习tensorflow

一.深度学习

  深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI, Artificial Intelligence)。

  深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字,图像和声音等数据的解释有很大的帮助。它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。 深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远超过先前相关技术。(FROM某度)

二.Tensorflow

1.简介

       深度学习需要用到的一个很重要的框架。

l  全面的深度学习框架

l  支持非常全面

l  不是专门为客户端设计

 

2.特点

1、真正的可移植性

引入各种计算设备的支持包括CPU/GPU/TPU,以及能够很好地运行在移动端,

如安卓设备、ios、树莓派等等

2、多语言支持

Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和

执行你的graphs,你可以直接写python/c++程序。

3、高度的灵活性与效率

TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库

能够灵活进行组装图,执行图。随着开发的进展,Tensorflow的效率不算在提高

4、支持
TensorFlow 由谷歌提供支持,谷歌投入了大量精力开发 TensorFlow,它希望

TensorFlow 成为机器学习研究人员和开发人员的通用语言

三.图

图默认已经注册,一组表示 tf.Operation计算单位的对象和tf.Tensor表示操作之间流动数据单元的对象

获取调用:

l  tf.get_default_graph()

l  op、sess或者tensor 的graph属性

 

 

 

图的创建

tf.Graph()

使用新创建的图

       g = tf.Graph()

       with g.as_default():

               a = tf.constant(1.0)

               assert c.graph is g

四.会话

  • tf.Session()

运行TensorFlow操作图的类,使用默认注册的图(可以指定运行图)

  • 会话资源

会话可能拥有很多资源,如 tf.Variable,tf.QueueBase

和tf.ReaderBase,会话结束后需要进行资源释放

  1. sess = tf.Session()     sess.run(...)      sess.close()
  2. 使用上下文管理器

with tf.Session() as sess:

       sess.run(...)

  • config=tf.ConfigProto(log_device_placement=True)
  • 交互式:tf.InteractiveSession()

run()

 

关闭警告

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

五.张量

1.简介

  • Tensorflow基本的数据格式
  • 一个类型化的N维度数组(tf.Tensor)
  • 三部分,名字,形状,数据类型

2.张量的阶

 

3.张量的数据类型

 

4.张量属性

  • graph       张量所属的默认图
  • op            张量的操作名
  • name       张量的字符串描述
  • shape      张量形状

5.静态张量与动态张量

TensorFlow中,张量具有静态形状和动态形状

1)静态形状:

创建一个张量或者由操作推导出一个张量时,初始状态的形状

  • tf.Tensor.get_shape:获取静态形状
  • tf.Tensor.set_shape():更新Tensor对象的静态形状,通常用于在不能直接推断的情况下

2)动态形状:

一种描述原始张量在执行过程中的一种形状

tf.reshape:创建一个具有不同动态形状的新张量

3)要点

l  转换静态形状的时候,1-D到1-D,2-D到2-D,不能跨阶数改变形状

l  对于已经固定或者设置静态形状的张量/变量,不能再次设置静态形状

l  tf.reshape()动态创建新张量时,元素个数不能不匹配、

4)生成张量

 

5)生成随机张量

 

6)张量变换

 

 

 

切片与扩展:tf.concat(values, axis, name='concat')

六.变量

1.定义

  变量也是一种OP,是一种特殊的张量,能够进行存储持久化,它的值就是张量

2.创建

tf.Variable(initial_value=None,name=None)

  • 创建一个带值initial_value的新变量
  • assign(value)为变量分配一个新值

返回新值

  • eval(session=None)

计算并返回此变量的值

  • name属性表示变量名字

3.初始化

tf.global_variables_initializer()

添加一个初始化所有变量的op

在会话中开启

七.tensorboard

1.实现步骤

 

2.增加变量显示

目的:观察模型的参数、损失值等变量值的变化

1)收集变量

  • tf.summary.scalar(name=’’,tensor) 收集对于损失函数和准确率

等单值变量,name为变量的名字,tensor为值

  • tf.summary.histogram(name=‘’,tensor) 收集高维度的变量参数
  • tf.summary.image(name=‘’,tensor) 收集输入的图片张量能显示图片

2)合并变量写入事件文件

  • merged = tf.summary.merge_all()
  • 运行合并:summary = sess.run(merged),每次迭代都需运行
  • 添加:FileWriter.add_summary(summary,i),i表示第几次的值

八.tensorflow API

1.矩阵运算  tf.matmul(x, w)

2.平方  tf.square(error)

3.均值  tf.reduce_mean(error)

4.梯度下降API        tf.train.GradientDescentOptimizer(learning_rate)

       learning_rate:学习率

method

return:梯度下降op

5.变量作用域

  • tf.variable_scope(<scope_name>)创建指定名字的

作用:让模型代码更清晰

九.模型保存和加载

  • tf.train.Saver(var_list=None,max_to_keep=5)
    • var_list:指定将要保存和还原的变量。它可以作为一个dict或一个列表传递.
    • max_to_keep:指示要保留的最近检查点文件的最大数量。

创建新文件时,会删除较旧的文件。如果无或0,则保留所有检查点文件。默认为5(即保留最新的5个检查点文件。)

  • 例如:saver.save(sess, '/tmp/ckpt/test/model')
    • saver.restore(sess, '/tmp/ckpt/test/model')
  • 保存文件格式:checkpoint文件

十.自定义命令行参数

 

十一.实例:线性回归

# 第一个参数:名字,默认值,说明
tf.app.flags.DEFINE_integer("max_step", 100, "模型训练的步数")
tf.app.flags.DEFINE_string("model_dir", " ", "模型文件的加载的路径")

# 定义获取命令行参数名字
FLAGS = tf.app.flags.FLAGS


def myregression():
    """
    自实现一个线性回归预测
    :return: None
    """
    with tf.variable_scope("data"):
        # 1、准备数据,x 特征值 [100, 1]   y 目标值[100]
        x = tf.random_normal([100, 1], mean=1.75, stddev=0.5, name="x_data")

        # 矩阵相乘必须是二维的
        y_true = tf.matmul(x, [[0.7]]) + 0.8

    with tf.variable_scope("model"):
        # 2、建立线性回归模型 1个特征,1个权重, 一个偏置 y = x w + b
        # 随机给一个权重和偏置的值,让他去计算损失,然后再当前状态下优化
        # 用变量定义才能优化
        # trainable参数:指定这个变量能跟着梯度下降一起优化
        weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="w")
        bias = tf.Variable(0.0, name="b")

        y_predict = tf.matmul(x, weight) + bias

    with tf.variable_scope("loss"):
        # 3、建立损失函数,均方误差
        loss = tf.reduce_mean(tf.square(y_true - y_predict))

    with tf.variable_scope("optimizer"):
        # 4、梯度下降优化损失 leaning_rate: 0 ~ 1, 2, 3,5, 7, 10
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

    # 1、收集tensor
    tf.summary.scalar("losses", loss)
    tf.summary.histogram("weights", weight)

    # 定义合并tensor的op
    merged = tf.summary.merge_all()

    # 定义一个初始化变量的op
    init_op = tf.global_variables_initializer()

    # 定义一个保存模型的实例
    saver = tf.train.Saver()

    # 通过会话运行程序
    with tf.Session() as sess:
        # 初始化变量
        sess.run(init_op)

        # 打印随机最先初始化的权重和偏置
        print("随机初始化的参数权重为:%f, 偏置为:%f" % (weight.eval(), bias.eval()))

        # 建立事件文件
        filewriter = tf.summary.FileWriter("./tmp/summary/test/", graph=sess.graph)

        # 加载模型,覆盖模型当中随机定义的参数,从上次训练的参数结果开始
        if os.path.exists("./tmp/ckpt/checkpoint"):
            saver.restore(sess, FLAGS.model_dir)

        # 循环训练 运行优化
        for i in range(FLAGS.max_step):

            sess.run(train_op)

            # 运行合并的tensor
            summary = sess.run(merged)

            filewriter.add_summary(summary, i)

            print("第%d次优化的参数权重为:%f, 偏置为:%f" % (i, weight.eval(), bias.eval()))

        saver.save(sess, FLAGS.model_dir)
    return None


if __name__ == "__main__":
    myregression()

 

posted @ 2020-03-16 16:42  菜白小系瓦  阅读(290)  评论(0编辑  收藏  举报