tensorflow基础入门篇(一)——哪里不会学哪里

1.【T-Tensorflow框架学习】Tensorflow “计算图”入门理解

参考 :https://blog.csdn.net/u010591976/article/details/82183676
TensorFlow结构分析
TensorFlow程序通常被组织成一个构建图阶段和一个执行图阶段。
在构建阶段,数据与操作的执行步骤被描述成一个图。
在执行阶段,使用会话执行构建好的图中的操作。
●图和会话:
。图:这是TensorFlow将计算表示为指令之间的依赖关系的一种表示法
。会话: TensorFlow跨一个或 多个本地或远程设备运行数据流图的机制
●张量: TensorFlow中的基本数据对象
●节点:提供图当中执行的操作

1.1 基本知识之tensor,operation和Session

https://blog.csdn.net/woaidapaopao/article/details/72863591

1.1.1TensorFlow创建常量(tf.constant)详解

tf.constant(
    value,
    dtype=None,
    shape=None,
    name='Const',
    verify_shape=False
)
#举个例子
x = tf.constant(3.0, tf.float32) # 定义一个值为3.0的浮点型常量
#再比如
tensor=tf.constant([1, 2])
sess=tf.Session()
with sess.as_default():
    print('结果是:', tensor.eval())
>>> 结果是:[1 2]

参考 :https://blog.csdn.net/csdn_jiayu/article/details/82155224

1.1.2 Python新建三维数组并赋值

import numpy as np #导入numpy库
y = np.ones((3,3,3)) #新建三维数组,且初始值为1

print(y) #输出y
print(type(y)) #输出y的type
print(np.shape(y)) #输出y的大小

参考 :https://blog.csdn.net/weixin_41938903/article/details/102464283

1.1.3 Tensorflow之维度理解[ shape、reshape]

参考 :https://blog.csdn.net/qq_38293297/article/details/105448700

1.2图与TensorBoard

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

1.2.1图相关操作

●获取tf程序的默认图: tf.get. default graph()
●op, tensor, session: 所在的都是默认的这个程序的图
创建图
●tf.graph
●会话只运行默认那张图,如果有多个图需要多个会话开启

with tf. Session (graph-new_ g)

1.2.2实现程序可视化一共两步:

https://www.bilibili.com/video/BV1fh41197P5?p=6 7分钟左右讲解

  1. 数据序列化-events文件
    TensorBoard通过读取TensorFlow的事件文件来运行,需要将数据生成一个序列化的Summary protobuf 对象。
    用于观察我们程序一个运行状态,非常方便
#返回filewriter,写入事件文件到指定目录(最好用绝对路径),以提供给tensorboard使用
tf.summary.FileWriter('./tmp/summary/test/',graph=sess.graph)
这将在指定目录中生成一个event文件,其名称格式如下:
events. out. tfevents. {times tamp}. {hostname}
这将在指定目录中生成一个event文件,其名称格式如下:
events. out. tfevents. {times tamp}. {hostname}
  1. 启动TensorBoard
tensorboard --logdir="./tmp/tensorflow/summary/test/"

在浏览器中打开TensorBoard的图页面127.0.0.1:6006,会看到与以下图形类似的图,在GRAPHS模块我们可以看到以下图结构
在这里插入图片描述

1.2.3 Operation

一个操作对象(Operation) 是TensorFlow图中的一个节点,接收0个或者多个输入
Tensor,井且可以输出0个或者多个Tensor
●打印出来的是张量值,可以理解成OP当中包含了这个值
●"Const_ 1:0"
"<OP_ NAME>"是生成该张量的指令的名称
""是一个整数,它表示该张量在指令的输出中的索引,都是0

1.3 会话

学习目标
应用sess.run或者eval运行图程序并获取张量值
应用feed_ dict机制实现运行时填充数据
应用placeholder实 现创建占位符

  • 应用
  • 内容预览

