参考 :https://blog.csdn.net/u010591976/article/details/82183676
TensorFlow结构分析
TensorFlow程序通常被组织成一个构建图阶段和一个执行图阶段。
在构建阶段,数据与操作的执行步骤被描述成一个图。
在执行阶段,使用会话执行构建好的图中的操作。
●图和会话:
。图:这是TensorFlow将计算表示为指令之间的依赖关系的一种表示法
。会话: TensorFlow跨一个或 多个本地或远程设备运行数据流图的机制
●张量: TensorFlow中的基本数据对象
●节点:提供图当中执行的操作
https://blog.csdn.net/woaidapaopao/article/details/72863591
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
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
参考 :https://blog.csdn.net/qq_38293297/article/details/105448700
●图包含了一组tf.Operation代表的计算单元对象和tf.Tensor代表的计算单元
之间流动的数据。
●获取tf程序的默认图: tf.get. default graph()
●op, tensor, session: 所在的都是默认的这个程序的图
创建图
●tf.graph
●会话只运行默认那张图,如果有多个图需要多个会话开启
with tf. Session (graph-new_ g)
https://www.bilibili.com/video/BV1fh41197P5?p=6 7分钟左右讲解
#返回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}
tensorboard --logdir="./tmp/tensorflow/summary/test/"
在浏览器中打开TensorBoard的图页面127.0.0.1:6006,会看到与以下图形类似的图,在GRAPHS模块我们可以看到以下图结构
一个操作对象(Operation) 是TensorFlow图中的一个节点,接收0个或者多个输入
Tensor,井且可以输出0个或者多个Tensor
●打印出来的是张量值,可以理解成OP当中包含了这个值
●"Const_ 1:0"
"
""是一个整数,它表示该张量在指令的输出中的索引,都是0
学习目标
应用sess.run或者eval运行图程序并获取张量值
应用feed_ dict机制实现运行时填充数据
应用placeholder实 现创建占位符
■ 1_ init__ (target=", graph=None, config=None)
■ 2会话的run()
■ 3 feed操作
/ job: worker/replica :0/task:0/device :CPU:0
#变量
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
#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)
#变量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))
参考:https://www.cnblogs.com/xianhan/p/9090426.html
#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的值,也就是让损失函数的值尽量变小
根据数据建立回归模型,w1x1+w2x2+…..+b = y,通过真实值与预测值之间建立误差,使用梯度下降优化得到损失最小对应的权重和偏置。最终确定模型的权重和偏置参数。最后可以用这些参数进行预测。
1 .案例确定
假设随机指定100个点,只有一个特征
数据本身的分布为 y = 0.7 * x + 0.8
这里将数据分布的规律确定,是为了使我们训练出的参数跟真实的参数(即0.7和0.8)比较是否训练准确
2.以下为用到的API
运算
矩阵运算
平方
均值
梯度下降优化
梯度下降优化learning_rate: 学习率,一般为0~1之间比较小的值
method:
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)
tf.variable_scope("original_data")
TensorFlow学习(一)——tensorboard,可视化(如制作loss损失变化图【重要】)summary/scalar/histogram/FileWriter
#收集观察张量
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")
总结:要学会、掌握常用API
loss function 是一个样本的,每个样本都有一个loss
解释下 cost function :这是所有样本的loss_function的平均值