tenorflow学习--21个项目入门深度学习

tensorflow计算流程

定义计算图(包括变量和占位符表示的数据),使用会话执行定义好的运算图,会话用run()函数传入最终被计算的节点,tensorflow会自动计算剩下所依赖的节点(每一个节点代表一个操作,属性用张量来表示),使用完会话后,需要关闭会话,避免造成资源泄露。

一、加载数据

Tensorflow 数据读取有三种方式:

  • Preloaded data: 预加载数据
  • Feeding: 用占位符表示数据,启动session时再把数据喂给后端
  • Reading from file: 从文件中直接读取

优缺点
1、预加载:将数据直接内嵌到Graph中,再把Graph传入Session中运行。当数据量比较大时,Graph的传输会遇到效率问题。
2、用占位符替代数据,待运行的时候填充数据。
3、前两种方法很方便,但是遇到大型数据的时候就会很吃力,即使是Feeding,中间环节的增加也是不小的开销,比如数据类型转换等等。最优的方案就是在Graph定义好文件读取的方法,让TF自己去从文件中读取数据,并解码成可使用的样本集。

1、从文件中直接读取

1先创建文件队列

filename_queue = tf.train.string_input_producer(filenames)

2再创建内存队列

threads = tf.train.start_queue_runners(sess=sess)

文件队列,通过tf.train.string_input_producer()函数来创建,文件名队列不包含文件的具体内容,只是在队列中记录所有的文件名,所以可以在这个函数中对文件设置多个epoch,并对其进行shuffle。这个函数只是创建一个文件队列,并指定入队的操作由几个线程同时完成。真正的读取文件名内容是从执行了tf.train.start_queue_runners()开始的,start_queue_runners返回一个op,一旦执行这个op,文件名队列就开始被填充了

2、先产生数据,再把数据喂给后端

流程:打开一个session --> 喂数据 --> 计算y (先定义图,数据用占位符表示,数据在调用session时用feed_dict传入)*

import tensorflow as tf  
#设计Graph  
x1 = tf.placeholder(tf.int16)  
x2 = tf.placeholder(tf.int16)  
y = tf.add(x1, x2)  
#用Python产生数据  
li1 = [2, 3, 4]  
li2 = [4, 0, 1]  
#打开一个session --> 喂数据 --> 计算y  
with tf.Session() as sess:  
    print sess.run(y, feed_dict={x1: li1, x2: li2})  

3、预加载数据

流程:打开一个session --> 计算y (图和数据一起定义,然后调用session)

import tensorflow as tf  
#设计Graph  
x1 = tf.constant([2, 3, 4])  
x2 = tf.constant([4, 0, 1])  
y = tf.add(x1, x2)  
#打开一个session --> 计算y  
with tf.Session() as sess:  
    print sess.run(y) 

数据增强

对于图像类型的训练、数据,所谓的数据增强( Data Augmentation )方法
是指利用平移,缩放、颜色,变躁,从而人工增大训练集样本的个数从而获得
更充足的训练数据,使模型训练的效果更好,使用数据增强可以大大提高模型的泛化能力,并且能够预防过拟台

  • 平移 :将图像在一定尺度范围内平移。
  • 旋转 :将图像在一定角度范围内旋转。
  • 翻转 :水平翻转或上下翻转图像。
  • 裁剪 :在原有图像上裁剪出一块。
  • 缩放 :将图像在一定尺度内放大或缩小。
  • 颜色变隐:对图像的 RGB 颜色空间进行一些变换。
  • 噪声扰动:给国像加入一些人工生成的躁声。

代码实例

cropped_image = tf.image.crop_to_bounding_box(image, 20, 20, 256, 256) #剪切
flipped_image = tf.image.flip_left_right(image) #水平翻转
flipped_image = tf.image.flip_up_down(image) #垂直翻转
rotated_image = tf.image.rot90(image, k=1) #旋转

二、定义变量和占位符(都是tensor)

变量一般是计算过程中可以改变的值,变量需要初始化,存储模型的参数

