TensorFlow入门

众所周知,TensorFlow2.0和TensorFlow1.0相当于是两个项目,比如TensorFlow2.0并不需要会话,与1.0差别较大,如果要入门建议选择好自己想要学习的版本再进行学习。我所写的内容是基于TensorFlow1.0和python的
参考:
文字教程【TensorFlow2.0】
视频教程【TensorFlow1.0】
他人博客笔记

1.深度学习介绍

1.1深度学习与机器学习的区别

1.1.1特征提取方面

机器学习的特征工程步骤是要靠手动完成的,而且需要大量领域专业知识
深度学习通常由多个层组成,它们通常将更简单的模型组合在一起,将数据从一层传递到另一层来构建更复杂的模型。通过训练大量数据自动得出模型,不需要人工特征提取环节。
深度学习算法试图从数据中学习高级功能,这是深度学习的一个非常独特的部分。因此,减少了为每个问题开发新特征提取器的任务。适合用在难提取特征的图像、语音、自然语言处理领域。
在这里插入图片描述

1.1.2数据量和计算性能要求

机器学习需要的执行时间远少于深度学习,深度学习参数往往很庞大,需要通过大量数据的多次优化来训练参数。
在这里插入图片描述
第一、深度学习需要大量的训练数据集
第二、训练深度神经网络需要大量的算力
可能要花费数天、甚至数周的时间,才能使用数百万张图像的数据集训练出一个深度网络。所以深度学习通常
●需要强大的GPU服务器来进行计算
●全面管理的分布式训练与预测服务——比如谷歌TensorFlow云机器学习平台

1.1.3算法代表

●机器学习:朴素贝叶斯、决策树等
●深度学习:神经网络

1.2深度学习环境配置

详见前序博客

2. TensorFlow框架的使用

2.1TensorFlow结构

2.1.1第一个TensorFlow代码

创建第一个TensorFlow代码,使用TensorFlow进行加法运算(这里体现了2.0和1.0的不同,2.0版本不需要开启会话)

import tensorflow  as tf

def tensorflow_demo():
    # Tensorflow实现加法
    a=tf.constant(2)
    b=tf.constant(3)
    c=a+b
    print("Tensorflow加法运算的结果:\n",c)

    #开启会话
    with tf.Session() as sess:
        c_t=sess.run(c)
        print("c_t:\n",c_t)
if __name__ == '__main__':
    tensorflow_demo()

运算结果:
在这里插入图片描述
在这里插入图片描述

2.1.2 TensorFlow结构分析

TensorFlow程序通常被组织成一个构建图阶段和一个执行图阶段。
构建阶段,数据与操作的执行步骤被描述成一个图。
执行阶段,使用会话执行构建好的图中的操作。
图和会话:
图:这是TensorFlow将计算表示为指令之间的依赖关系的一种表示法(可以理解想象画了一张流程图)
会话: TensorFlow 跨一个或多个本地或远程设备运行数据流图的机制(把流程图运行起来)
张量:TensorFlow中的基本数据对象(定义数据tensor)
节点:提供图当中执行的操作(operation,简称op)

在这里插入图片描述
TensorFlow是一个采用数据流图,用于数值计算的开源框架。节点在图中表示数学操作,线则表示在节点间相互联系的多维数据数组,即张量 .

2.2图与TensorBoard

2.2.1图结构

图包含了一组tf.Operation代表的计算单元对象和tf.Tensor代表的计算单元之间流动的数据

2.2.2图相关操作

1默认图
通常Tnsorlow会默认帮我们创建一张图。
查看默认图的两种方法:
①通过调用tf.get_default_graph()访问.要将操作添加到默认图形中,直接创建OP即可
②op、sess都含有.graph属性,默认都在一张图中

import tensorflow  as tf