■ 1_ init__ (target=", graph=None, config=None)
■ 2会话的run()
■ 3 feed操作

  • tf.Session: 用于完整的程序当中
    config: 此参数允许您指定一个tf.ConfigProto以便控制会话的行为。例如,ConfigProto协议用于 打印设备使用信息
/ job: worker/replica :0/task:0/device :CPU:0
  • tf.InteractiveSession: 用于交互式上下文中的TensorFlow,例如shell
  • 会话的run()
    placeholder:在 运行时候填充数据,通过feed_ dict
    用处:图定义好,数据没有固定,在运行时每次填充然后计算
    在这里插入图片描述

1.4 张量

1.4.1 创建张量

在这里插入图片描述

#变量
x = tf.Variable(tf.zeros([2,2])) # 声明一个2x2的矩阵,并将矩阵中的所有元素的值赋为0,默认每个元素都是tf.float32类型的数据
y = tf.Variable(1.0, tf.float32) # 声明一个tf.float32的变量,并将初始值设为1.0

我们一般还需要运行下global_variables_initializer真正在TensorFlow的Session中初始化所有变量,后面的样例中也会有体现。
在这里插入图片描述

https://www.bilibili.com/video/BV1fh41197P5?p=9&spm_id_from=pageDriver 5:33

1.4.2 张量的变换

#ipython解释器
In [2]: a_p = tf.placeholder(tf.float32,shape=[None,None])

In [3]: b_p = tf.placeholder(tf.float32,shape=[None,10])

In [4]: c_p = tf.placeholder(tf.float32,shape=[5,4])

In [5]: print("a_p.shape",a_p.get_shape())
a_p.shape (?, ?)

In [6]: print("b_p.shape",b_p.get_shape())
b_p.shape (?, 10)

In [7]: print("c_p.shape",c_p.get_shape())
c_p.shape (5, 4)
# 静态形状,张量只能经过一次修改,不能再次改变,但是可以reshape
In [8]: a_p.set_shape([2,3])
In [10]: print("a_p",a_p.get_shape())
a_p (2, 3)
#动态性状
In [13]: c_reshape_p = tf.reshape(c_p,[5,4])

In [14]: print("c_reshape_p",c_reshape_p.get_shape())
c_reshape_p (5, 4)

1.4.3 张量数学运算

1.5 变量OP

1.5.1 变量需要显式初始化,才能运行值

#变量operation
a = tf.Variable(initial_value=30.0)
b = tf.Variable(initial_value=40.0)
sum = tf.add(a, b)
# 显式初始化:tf.global_variables_initializer() 一定要有
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
#手动运行init_ op
	sess.run(init_ op)
	print("a",a)	
	print(sess.run(sum))

在这里插入图片描述

1.6 案例:实现线性回归

参考:https://www.cnblogs.com/xianhan/p/9090426.html

1.6.1 用一个例子引入

#1.先导入需要使用的python库。
#coding=utf-8
import tensorflow as tf
#2.定义需要的变量,我们看看y = W * x + b中都有哪些变量。
x = tf.placeholder(tf.float32)
W = tf.Variable(tf.zeros([1]))
b = tf.Variable(tf.zeros([1]))
y_ = tf.placeholder(tf.float32)
#x:我们训练时需要输入的真实数据x 
#W: 我们需要训练的W,这里我们定义了一个1维的变量(其实吧,就是一个普普通通的数,直接用tf.float32也行)并将其初值赋为0 
#b : 我们需要训练的b,定义一个1维变量,并将其初值赋为0 y_ :我们训练时需要输入的x对应的y
#3.定义线性模型
y = W * x + b
#4.定义损失函数和优化方法
lost = tf.reduce_mean(tf.square(y_-y))
optimizer = tf.train.GradientDescentOptimizer(0.0000001)
train_step = optimizer.minimize(lost)
#5.变量初始化
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
#6.开始训练
steps = 1000
for i in range(steps):
    xs = [i]
    ys = [3 * i]
    feed = { x: xs, y_: ys }
    sess.run(train_step, feed_dict=feed)
    if i % 100 == 0 :
        print("After %d iteration:" % i)
        print("W: %f" % sess.run(W))
        print("b: %f" % sess.run(b))
        print("lost: %f" % sess.run(lost, feed_dict=feed))
lost = tf.reducemean(tf.square(y- y))

损失函数(Lost Function)是用来评估我们预测的值和真实的值之间的差距是多少,损失函数有很多种写法,我们这里使用(y预测-y真实)^2再取平均数来作为我们的损失函数(用这个函数是有原因的,因为我们用的是梯度下降法进行学习)损失函数的值越小越好,有些教程也叫Cost Function

optimizer = tf.train.GradientDescentOptimizer(0.0000001)

优化函数代表我们要通过什么方式去优化我们需要学习的值,这个例子里指的是W和b,优化函数的种类有很多,大家到官网查阅,平时我们用的比较多的是GradientDescentOptimizer和AdamOptimizer等,这里我们选用最常用也是最最基本的GradientDescentOptimizer(梯度下降),后面传入的值是学习效率。一般是一个小于1的数。越小收敛越慢,但并不是越大收敛越快哈,取值太大甚至可能不收敛了。。。

我们简单介绍下什么是梯度下降,梯度顾名思义就是函数某一点的导数,也就是该点的变化率。梯度下降则顾名思义就是沿梯度下降的方向求解极小值。

详细解释大家可以自行谷歌一下~当然可以可以看这篇文章,当然由于性能的原因梯度下降有很多种变种,例如随机梯度下降 (Stochastic Gradient Descent),小批梯度下降 (Mini-Batch Gradient Descent)。本文样例采用的是SGD,每次只输入一个数据。

train_step = optimizer.minimize(lost)

这个代表我们每次训练迭代的目的,本例我们的目的就是尽量减小lost的值,也就是让损失函数的值尽量变小

1.6.2线性回归原理

   根据数据建立回归模型,w1x1+w2x2+…..+b = y,通过真实值与预测值之间建立误差,使用梯度下降优化得到损失最小对应的权重和偏置。最终确定模型的权重和偏置参数。最后可以用这些参数进行预测。

1.6.3案例:实现线性回归的训练

1 .案例确定
假设随机指定100个点,只有一个特征
数据本身的分布为 y = 0.7 * x + 0.8
这里将数据分布的规律确定,是为了使我们训练出的参数跟真实的参数(即0.7和0.8)比较是否训练准确

2.以下为用到的API
运算

矩阵运算

  • tf.matmul(x, w)

平方

  • tf.square(error)

均值

  • tf.reduce_mean(error)

梯度下降优化

  • tf.train.GradientDescentOptimizer(learning_rate=0.01)

梯度下降优化learning_rate: 学习率,一般为0~1之间比较小的值
method:

  • minimize(loss)

return:梯度下降op

3.步骤分析
1 准备好数据集:y = 0.8x + 0.7 100个样本
2 建立线性模型
随机初始化W1和b1
y = W·X + b,目标:求出权重W和偏置b
3 确定损失函数(预测值与真实值之间的误差)-均方误差
4 梯度下降优化损失:需要指定学习率(超参数)
4.实现完整功能

import tensorflow as tf
import os
 
def linear_regression():
    """
    自实现线性回归
    :return: None
    """
    # 1)准备好数据集:y = 0.8x + 0.7 100个样本
    # 特征值X, 目标值y_true
    X = tf.random_normal(shape=(100, 1), mean=2, stddev=2)
    # y_true [100, 1]
    # 矩阵运算 X(100, 1)* (1, 1)= y_true(100, 1)
    y_true = tf.matmul(X, [[0.8]]) + 0.7
    # 2)建立线性模型:
    # y = W·X + b,目标:求出权重W和偏置b
    # 3)随机初始化W1和b1
    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
    # 4)确定损失函数(预测值与真实值之间的误差)-均方误差
    error = tf.reduce_mean(tf.square(y_predict - y_true))
    # 5)梯度下降优化损失:需要指定学习率(超参数)
    # W2 = W1 - 学习率*(方向)
    # b2 = b1 - 学习率*(方向)
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
 	
    # 初始化变量
    init = tf.global_variables_initializer()
    # 开启会话进行训练
    with tf.Session() as sess:
        # 运行初始化变量Op
        sess.run(init)
        print("随机初始化的权重为%f, 偏置为%f" % (weights.eval(), bias.eval()))
        # 训练模型
        for i in range(100):
            sess.run(optimizer)
            print("第%d步的误差为%f,权重为%f, 偏置为%f" % (i, error.eval(), weights.eval(), bias.eval()))
 
    return None

以上所用内容都在
https://www.bilibili.com/video/BV1fh41197P5?p=11&spm_id_from=pageDriver
5.学习率的设置、步数的设置与梯度爆炸
学习率越大,训练到较好结果的步数越小;学习率越小,训练到较好结果的步数越大。

但是学习过大会出现梯度爆炸现象。关于梯度爆炸/梯度消失 ?

在极端情况下,权重的值变得非常大,以至于溢出,导致 NaN 值
如何解决梯度爆炸问题(深度神经网络当中更容易出现)
1、重新设计网络
2、调整学习率
3、使用梯度截断(在训练过程中检查和限制梯度的大小)
4、使用激活函数
6.变量的trainable设置观察trainable的参数作用,指定是否训练
这个在迁移学习中被使用

weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="weights", trainable=False)