W = tf.Variable(tf.zeros([784, 10]))
b是又一个Softmax模型的参数,我们一般叫做“偏置项”(bias)。
b = tf.Variable(tf.zeros([10]))
y=W+b
init=tf.initialize_all_vaariables()##定义初始化全部变量操作新版使用global_variables_initializer()
sess.run(init)

占位符一般是数据和标签,是用户自行传递的,创建x,x是一个占位符(placeholder),代表待识别的图片 ,feed_dict给占位符

x = tf.placeholder(tf.float32, [None, 784])

变量和张量
变量声明的函数会被当做一个运算处理,这个运算结果就是张量(具有三个属性,name,shape,dypte)

tf.get_variable函数原型

    tf.get_variable(name, shape=None, dtype=None, initializer=None, regularizer=None, 
    trainable=True, collections=None, caching_device=None, partitioner=None, validate_shape=True, 
    custom_getter=None)
参数介绍:

 1. name:新变量或现有变量的名称,这个参数是必须的,函数会根据变量名称去创建或者获取变量
 2. shape:新变量或现有变量的形状或者维度。
 3. dtype:新变量或现有变量的类型(默认为 DT_FLOAT)。
 4. initializer:创建变量的初始化器,初始化变量。初始化的方式在下面会有一个归
 5. regularizer:一个函数(张量 - >张量或无);将其应用于新创建的变量的结果将被添加到集合 tf.GraphKeys.REGULARIZATION_LOSSES 中,并可用于正则化。
 6. trainable:如果为 True,还将变量添加到图形集合
 7. GraphKeys.TRAINABLE_VARIABLES。
 8. collections:要将变量添加到其中的图形集合键的列表。默认为 [GraphKeys.LOCAL_VARIABLES]。
 9. partitioner:(可选)可调用性,它接受要创建的变量的完全定义的 TensorShape 和 dtype,并且返回每个坐标轴的分区列表(当前只能对一个坐标轴进行分区)
 10. validate_shape:如果为假,则允许使用未知形状的值(也就是shape=[],方括号里面不填任何东西,包括空格)初始化变量。如果为真,则默认情况下,initial_value 的形状必须是已知的。
 11. use_resource:如果为假,则创建一个常规变量。如果为真,则创建一个实验性的 ResourceVariable,而不是具有明确定义的语义。默认为假(稍后将更改为真)。

**initializer是变量初始化的方式,初始化的方式有以下几种:**

 - tf.constant_initializer:常量初始化函数
 - tf.random_normal_initializer:正态分布
 - tf.truncated_normal_initializer:截取的正态分布
 - tf.random_uniform_initializer:均匀分布
 - tf.zeros_initializer:全部是0
 - tf.ones_initializer:全是1
 - tf.uniform_unit_scaling_initializer:满足均匀分布,但不影响输出数量级的随机值

基于这两个函数的特性,当我们需要共享变量的时候,需要使用tf.get_variable()。在其他情况下,这两个的用法是一样的

三、定义优化指标称为成本(cost)或损失(loss)

尽量最小化这个指标,要求TensorFlow用梯度下降算法(gradient descent algorithm)以0.01的学习速率最小化交叉熵。梯度下降算法(gradient descent algorithm)是一个简单的学习过程,TensorFlow只需将每个变量一点点地往使成本不断降低的方向移动。

cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

四、初始化变量,启动session(会话)

Session会话是tensorflow里面的重要机制,tensorflow构建的计算图必须通过Session会话才能执行,如果只是在计算图中定义了图的节点但没有使用Session会话的话,就不能运行该节点。前面两步已经构造好了运算图和节点,只有通过session才能计算tensor的值
启动session有两种方式

第一种,标准形式,使用结束,需要关闭会话
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

第二种 ,用with/as形式,不需要关闭会话
with tf.Session() as sess:
       sess.run(tf.initialize_all_variables())

五、训练模型

训练1000次,迭代train_step

for i in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

六、评估模型

七、保存模型

猜你喜欢

转载自blog.csdn.net/qq_39751437/article/details/88258765