def tensorflow_demo():
    # Tensorflow实现加法
    a=tf.constant(2)
    b=tf.constant(3)
    #c=a+b(不提倡直接使用符合运算)
    c=tf.add(a,b)

    print("Tensorflow加法运算的结果:\n",c)
    # 查看默认图
    # 方法1:调用方法
    default_g = tf.get_default_graph()
    print("default_g:\n", default_g)
    # 方法2:查看属性
    print("a的图属性:\n", a.graph)
    print("c的图属性:\n", c.graph)
    #开启会话
    with tf.Session() as sess:
        c_t=sess.run(c)
        print("c_t:\n",c_t)
        print("sess的图属性:\n",sess.graph)

    return None
if __name__ == '__main__':
    tensorflow_demo()

运行结果:
在这里插入图片描述

在这里插入图片描述
2 创建图
①可以通过tf.Graph0自定义创建图
②如果要在这张图中创建OP,典型用法是使用比tf.Graph.as_default()上下文管理器

import tensorflow  as tf

def tensorflow_demo():
    #创建图
    new_g = tf.get_default_graph()
    #在图里创建操作和数据
    with new_g.as_default():
        a_new = tf.constant(2)
        b_new = tf.constant(3)
        c_new = a_new+b_new
        print("c_new:\n",c_new)
    #这时就不能用默认的sesstion了
    #开启new_g的会话,graph=new_g这个参数说明了这个会话是为new_g展开的,如果没有就是为了默认图展开
    with tf.Session(graph=new_g) as new_sess:
        c_new_value = new_sess.run(c_new)
        print("c_new_value:\n",c_new_value)
        print("new_sess的图属性:\n",new_sess.graph)
    return None
if __name__ == '__main__':
    tensorflow_demo()

在这里插入图片描述

2.2.3 TensorBoard:可视化学习

TensorFlow可用于训练大规模深度神经网络所需的计算,使用该工具涉及的计算往往复杂而深奥。为了更方便TensorFlow程序的理解、调试与优化,TensorFlow提供 了TensorBoard可视化工具。

1数据序列化-events文件
TensorBoard通过读取TensorFlow的事件文件来运行,需要将数据生成一个序列化的Summary protobuf对象。
API:tf.summary.FileWriter('path',graph=sess.graph)
这将在指定目录中生成一个event文件,其名称格式如下
events.out.tfevents.{timestamp}.{hostname}
2.启动TensorBoard
tensorboard --logdir="yourPath"
在浏览器中打开TensorBoard的页面图,会看到以下图形类似图,在GRAPHS模块我们可以看到以下结构:
具体操作:
①代码创建数据序列化-events文件

import tensorflow  as tf

def tensorflow_demo():
    #创建图
    new_g = tf.get_default_graph()
    #在图里创建操作和数据
    with new_g.as_default():
        a_new = tf.constant(2)
        b_new = tf.constant(3)
        c_new = a_new+b_new
        print("c_new:\n",c_new)
    #这时就不能用默认的sesstion了
    #开启new_g的会话,graph=new_g这个参数说明了这个会话是为new_g展开的,如果没有就是为了默认图展开
    with tf.Session(graph=new_g) as new_sess:
        c_new_value = new_sess.run(c_new)
        print("c_new_value:\n",c_new_value)
        print("new_sess的图属性:\n",new_sess.graph)
        #将图写入本地events文件
        tf.summary.FileWriter('./tmp/summary', graph=new_sess.graph)
    return None
if __name__ == '__main__':
    tensorflow_demo()

运行结果:
生成文件
在这里插入图片描述

②在控制台操作启动TensorBoard
在这里插入图片描述
③用浏览器打开控制台给出的地址
可以看到可视化后的图
在这里插入图片描述

2.2.4 OP

