机器学习——Tensorflow基础-5


1、深度学习介绍

2、认识Tensorflow

3、Tensorflow的安装

4、Tensorflow初体验

5、Tensorflow进阶

6、案例:实现线性回归
·在这里插入图片描述
在这里插入图片描述

认识Tensorflow

在这里插入图片描述

Tensorflow特点

1、真正的可移植性
引入各种计算设备的支持包括CPU/GPU/TPU,以及能够很好地运行在移动端,
如安卓设备、ios、树莓派等等

2、多语言支持
Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和
执行你的graphs,你可以直接写python/c++程序。

3、高度的灵活性与效率
TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库
能够灵活进行组装图,执行图。随着开发的进展,Tensorflow的效率不算在提高

4、支持
TensorFlow 由谷歌提供支持,谷歌投入了大量精力开发 TensorFlow,它希望
TensorFlow 成为机器学习研究人员和开发人员的通用语言

对比

在这里插入图片描述
深度学习一般用gpu,专⻔为图形计算设计的 ,用数量战胜质量,⼩学⽣*10000
cpu: 运⾏操作系统,处理业务 计算能⼒不是特别突出 ,算力类似⼀个⾼中⽣

想调用gpu计算,⾮常简单:只需要⼀⾏代码,可以指定cpu还是gpu参与运算

Tensorflow加法运算

在这里插入图片描述

Tensorflow进阶

1、图
2、会话
3、张量
4、变量
5、模型保存和加载
6、自定义命令行参数

Tensorflow一些基本的定义

tensor: 张量 就是数据流
operation:(op): 专⻔运算的操作节点 所有操作都是⼀个op
图:graph:你的整个程序的结构
比如上面的加法运算,两个数据流入一个加法操作节点,然后执行这个节点

对于框架有两种定义,

计算密集型IO密集型
tensorflowdjango,scrapy
cpu计算2http请求磁盘操作等等

图默认已经注册,一组表示 tf.Operation计算单位的对象和tf.Tensor表示操作之间流动的数据单元的对象
获取调用:
tf.get_default_graph()
op、sess或者tensor 的graph属性

参与此图运算的操作对象和数据流对象的图是相同的
图本身是一个对象,打印可以得到地址
如代码所示,他们的地址相同

import tensorflow as tf
a=tf.constant(2)
b=tf.constant(2)
sum=tf.add(a,b)
graph=tf.get_default_graph()
print(graph)
with tf.Session() as sess:
    print(sess.run(sum))
    print(a.graph)
    print(b.graph)
    print(sum.graph)
    print(sess.graph)

在这里插入图片描述

哪些是op

只要使用tf定义的都是op
tf.constant
tf.Session
tf.get_deafult_graph
张量就是里面的数据
在这里插入图片描述

图的创建

tf.Graph()

使用新创建的图

g = tf.Graph()
with g.as_default():
    a = tf.constant(1.0)
    print(a.graph)

在这里插入图片描述

tensorflow使用的是上下环境,图与图隔离,地址不同

会话

tensorflow有两个层面,
前端系统负责设计图的结构
后端系统负责具体执行
会话就是资源管理者和执行者,位置在后端
即无论图的结构如何设计,最后都会用with tf.Session()执行,执行后默认关闭
也可以用tfs=tf.Session(),tfs.run(),tf.close方式执行,但是太麻烦
会话:
1、运⾏图的结构
2、分配资源计算
3、掌握资源(变量的资源, 队列,线程)
sess.run() 启动整个图
只能运行一个图,想要运行其他图的资源是没有的

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

tf.Session(graph=aaa)

执行的资源当然是是图aaa的资源,
需要注意的是变量覆盖问题
假如将c改成a,后面有a变量,就会覆盖图g的变量a,那么后面执行就会因为执行其他图的资源而报错
在这里插入图片描述


会话资源
会话可能拥有很多资源,如 tf.Variable,tf.QueueBase和tf.ReaderBase,会话结束后需要进行资源释放

sess = tf.Session() sess.run(…) sess.close()
使用上下文管理器
with tf.Session() as sess:
 sess.run(…)

config=tf.ConfigProto(log_device_placement=True)
写在Session的属性里,tff.Session(config=tf.ConfigProto(log_device_placement=True))
用于打印执行设备的信息以及具体数据流是如何被分配的
在这里插入图片描述

交互式:tf.InteractiveSession()
一般在命令行中使用
用了它以后相当于with tf.Session 等等,以及sess.run都可以省略了
可以直接a.eval()打印出值,变的简洁

当然with tf.Session的方式也可以用eval()

print(c.eval())

会话的run()方法

