TensorFlow实用技术用例总结

Tensor变换

Tensor reduce:

axis等于几,就是对那维操作,i.e.:沿着那维操作, 其它维度保留

import tensorflow as tf

tensor=tf.ones(shape=[2,3,4],dtype=tf.float32,name="oneTensor")
reduce1=tf.reduce_sum(tensor,axis=0)
reduce2=tf.reduce_sum(tensor,axis=1)

with tf.Session() as sess:
    print(sess.run(reduce1))
    print(sess.run(reduce2))

Tensor连接

concat是将list中的向量给连接起来,axis表示将那维的数据连接起来,而其他维的结构保持不变

import tensorflow as tf

t1 = tf.ones(shape=[2,3],dtype=tf.float32)
t2 = tf.ones(shape=[2,3],dtype=tf.float32)

# 将t1, t2进行concat,axis为0,等价于将shape=[2, 2, 3]的Tensor concat成
#shape=[4, 3]的tensor。在新生成的Tensor中tensor[:2,:]代表之前的t1
#tensor[2:,:]是之前的t2
t3=tf.concat([t1, t2], 0)

# 将t1, t2进行concat,axis为1,等价于将shape=[2, 2, 3]的Tensor concat成
#shape=[2, 6]的tensor。在新生成的Tensor中tensor[:,:3]代表之前的t1
#tensor[:,3:]是之前的t2
t4=tf.concat([t1, t2], 1)

with tf.Session() as sess:
    print(sess.run(t3))
    print(sess.run(t4))

Tensor降维

降维, 将维度为1 的降掉

import tensorflow as tf

t1 = tf.ones(shape=[2,1,3],dtype=tf.float32)
t2=tf.squeeze(t1)

with tf.Session() as sess:
    print(sess.run(t1))
    print(sess.run(t2))

Tensor切分split

import tensorflow as tf

t1 = tf.ones(shape=[2,4],dtype=tf.float32)
t2=tf.split(value=t1,num_or_size_splits=2,axis=1)

with tf.Session() as sess:
    print(sess.run(t1))
    print(sess.run(t2))

Tensor维度扩展

一次扩展一维

import tensorflow as tf

t1 = tf.ones(shape=[2,4],dtype=tf.float32)
t2=tf.expand_dims(t1,axis=0)
shape=tf.shape(t2)
with tf.Session() as sess:
    print(sess.run(t1))
    print(sess.run(shape))
    print(sess.run(t2))

Tensor切分Slice

tf.slice()最好是从返回值上去理解,现在假设input的shape是[a1, a2, a3], begin的值是[b1, b2, b3],size的值是[s1, s2, s3],那么tf.slice()返回的值就是 input[b1:b1+s1, b2:b2+s2, b3:b3+s3]。 如果 si=−1 ,那么 返回值就是 input[b1:b1+s1,..., bi: ,...] input[1:2] 取不到input[2]

import tensorflow as tf
import numpy as np
sess = tf.InteractiveSession()
a = np.array([[1,2,3,4,5],[4,5,6,7,8],[9,10,11,12,13]])
print(tf.slice(a,[1,2],[-1,2]).eval())

Tensor堆叠

tf.stack(values, axis=0, name=’stack’)

将 a list of R 维的Tensor堆成 R+1维的Tensor

import tensorflow as tf
x = tf.constant([1, 4])
y = tf.constant([2, 5])
z = tf.constant([3, 6])
t3=tf.stack([x, y, z])  # [[1, 4], [2, 5], [3, 6]] (Pack along first dim.)
t4=tf.stack([x, y, z], axis=1)  # [[1, 2, 3], [4, 5, 6]]
sess = tf.InteractiveSession()
print(t3.eval())
print(t4.eval())

gather按照索引抽取数据

import tensorflow as tf
input = [[[1, 1, 1], [2, 2, 2]],
         [[3, 3, 3], [4, 4, 4]],
         [[5, 5, 5], [6, 6, 6]]]
out=tf.gather(input, [0, 1], axis=0)
sess = tf.InteractiveSession()
print(out.eval())

pad Tensor填存

padings 也是一个张量,代表每一维填充多少行/列,但是有一个要求它的rank一定要和tensor的rank是一样的

mode 可以取三个值,分别是”CONSTANT” ,”REFLECT”,”SYMMETRIC”

mode=”CONSTANT” 是填充0

mode=”REFLECT”是映射填充,上下(1维)填充顺序和paddings是相反的,左右(零维)顺序补齐