1.常见OP
在这里插入图片描述
在这里插入图片描述
一个操作对象(Operation) 是TensorFlow图中的一个节点,可以接收0个或者多个输入Tensor,并且可以输出0个或者多个Tensor, Operation对象是通过op构造函数(如tf.matmul() 创建的。

例如: c = tf.matmul(a, b)创建了一个Operation对象,类型为MatMul类型,它将张量a, b作为输入,c作为输出,并且输出数据,打印的时候也是打印的数据。其中tf.matmul0是函数,在执行matmul函数的过程中会通过MatMul类创建一个与之对应的对象

打印语句会生成:
在这里插入图片描述
注意,打印出来的是张量值,可以理解成OP当中包含了这个值。并且每一个OP指令都对应一个唯一的名称,如上面的Const:0,这个在TensorBoard上面也可以显示
请注意,tf.Tensor对象以输出该张量的tf.Operation明确命名。张量名称的形式为"<OP_ NAME>:"
其中:
<OP_ NAME>是生成该张量的指令的名称
<i>是一个整数,它表示该张量在指令的输出中的索引

2指令名称
tf.Graph对象为其包含的tf.Operation对象定义的一个命名空间。TensorFlow 会自动为图中的每个指令选择一个唯一名称, 用户也可以指定描述性名称,使程序阅读起来更轻松。我们可以以以下方式改写指令名称
●每个创建新的tf.Operation或返回新的tf.Tensor的API函数可以接受可选的name参数。
例如,tf.constant(42.0, name=" answer")创建了一个名为"answer"的新tf.Operation并返回一个名为"answer:0" 的tf.Tensor.如果默认图已包含名为
“answer"的指令,则TensorFlow 会在名称上附加"1”、 "2"等字符,以便让名称具有唯一性。

●当修改好之后,我们在Tensorboard显示的名字也会被修改

a=tf.constant(3.0,name="a")
b=tf.constant(3.0,name="b")

2.3会话

2.3.1会话

一个运行TensorFlow operation的类。会话包含以下两种开启方式
●tf.Session: 用于完整的程序当中
●tf.InteractiveSession: 用于交互式上下文中的TensorFlow,例如shell
1 TensorFlow使用tf.Session类来表示客户端程序(通常为Python程序,但也提供了使用其他语言的类似接口)与C++运行时之间的连接
2 tf.Session对象使用分布式TensorFlow运行时提供对本地计算机中的设备和远程设备的访问权限

在这里插入图片描述
1 _ init__ (target =’ ', graph=None, config=None)

会话可能拥有的资源,如tf.Variable, tf.QueueBase和tf.ReaderBase。 当这些资源不再需要时,释放这些资源非常重要。因此,需要调用tf.Session.close会话中的方法,或将会话用作上下文管理器。以下两个例子作用是一样的:
在这里插入图片描述
●target: 如果将此参数留空(默认设置),会话将仅使用本地计算机中的设备。可以指定grpc://网址,以便指定TensorFlow服务器的地址,这使得会话可以访问该服务器控制的计算机上的所有设备。
graph: 默认情况下,新的tf.Session将绑定到当前的默认图。
config: 此参数允许您指定-个tf.ConfigProto以便控制会话的行为。例如,ConfigProto协议用于打印设备使用信息
在这里插入图片描述

#运行会话并打印设备信息
sess = tf.Session(config=tf. ConfigProto(allow_ soft_ placement=True,log_ device_ placement=True))

2会话的run()

●run(fetches,feed_dict=None, options=None, run_ metadata=None)
通过使用sessrun()来运行operation
fetches: 单一的operation,或者列表、元组(其它不属于tensorflow的类型不行)
feed_dict: 参数允许调用者瞿盖图中张量的值,运行时赋值
与tf.placeholder搭配使用, 则会检查值的形状是否与占位符兼容。
使用tf.operation.eval()也可运行operation,但需要在会话中运行
在这里插入图片描述

请注意运行时候报的错误error:
RuntimeError:如果这Sess on是无效状态(例如已关闭)。
TypeError:如果fetches或者feed_ dict键的类型不合适。
ValueError:如果fetches或feed_ dict键无效或引用Tensor不存在的键。

2.4张量

TensorFlow的张量就是-一个n维数组,类型为tf.Tensor。Tensor具有以下两个重要的属性
●type:数据类型
●shape:形状(阶)

2.4.1张量(Tensor)

在这里插入图片描述
一.张量的类型
在这里插入图片描述
二.张量的阶
在这里插入图片描述

2.4.2创建张量的指令

固定值张量

tf.zeros(shape, dtype=tf.float32, name=None)

创建所有元素设置为零的张量。此操作返回一个dtype具有形状shape和所有元素设置为零的类型的张量。

tf.zeros_ like(tensor, dtype=None, name=None)

给tensor定单张量() ,此操作返回tensor与所有元素设置为零相同的类型和形状的张量。

tf.ones(shape, dtype=tf.float32, name=None)

创建一个所有元素设置为1的张量。此操作返回-一个类型的张量,dtype形 状shape和所有元素设置为1。

tf.ones_ like(tensor, dtype=None, name=None)

给tensor定单张量() ,此操作返回tensor与所有元素设置为1相同的类型和形状的张量。

tf.fill(dims, value, name=None)

创建一一个填充了标量值的张量。此操作创建一个张量的形状dims并填充它value。

tf.constant(value, dtype=None, shape=None, name='Const')

创建一个常数张量。

import tensorflow as tf

mA = tf.zeros(shape=[2,3], dtype=tf.float32, name=None)
mB = tf.ones(shape=[2,3], dtype=tf.float32, name=None)

print('mA:',mA)
print('mB:',mB)

运行结果:
在这里插入图片描述

随机值张量

tf.truncated_normal(shape, mean=0.0, stddev= 1.0, dtype=tf.float32, seed=None, name=None)

从截断的正态分布中输出随机值,和tf.random_ normal()一样,但是所有数字都不超过两个标准差

tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

从正态分布中输出随机值,由随机正态分布的数字组成的矩阵

import tensorflow as tf

mA = tf.random_normal(shape=[2,3], mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
with tf.Session() as sess:
        print('mA:',mA.eval())


运行结果:
在这里插入图片描述

2.4.3张量的变换

1类型改变
提供了如下一些改变张量中数值类型的函数

tf.string_to_number(string_tensor, out .type=None, name=None)
 tf.to_double(x, name='ToDouble')
tf.to_float(x, name= 'ToFloat')
tf.to_bfloat16(x, name='ToBFloat16')
tf.to_int32(x, name='Tolnt32')
tf.to_int64(x, name='Tolnt64')
tf.cast(x, dtype, name=None)
import tensorflow as tf

mA = tf.zeros(shape=[2,3], dtype=tf.float32, name=None)
mC = tf.cast(mA,dtype=tf.int32)
with tf.Session() as sess:
        print('mA:',mA.eval())
        print('mC:', mC.eval())

运行结果:
在这里插入图片描述
2形状改变
TensorFlow的张量具有两种形状变换,动态形状和静态形状

tf.reshape
tf.set_shape

关于动态形状和静态形状必须符合以下规则

●静态形状
。转换静态形状的时候,1-D到1-D, 2-D到2-D,不能跨阶数改变形状。对于已经固定的张量的静态形状的张量,不能再次设置静态形状
●动态形状
。tf.reshape(动态 创建新张量时,张量的元素个数必须匹配

import tensorflow as tf
#静态形状改变
mA = tf.placeholder(shape=[None,None], dtype=tf.float32, name=None)
mA.set_shape([3, 2])
#动态形状改变
mB = tf.placeholder(shape=[2,3], dtype=tf.float32, name=None)
mD = tf.reshape(mB,[3,2])
with tf.Session() as sess:
        print('mA:', mA)
        print('mB:', mB)
        print('mD:', mD)

运行结果:
在这里插入图片描述

2.4.4张量的数学运算

●算术运算符●基本数学函数●矩阵运算●reduce操作●序列索引操作
详细请参考: .TensorFlow官网

2.5变量

2.5.1创建变量

tf.Variable(initial_value=None,trainable=True,collections=None,name=None)
。initia_value:初始化的值
。trainable:是 否被训练
。collections新变量将添加到列出的图的集合collections默认为[GraphKeys.Global_VARIOABLES]如果trainable是True变量也被添加到图形集合GraphKeys.TRAINABLE _VARIABLES

●变量需要显式初始化,才能运行值
在这里插入图片描述

2.5.2使用tf.variable_ scope()修改变量的命名空间

会在OP的名字前面增加命名空间的指定名字

在这里插入图片描述

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
def variable_demo():
    """
    变量的演示
    :return:
    """
    # 创建变量
    with tf.variable_scope("my_scope"):
        a = tf.Variable(initial_value=50)
        b = tf.Variable(initial_value=40)
    with tf.variable_scope("your_scope"):
        c = tf.add(a, b)
    print("a:\n", a)
    print("b:\n", b)
    print("c:\n", c)

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

    # 开启会话
    with tf.Session() as sess:
        # 运行初始化
        sess.run(init)
        a_value, b_value, c_value = sess.run([a, b, c])
        print("a_value:\n", a_value)
        print("b_value:\n", b_value)
        print("c_value:\n", c_value)

    return None
if __name__ == '__main__':
    variable_demo()


API

2.6.1其它基础API

1 tf.app
这个模块相当于为TensorFlow进行的脚本提供一个main函数入口,可以定义脚本运行的flags.
2 tf.image
TensorFlow的图像处理操作。主要是一些颜色变换、 变形和图像的编码和解码。
3 tf.gfile
这个模块提供了一组文件操作函数。
4 tf.summary
用来生成TensorBoard可用的统计日志,目前Summary主要提供了4种类型:audio、image、 histogram、scalar、tf.python_ io用来读写TFRecords文件
6 tf.train
这个模块提供了一些训练器,与tf.nn 组合起来,实现一些网络的优化计算。
7 tf.nn
这个模块提供了一些构建神经网络的底层函数。TensorFlow 构建网络的核心模块。其中包含了添加各种层的函数,比如添加卷积层、池化层等。

2.6.2高级API

1 tf.keras
Keras本来是一-个独立的深度学习库,tensorflow将其学习过来, 增加这部分模块在于快速构建模型。
2 tf.layers
高级API,以更高级的概念层来定义一个模型。类似f.keras
3 tf.contrib
tf.contrib.layers提供够将计算图中的网络层、正则化、摘要操作、是构建计算图的高级操作,但是f.contrib包含 不稳定和实验代码,有可能以后API会改变。
4 tf.estimator
一个Estimator相当于Model + Training + Evaluate的合体。在模块中,已经实现了几种简单的分类器和回归器,包括: Baseline, Learning 和DNN。这里的DNN的网络,只是全连接网络,没有提供卷积之类的。

2.7案例:实现线性回归

2.7.1线性回归原理复习

1.构建模型
1)构建模型:y =wlx1+w2x2+_ + wnxn+b
2)构造损失函数:均方误差
3)优化损失:梯度下降
2.运算
●矩阵运算:tf.matmul(x, w)
●平方:tf.square(error)
●均值:tf.reduce_mean(error)
3.梯度下降优化
●tf.train.GradientDescentOptimizer(learning_rate)
。梯度下降优化
。learning_ rate:学习率,一般为0~1之间比较小的值
。method:minimize(loss)
。return:梯度下降op

在这里插入图片描述
4.代码

import tensorflow as tf

def linear_regression():
    """
    自实现一个线性回归
    :return:
    """
    # 1)准备数据
    X = tf.random_normal(shape=[100, 1])
    y_true = tf.matmul(X, [[0.8]]) + 0.7
    # 2)构造模型
    # 定义模型参数 用 变量
    weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]))
    bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]))
    y_predict = tf.matmul(X, weights) + bias
    # 3)构造损失函数
    error = tf.reduce_mean(tf.square(y_predict - y_true))
    # 4)优化损失
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
    # 显式地初始化变量
    init = tf.global_variables_initializer()
    # 开启会话
    with tf.Session() as sess:
        # 初始化变量
        sess.run(init)
        # 查看初始化模型参数之后的值
        print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
        #开始训练
        for i in range(100):
            sess.run(optimizer)
            print("第%d次训练后模型参数为:权重%f,偏置%f,损失为%f" % (i+1, weights.eval(), bias.eval(), error.eval()))

    return None