run(fetches, feed_dict=None,graph=None)
 运行ops和计算tensor
不是op不能运行
print(sess.run(2))是错误的
但是可以重载
a=1+tf.constant(2)是允许的,a自动重载为tensor

print(sess.run(2+tf.constant(2)))

相加后结果为tensor类型
在这里插入图片描述
嵌套列表,元组,namedtuple,dict或OrderedDict(重载的运算符也能运行)

feed_dict 允许调用者覆盖图中指定张量的值,提供给placeholder使用
placeholder有三个值,第一个type类型,第二个形状shape,第三个name名字
用于值占位,训练时可以循环覆盖值进行运算
此处placehoder约定了2行3列的数据格式

pl=tf.placeholder(tf.float32,[2,3])
with tf.Session() as sess:
    print(sess.run(pl, feed_dict={pl: [[1, 2, 3], [2, 3, 4]]}))

在这里插入图片描述
但是可以不指定具体有多少列
使用【None,x】代替,这样行数随意

返回值异常
 RuntimeError:如果它Session处于无效状态(例如已关闭)。
 TypeError:如果fetches或feed_dict键是不合适的类型。
ValueError:如果fetches或feed_dict键无效或引用 Tensor不存在。

Tensorflow Feed操作

意义:在程序执行的时候,不确定输入的是什么,提前“占个坑”

在这里插入图片描述

语法:placeholder提供占位符,run时候通过feed_dict指定参数

张量

1、张量的阶和数据类型

2、张量操作

关闭警告

import os
os.environ[‘TF_CPP_MIN_LOG_LEVEL’]=‘2’

张量的阶和数据类型

Tensorflow基本的数据格式

一个类型化的N维度数组(tf.Tensor)

三部分,名字,形状,数据类型

张量的阶

在这里插入图片描述

张量的数据类型

在这里插入图片描述

张量属性

graph 张量所属的默认图

op 张量的操作名

name 张量的字符串描述

shape 张量形状

 print(a.graph)
    print("-"*20)
    print(pl.shape)
    print("-" * 20)
    print(a.shape)
    print("-" * 20)
    print(a.name)
    print("-" * 20)
    print(a.op)

在这里插入图片描述
打印出来的形状
tensorflow:打印出来的形状表示
0维:() 1维:(5) 2维:(5,6) 3维:(2,3,4)

张量的动态形状与静态形状

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

静态形状:
创建一个张量或者由操作推导出一个张量时,初始状态的形状
tf.Tensor.get_shape:获取静态形状
tf.Tensor.set_shape():更新Tensor对象的静态形状,通常用于在不能直接推断的情况下
这是确定形状,一旦确定,就不能更改了

动态形状:
一种描述原始张量在执行过程中的一种形状
tf.reshape:创建一个具有不同动态形状的新张量
这是创建新的形状

pl=tf.placeholder(tf.float32,[None,3])
print(pl)
pl.set_shape([2,3])
print(pl)
pl=tf.reshape(pl,[3,2])
print(pl)

在pl.set_shape([2,3])后如果依然set_shape就会报错,此时应该使用动态的reshape
在这里插入图片描述

要点

1、转换静态形状的时候,1-D到1-D,2-D到2-D,不能跨阶数改变形状
错误的,转化不了

pl.set_shape([3])
print(pl)
pl=tf.reshape(pl,[1,3])

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

3、tf.reshape()动态创建新张量时,元素个数不能不匹配
此时不能匹配,因为原来6个参数,现在变成四个,变成动态的也无法调节

pl.set_shape([2,3])
print(pl)
pl=tf.reshape(pl,[2,2])

张量操作-生成张量

张量要么自动填充,要么模仿其他张量产生,或者从已有的值和列表创建4
在这里插入图片描述
在这里插入图片描述
为什么需要正态分布的变量值?

正态分布

概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。
还是由标准差设定的曲线
在这里插入图片描述
在这里插入图片描述

张量操作-张量变换

在这里插入图片描述
tfc=tf.cast([[2,3,4]],tf.float32)
最常用的还是最后的,万能油
在这里插入图片描述

在这里插入图片描述

切片与扩展

tf.concat(values, axis, name=‘concat’)
提供给Tensor运算的数学函数
https://www.tensorflow.org/versions/r1.0/api_guides/python/math_ops
算术运算符
基本数学函数
矩阵运算
减少维度的运算(求均值)
序列运算
注:这些都是在1.0版本下的函数,不同版本会有些差异

one=[[1,2,3],[4,5,6]]
two=[[7,8,9],[10,11,12]]
tfcc=tf.concat([one,two],axis=0)

按行合并,将矩阵的各行合并起来
在这里插入图片描述
按列合并,对两个矩阵的列合并