1.6.4增加其他功能

  1. 增加命名空间
 tf.variable_scope("original_data")
  1. tensorboard
    【TensorFlow】TensorBoard的使用(一)
    链接:https://blog.csdn.net/duanlianvip/article/details/98498826

TensorFlow学习(一)——tensorboard,可视化(如制作loss损失变化图【重要】)summary/scalar/histogram/FileWriter

  1. tf. summary.scalar(“error”,error)
    收集零维度的值
    tf.summary.histogram( ‘weight’,weights )
    收集高纬度的张量
#收集观察张量
tf.summary.scalar(' losses',Loss )
tf.summary.histogram( 'weight',weights )
tf.summary.histogram('biases ',bias)
#放到会话里
filewriter . add_ summary( summary, i)
# checkpoint: ckpt格式文件,检查点文件格式,是tf架构独有的文件,自己创建
# tf.keras: keras架构用h5文件保存数据,比tf的ckpt更为方便
saver. save(sess, "./ tmp/ cket/hinearregression")
  1. 命令行参数设置在这里插入图片描述

总结:要学会、掌握常用API

1.7 逻辑回归

1.7.1 逻辑回归损失函数

在这里插入图片描述
loss function 是一个样本的,每个样本都有一个loss
解释下 cost function :这是所有样本的loss_function的平均值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值