if __name__ == '__main__':
    linear_regression()



5学习率的设置、步数的设置与梯度爆炸
学习率越大,训练到较好结果的步数越小;学习率越小,训练到较好结果的步数越大。但是学习过大会出现梯度爆炸现象。
在极端情况下,权重的值变得非常大,以至于溢出,导致NaN值
如何解决梯度爆炸问题(深度神经网络当中更容易出现)
1、重新设计网络
2、调整学习率
3、使用梯度截断(在训练过程中检查和限制梯度的大小)
4、使用激活函数

6变量的trainable设置观察trainable的参数作用,指定是否训练

    weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]),trainable=False)

然后weights的值不能变化

2.7.3增加其他功能

●变量Tensorboard显示●增加命名空间●模型保存与加载●命令行参数设置

1增加变量显示

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

●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表示第几次的值

import tensorflow as tf

def linear_regression():
    """
    自实现一个线性回归
    :return:
    """
    # 1)准备数据
    X = tf.random_normal(shape=[100, 1])
    y_true = tf.matmul(X, [[0.8]]) + 0.7
    # 2)构造模型
    # 定义模型参数用变量
    weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]),trainable=False)
    bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]))
    y_predict = tf.matmul(X, weights) + bias
    # 3)构造损失函数
    error = tf.reduce_mean(tf.square(y_predict - y_true))
    # 4)优化损失
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
    # 2_收集变量
    tf.summary.scalar("error", error)
    tf.summary.histogram("weights", weights)
    tf.summary.histogram("bias", bias)

    # 3_合并变量
    merged = tf.summary.merge_all()
    # 显式地初始化变量
    init = tf.global_variables_initializer()
    # 开启会话
    with tf.Session() as sess:
        # 初始化变量
        sess.run(init)
        # 1_创建事件文件

        file_writer = tf.summary.FileWriter("./tmp/linear", graph=sess.graph)
        # 查看初始化模型参数之后的值
        print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
        #开始训练
        for i in range(1000):
            sess.run(optimizer)
            #print("第%d次训练后模型参数为:权重%f,偏置%f,损失为%f" % (i+1, weights.eval(), bias.eval(), error.eval()))
            # 运行合并变量操作
            summary = sess.run(merged)
            # 将每次迭代后的变量写入事件文件
            file_writer.add_summary(summary, i)
        print("训练后模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
    return None
if __name__ == '__main__':
    linear_regression()



在这里插入图片描述
在这里插入图片描述
2.增加命名空间
with tf.variable_scope("prepare_data"):使得代码结构更加清晰,Tensorboard图结构清楚

with tf.variable_scope("create_model"):
import tensorflow as tf

def linear_regression():
    """
    实现一个线性回归
    :return:
    """
    with tf.variable_scope("prepare_data"):
         # 1)准备数据
         X = tf.random_normal(shape=[100, 1],name="X")
         y_true = tf.matmul(X, [[0.8]]) + 0.7

    with tf.variable_scope("create_model"):
         # 2)构造模型
         # 定义模型参数 用 变量
         weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]),name="weights")
         bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]),name="bias")
         y_predict = tf.matmul(X, weights) + bias
    with tf.variable_scope("loss_function"):
        # 3)构造损失函数
        error = tf.reduce_mean(tf.square(y_predict - y_true),name="error")
    with tf.variable_scope("optimizer"):
        # 4)优化损失
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
    # 2_收集变量
    tf.summary.scalar("error", error)
    tf.summary.histogram("weights", weights)
    tf.summary.histogram("bias", bias)

    # 3_合并变量
    merged = tf.summary.merge_all()
    # 显式地初始化变量
    init = tf.global_variables_initializer()
    # 开启会话
    with tf.Session() as sess:
        # 初始化变量
        sess.run(init)
        # 1_创建事件文件

        file_writer = tf.summary.FileWriter("./tmp/linear", graph=sess.graph)
        # 查看初始化模型参数之后的值
        print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
        #开始训练
        for i in range(1000):
            sess.run(optimizer)
          #  print("第%d次训练后模型参数为:权重%f,偏置%f,损失为%f" % (i+1, weights.eval(), bias.eval(), error.eval()))
            # 运行合并变量操作
            summary = sess.run(merged)
            # 将每次迭代后的变量写入事件文件
            file_writer.add_summary(summary, i)
        print("训练后模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
    return None
if __name__ == '__main__':
    linear_regression()



模型的保存于加载
tf.train.Saver(var_list=None,max_to_keep=5)
。 保存和加载模型(保存文件格式: checkpoint文件)
var_list:指定将要保存和还原的变量。它可以作为一个dict或一个列表传递.
max_ to_ keep: 指示要保留的最近检查点文件的最大数量。创建新文件时,会删除较旧的文件。如果无或0,则保留所有检查点文件。默认为5 (即保留最新的5个检查点文件。)

在这里插入图片描述

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
def linear_regression():
    """
    自实现一个线性回归
    :return:
    """
    with tf.variable_scope("prepare_data"):
        # 1)准备数据
        X = tf.random_normal(shape=[100, 1], name="feature")
        y_true = tf.matmul(X, [[0.8]]) + 0.7

    with tf.variable_scope("create_model"):
        # 2)构造模型
        # 定义模型参数 用 变量
        weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name="Weights")
        bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name="Bias")
        y_predict = tf.matmul(X, weights) + bias

    with tf.variable_scope("loss_function"):
        # 3)构造损失函数
        error = tf.reduce_mean(tf.square(y_predict - y_true))

    with tf.variable_scope("optimizer"):
        # 4)优化损失
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    # 2_收集变量
    tf.summary.scalar("error", error)
    tf.summary.histogram("weights", weights)
    tf.summary.histogram("bias", bias)

    # 3_合并变量
    merged = tf.summary.merge_all()

    # 创建Saver对象
    saver = tf.train.Saver()

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

    # 开启会话
    with tf.Session() as sess:
        # 初始化变量
        sess.run(init)

        # 1_创建事件文件
        file_writer = tf.summary.FileWriter("./tmp/linear", graph=sess.graph)

        # 查看初始化模型参数之后的值
        print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))

        # #开始训练
        # for i in range(100):
        #     sess.run(optimizer)
        #     print("第%d次训练后模型参数为:权重%f,偏置%f,损失为%f" % (i+1, weights.eval(), bias.eval(), error.eval()))
        #
        #     # 运行合并变量操作
        #     summary = sess.run(merged)
        #     # 将每次迭代后的变量写入事件文件
        #     file_writer.add_summary(summary, i)
        #
        #     # 保存模型
        #     if i % 10 ==0:
        #         saver.save(sess, "./tmp/model/my_linear.ckpt")
        # 加载模型
        if os.path.exists("./tmp/model/checkpoint"):
            saver.restore(sess, "./tmp/model/my_linear.ckpt")

        print("训练后模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))


    return None
if __name__ == '__main__':
    linear_regression()

在这里插入图片描述
在这里插入图片描述

import tensorflow as tf

# 1)定义命令行参数
tf.app.flags.DEFINE_integer("max_step", 100, "训练模型的步数")
tf.app.flags.DEFINE_string("model_dir", "Unknown", "模型保存的路径+模型名字")

# 2)简化变量名
FLAGS = tf.app.flags.FLAGS

def command_demo():
    """
    命令行参数演示
    :return:
    """
    print("max_step:\n", FLAGS.max_step)
    print("model_dir:\n", FLAGS.model_dir)

    return None

if __name__ == '__main__':
    command_demo()

命令行中使用
在这里插入图片描述
在这里插入图片描述
argv为文件路径,不可以没有
在主函数中使用:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值