tfcc=tf.concat([one,two],axis=1)

在这里插入图片描述
类似的数学函数还有很多,都是为了简便运算已经封装成api
和numpy类似,tf.add等等

变量

1、变量的创建

2、变量的初始化

3、变量的作用域

变量

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

变量的创建

tf.Variable(initial_value=None,name=None,Trainable=True)
创建一个带值initial_value的新变量


assign(value)
为变量分配一个新值
返回新值
eval(session=None)
计算并返回此变量的值

name属性表示变量名字

变量的初始化

tf.global_variables_initializer()
添加一个初始化所有变量的op

在会话中开启

对于变量,只有先初始化才能运行,初始化也是一个op
随机生成一组矩阵

var=tf.Variable(tf.random_normal([2,3],mean=0.0,stddev=1.0,name="varibaleli"))
init_op=tf.global_variables_initializer()

先初始化后运行

sess.run(init_op)
    print(sess.run(var))

实际操作发现和常量似乎相同,那是因为他还缺少一个工具的辅助

可视化学习Tensorboard

数据序列化-events文件
TensorBoard 通过读取 TensorFlow 的事件文件来运行


tf.summary.FileWriter(’/tmp/tensorflow/summary/test/’, graph=default_graph)
返回filewriter,写入事件文件到指定目录(最好用绝对路径),以提供给tensorboard使用


开启
找到文件存放的路径

tensorboard    --logdir="C:\Users\Administrator.DESKTOP-KMH7HN6\Downloads\python_pgm\LearnSomting\LearnM\myCodeLearning\day02\tmp\summary\test"


一般浏览器打开为127.0.0.1:6006

注:修改程序后,再保存一遍会有新的事件文件,打开默认为最新
在这里插入图片描述
含义
在这里插入图片描述

图中的符号意义

在这里插入图片描述
此时为tensor命名的意义便显露了出来
未命名前
在这里插入图片描述
为变量命名后
在这里插入图片描述

a=tf.constant(2,name="a")
b=tf.constant(2,name="b")
sum=tf.add(a,b,name="myadd")

增加变量显示

目的:观察模型的参数、损失值等变量值化
从而观察训练的过程
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介绍

线性回归实现
结果演示
在这里插入图片描述

Tensorflow运算API

之前使用sklearn,现在是tf
流程相同
模型参数动态改变,当然是变量
在这里插入图片描述

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

平方
tf.square(error)

均值
tf.reduce_mean(error)

梯度下降API

tf.train.GradientDescentOptimizer(learning_rate)
 梯度下降优化
learning_rate:学习率,一般为

method:
minimize(loss)

return:梯度下降op

我们可以随机生成一个100行10维的矩阵,作为特征值,然后简单的设置一个权重和偏置作为目标值
这样可以比对学习得到的结果和设置的权重和目标值查看学习效果
对于权重,trainalbe参数可以限制此权重是否被优化,还是维持不变
训练时,如果学习率设置不合适,可能会导致梯度爆炸的情况,即学习到的权重和偏置指数增长,内存溢出了

# 第一个参数:名字,默认值,说明
tf.app.flags.DEFINE_integer("max_step", 100, "模型训练的步数")
tf.app.flags.DEFINE_string("model_dir", r"C:\Users\Administrator.DESKTOP-KMH7HN6\Downloads\python_pgm\LearnSomting\LearnM\python_sz_03\tmp ", "模型文件的加载的路径")

# 定义获取命令行参数名字
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

Tensorboard观察图结构,变量显示

在这里插入图片描述

作用域

一个变量的作用域?

tensorflow变量作用域

tf.variable_scope(<scope_name>)创建指定名字的变量作用域

观察变量的name改变?


嵌套使用变量作用域

观察变量的name改变?
程序整体被划分成了几大部分,点击可以查看详情
在这里插入图片描述

如果在之前,给变量取相同的name会出现什么样的情况?

在这里插入图片描述

tensorflow变量作用域的作用

让模型代码更加清晰,作用分明

模型保存和加载

其实就是保存的是参数
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文件
检查点文件
100步
权重,偏置
200步
权重,偏置
文件命名 model.data-00003-of-00004等等,代表保存的最新文件
如果保存了,会覆盖权重和偏置

自定义命令行参数

这样就可以在命令行中动态自由的指定传入py文件的参数
在这里插入图片描述

1、可以指定各种数据类型预定义在这里插入图片描述

2、 tf.app.flags.,在flags有一个FLAGS标志,它在程序中可以调用到我们
前面具体定义的flag_name

3、通过tf.app.run()启动main(argv)函数
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值