TensorFlow入门学习笔记二

模型里面的内容及意义
一个标准的模型结果分为输入,中间节点,输出三大部分,TensorFlow框架则是负责将这三个部分连通起来学习规则并可以进行计算,它将中间节点及节点中的运算关系定义在自己内部的一个“图”上,全通过一个“会话(session)”进行图中OPS的具体运算
图是静态的,它们只是将关系搭建在一起,不会有任何运算。而session则是动态的,只有启动session后才会将数据流向图中,并按照图中的运算关系,并将最终的结果从图中流出。TensorFlow用这种方式分离了计算的定义和执行,图类似于施工图,session类似于施工地点

在这里插入图片描述
输入节点:网络入口
用于训练的模型参数(学习参数):是连接各个节点的路径
模型中的节点(op):最复杂的部分,它可以用来代表模型中的中间节点,也可以代表最终的输出节点,是网络中的真正结构
模型内的数据流向
正向,是数据从输入开始,依次进行各节点定义的运算,一直运算到输出,是模型最基本的数据流向,它直观的表现了网路模型的结构,在模型的训练,测试,使用的场景中都会用到,这部分是必须要掌握的
反向,只有在训练场景下才会用到,这里使用了一个叫反向链式求导的方法,即先从正向的最后一个节点开始,计算此时结果值与真实值的误差,这样会形成一个用学习参数表示误差的方程,然后对方程中的每个参数求导,得到其梯度修正值,同时反推出上一层的误差,这样就将该层节点的误差按照正向的相反方向传到上一层,并接着计算上一层的修正值,如此反复下去一步一步地进行传播,直到传到正向的第一个节点
TensorFlow开发的基本步骤
定义TensorFlow的输入节点
定义“学习参数”地变量
定义运算
优化函数,优化目标
初始化所有变量
迭代更新参数的最优解
测试模型
使用模型
1.定义输入节点的办法
通过占位符定义:通常使用这种方式

X = tf.placeholder('float')
Y = tf.placeholder('float')

通过字典类型定义:一般用于输入比较多情况

inputdict = {
"X" : tf.placeholder('float'),
"Y" : tf.placeholder('float')
}

直接定义:一般很少使用

train_X = np.linspace(-1,1,100)
#生成-1~1之间的100个数
train_Y = 2 * train_X + np.random.randn(*train_X.shape)*0.3
#相当于 y = 2*x+0.3*a 产生了噪声
#np.random.randn(*train_X.shape)等价于np.random.randn(100)

plt.plot(train_X,train_Y,'ro',label='Original data')
plt.legend()
plt.show()

W = tf.Variable(tf.random_normal([1]),name = "weight")
b = tf.Variable(tf.zeros([1]),name = 'bias')
z = tf.multiply(W,train_X) + b

2.定义“学习参数”的变量
直接定义

W = tf.Variable(tf.random_normal([1]),name = "weight")
b = tf.Variable(tf.zeros([1]),name = 'bias')

字典类型定义

paradict = {
"W" : tf.Variable(tf.random_normal([1]),
"b" : tf.Variable(tf.zeros([1])
}
z = tf.multiply(X,paradict['W']) + paradict['b']

3.定义运算
定义“运算”的过程是建立模型的核心过程,直接决定了模型的拟合效果

定义正向传播模型:
多层神经网络,卷积神经网,循环神经网络及更深层的GoogLeNet,Resent等都是由神经元以不同的组合方式组成的网络结构。

定义损失函数:
损失值主要是计算“输出值”与“目标函数”之间的误差,是配合反向传播使用的。为了在反向传播中可以找到最小值,要求该函数必须是可导的。

优化函数,优化目标
在有了正向结构和损失函数后,就是通过优化函数来优化学习参数了,这个过程也是在反向传播中完成的。反向传播过程,就是沿着正向传播的结构向相反方向将误差传递过去。涉及到如L1,L2正则化,冲量调节,学习率自适应,adm随机梯度下降算法等

初始化所有变量
session创建好后首先要做的就是初始化

init = tf.global_variables_initializer()
with tf.Session() as sess:**加粗样式**
    sess.run(init)

*使用tf.global_variables_initializer()函数初始化所有变量的步骤必须在所有变量和OP定义完成之后。这样才能保证定义的内容有效,否则定义的变量和OP都无法使用session中的run值来进行算值

迭代更新参数到最优解
在迭代训练环节,都是需要通过建立一个session来完成的,常用的是使用with语法,可以在session结束后自行关闭。在训练环节中run里面放的是优化操作的OP,同时会在外层加上循环次数

for epoch in range(training_epochs):
    for(x,y) in zip(train_X,train_Y):
        sess.run(optimizer,feed_dict={X:x,Y:y})

真正使用过程中会引入一个叫做MINIBATCH概念进行迭代训练,即每次取一定量的数据的同时放到网络里进行训练

测试模型
同归对评估节点的输出,得到模型的准确率(或错误率)从而来描述模型的好坏

print("cost=",sess.run(cost,feed_dict={X:train_X,Y:train_Y}),"W=",sess.run(W),"b=",sess.run(b))

print("cost=",cost.eval({X:train_x,Y:train_y}))

使用模型
与测试模型类似,将损失值的节点换成输出的节点即可,一般要把生成的模型保存起来,再通过载入已有的模型来进行实际的使用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值