mode=”SYMMETRIC”是对称填充,上下(1维)填充顺序是和paddings相同的,左右(零维)对称补齐

import tensorflow as tf
t = tf.constant([[1, 2, 3], [4, 5, 6]])
paddings = tf.constant([[1, 1], [2, 2]])
#可以看到,上,下,左,右分别填充了1,1,2,2行刚好和paddings=[[1,1],[2,2]]相等,零填充
out1=tf.pad(t, paddings, "CONSTANT")    # [[0, 0, 0, 0, 0, 0, 0],
                                        #  [0, 0, 1, 2, 3, 0, 0],
                                        #  [0, 0, 4, 5, 6, 0, 0],
                                        #  [0, 0, 0, 0, 0, 0, 0]]

out2=tf.pad(t, paddings, "REFLECT")     # [[6, 5, 4, 5, 6, 5, 4],
                                        #  [3, 2, 1, 2, 3, 2, 1],
                                        #  [6, 5, 4, 5, 6, 5, 4],
                                        #  [3, 2, 1, 2, 3, 2, 1]]

out3=tf.pad(t, paddings, "SYMMETRIC")   # [[2, 1, 1, 2, 3, 3, 2],
                                        #  [2, 1, 1, 2, 3, 3, 2],
                                        #  [5, 4, 4, 5, 6, 6, 5],
                                        #  [5, 4, 4, 5, 6, 6, 5]]
sess = tf.InteractiveSession()
print(out1.eval())
print(out2.eval())
print(out3.eval())

图像处理

数据预处理,数据增强。

在深度学习中,当数据量不够大时候,经常通过人工增加训练集的大小。不同的任务背景下, 我们可以通过图像的几何变换, 使用以下一种或多种组合数据增强变换来增加输入数据的量. 这里具体的方法都来自数字图像处理的内容:

1. 旋转|反射变换(Rotation/reflection):随机旋转图像一定角度; 改变图像内容的朝向;
2. 翻转变换(flip): 沿着水平或者垂直方向翻转图像;
3. 缩放变换(zoom): 按照一定的比例放大或者缩小图像;
4. 平移变换(shift): 在图像平面上对图像以一定方式进行平移; 可以采用随机或人为定义的方式指定平移范围和平移步长, 沿水平或竖直方向进行平移. 改变图像内容的位置;
5. 尺度变换(scale): 对图像按照指定的尺度因子, 进行放大或缩小; 或者参照SIFT特征提取思想, 利用指定的尺度因子对图像滤波构造尺度空间. 改变图像内容的大小或模糊程度;
6. 对比度变换(contrast): 在图像的HSV颜色空间,改变饱和度S和V亮度分量,保持色调H不变. 对每个像素的S和V分量进行指数运算(指数因子在0.25到4之间), 增加光照变化;
7. 噪声扰动(noise): 对图像的每个像素RGB进行随机扰动, 常用的噪声模式是椒盐噪声和高斯噪声;
8. 颜色变换(color): 在训练集像素值的RGB颜色空间进行PCA,
得到RGB空间的3个主方向向量,3个特征值, p1, p2, p3, λ1, λ2, λ3.
对每幅图像的每个像素Ixy=[IRxy,IGxy,IBxy]T进行加上如下的变化:[p1,p2,p3][α1λ1,α2λ2,α3λ3]T;其中:αi是满足均值为0,方差为0.1的随机变量.

Tensorflow关于图像操作的类别有:编码/解码、缩放、裁剪、翻转和移位、图像调整。

任何神经网络在开始训练数据时,都需要数据增强。什么是数据增强呢?我们首先看一个例子,假如我们的训练集有10万图片,如果直接使用这10张图片进行训练,是不是感觉训练集有点小。在假如,训练神经网络的目的是要正确识别猫,而此时呢?你的训练集中含有猫头的图片都是朝着左侧倾斜,那么当你训练好模型之后,你的模型不能准确识别猫头朝着右侧倾斜的图片,因为它没有被训练。而假如你在训练输入时,将训练集合中的所有图片进行水平翻转,就会得到10万新的数据,此时你就有20万张训练集合了。如果在进行随机裁剪、亮度、对比度变化,这又大大增加训练集合的数量,最终训练的集合更加健壮。这就是数据增强的作用:将单幅图片增加多个副本,提高了图片的利用率,并且防止对某一张图片结构的学习过拟合。

训练数据读取

模型Inference

可视化

Slim编程

    原文作者:武维
    原文地址: https://zhuanlan.zhihu.com/p/34622909
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