Tensorflow函数学习笔记

Tensorflow各个神奇的函数功能学习

Tensorflow的tf.nn.conv2d方法

1 方法定义

tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

2 参数:

  • input : 输入的要做卷积的图片,要求为一个张量,shape为 [ batch, in_height, in_weight, in_channel ],其中batch为图片的数量,in_height 为图片高度,in_weight 为图片宽度,in_channel 为图片的通道数,灰度图该值为1,彩色图为3。(也可以用其它值,但是具体含义不是很理解)
  • filter: 卷积核,要求也是一个张量,shape为 [ filter_height, filter_weight, in_channel, out_channels ],其中 filter_height 为卷积核高度,filter_weight 为卷积核宽度,in_channel 是图像通道数 ,和 input 的 in_channel 要保持一致,out_channel 是卷积核数量。
  • strides: 卷积时在图像每一维的步长,这是一个一维的向量,[ 1, strides, strides, 1],第一位和最后一位固定必须是1。(还不了解为什么一位就可以确定的事情需要四个数字确定,之后再看)
  • padding: string类型,值为“SAME” 和 “VALID”,表示的是卷积的形式,是否考虑边界。”SAME”是考虑边界,不足的时候用0去填充周围,”VALID”则不考虑
  • use_cudnn_on_gpu: bool类型,是否使用cudnn加速,默认为true

Tensorflow的tf.nn.zero_fraction()方法

Tensorflow-tf.nn.zero_fraction()的作用是将输入的Tensor中0元素在所有元素中所占的比例计算并返回,因为relu激活函数有时会大面积的将输入参数设为0,所以此函数可以有效衡量relu激活函数的有效性。

1
2
3
4
import tensorflow as tf
sess = tf.Session()
x = [[0, 0, 1, 2], [10, 0, 11, 21]]
print(sess.run(tf.nn.zero_fraction(x)))

Tensorflow的tf.nn.max_pool最大池化方法

tf.nn.max_pool(value, ksize, strides, padding, name=None)

参数是四个,和卷积很类似:

第一个参数value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape

第二个参数ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1

第三个参数strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]

第四个参数padding:和卷积类似,可以取’VALID’ 或者’SAME’

返回一个Tensor,类型不变,shape仍然是[batch, height, width, channels]这种形式

Tensorflow的生成随机权重方法

  1. tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

    截断的正态分布中输出随机值。
    生成的值服从具有指定平均值和标准偏差的正态分布,如果生成的值大于平均值2个标准偏差的值则丢弃重新选择。

    在正态分布的曲线中,横轴区间(μ-σ,μ+σ)内的面积为68.268949%。
    横轴区间(μ-2σ,μ+2σ)内的面积为95.449974%。
    横轴区间(μ-3σ,μ+3σ)内的面积为99.730020%。
    X落在(μ-3σ,μ+3σ)以外的概率小于千分之三,在实际问题中常认为相应的事件是不会发生的,基本上可以把区间(μ-3σ,μ+3σ)看作是随机变量X实际可能的取值区间,这称之为正态分布的“3σ”原则。
    在tf.truncated_normal中如果x的取值在区间(μ-2σ,μ+2σ)之外则重新进行选择。这样保证了生成的值都在均值附近。

    参数:

  • shape: 一维的张量,也是输出的张量。
  • mean: 正态分布的均值。
  • stddev: 正态分布的标准差。
  • dtype: 输出的类型。
  • seed: 一个整数,当设置之后,每次生成的随机数都一样。
  • name: 操作的名字。
  1. tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

    从正态分布中输出随机值。
    参数:

    • shape: 一维的张量,也是输出的张量。
    • mean: 正态分布的均值。
    • stddev: 正态分布的标准差。
    • dtype: 输出的类型。
    • seed: 一个整数,当设置之后,每次生成的随机数都一样。
    • name: 操作的名字。

tf.strided_slice:

1
2
3
4
5
6
7
8
9
10
11
def strided_slice(input_,
begin,
end,
strides=None,
begin_mask=0,
end_mask=0,
ellipsis_mask=0,
new_axis_mask=0,
shrink_axis_mask=0,
var=None,
name=None):

tf.slice(data, begin, end)
和tf.slice的区别是slice的end索引是闭区间,stride_slice的end索引是开区间(不包含范围本身),所以一个截掉最后一列(remove the last element or column of each line)的小技巧是用stride_slice(data, [0, 0], [rows, -1]),但是如果是用slice(data, [0, 0], [rows, -1])则仍是原矩阵。

begin、end、stride都是3维的向量,分别代表取行、取列、取通道,例如:

TIM截图20181008185313

tf.app.flags.DEFINE_:

tf.app.flags.DEFINE_xxx()就是添加命令行的optional argument(可选参数),而tf.app.flags.FLAGS可以从对应的命令行参数取出参数

同时,使得程序在使用命令行运行程序时,可以通过命令行添加程序参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import tensorflow  as tf
FLAGS=tf.app.flags.FLAGS
tf.app.flags.DEFINE_float(
'flag_float', 0.01, 'input a float')
tf.app.flags.DEFINE_integer(
'flag_int', 400, 'input a int')
tf.app.flags.DEFINE_boolean(
'flag_bool', True, 'input a bool')
tf.app.flags.DEFINE_string(
'flag_string', 'yes', 'input a string')

print(FLAGS.flag_float)
print(FLAGS.flag_int)
print(FLAGS.flag_bool)
print(FLAGS.flag_string)

tf.transpose():

def transpose(a, perm=None, name=”transpose”):
“””Transposes a. Permutes the dimensions according to perm.
a:是传入的数组

perm:控制转置的操作,以perm = [0,1,2] 3个维度的数组为例, 0—代表的是最外层的一维, 1—代表外向内数第二维, 2—代表最内层的一维,这种perm是默认的值.现在以如下输入数组来理解这个函数和参数perm

input_x = [
​ [
​ [1, 2, 3, 4],
​ [5, 6, 7, 8],
​ [9, 10, 11, 12]
​ ],
​ [
​ [13, 14, 15, 16],
​ [17, 18, 19, 20],
​ [21, 22, 23, 24]
​ ]

]

input_x 是一个 2x3x4的一个tensor, 假设perm = [1,0,2], 就是将最外2层转置,得到tensor应该是3x2x4的一个张量

TensorFlow的image图像预处理

图像翻转

tf.image.flip_up_down:上下翻转
tf.image.flip_left_right:左右翻转
tf.image.transpose_image:对角线翻转
除此之外,TensorFlow还提供了随机翻转的函数,保证了样本的样本的随机性:
tf.image.random_flip_up_down:随机上下翻转图片
tf.image.random_flip_left_right:随机左右翻转图片

图像色彩调整

亮度:
tf.image.adjust_brightness:调整图片亮度
tf.image.random_brightness:在某范围随机调整图片亮度
对比度:
tf.image.adjust_contrast:调整图片对比度
tf.image.random_contrast:在某范围随机调整图片对比度
色相:
tf.image.adjust_hue:调整图片色相
tf.image.random_hue:在某范围随机调整图片色相
饱和度:
tf.image.adjust_saturation:调整图片饱和度
tf.image.random_saturation:在某范围随机调整图片饱和度
归一化:
per_image_standardization:三维矩阵中的数字均值变为0,方差变为1。在以前的版本中,它其实叫做per_image_whitening,也就是白化操作。

图像尺寸调整
图像尺寸调整属于基础的图像几何变换,TensorFlow提供了几种尺寸调整的函数:
tf.image.resize_images:将原始图像缩放成指定的图像大小,其中的参数method(默认值为ResizeMethod.BILINEAR)提供了四种插值算法,具体解释可以参考图像几何变换(缩放、旋转)中的常用的插值算法
tf.image.resize_image_with_crop_or_pad:剪裁或填充处理,会根据原图像的尺寸和指定的目标图像的尺寸选择剪裁还是填充,如果原图像尺寸大于目标图像尺寸,则在中心位置剪裁,反之则用黑色像素填充。
tf.image.central_crop:比例调整,central_fraction决定了要指定的比例,取值范围为(0,1],该函数会以中心点作为基准,选择整幅图中的指定比例的图像作为新的图像。

Tensorflow查看变量

1 变量数值

​ 用tf.Session()函数

1
2
3
4
5
import tensorflow as tf
sess=tf.Session()
w1=tf.Variable(5,dtype=tf.int32)
sess.run(tf.global_variables_initializer())
print(sess.run(w1))

​ 或者用with结构

1
2
3
4
5
import tensorflow as tf
w1=tf.Variable(5,dtype=tf.int32) 
with tf.Session() as sess:
  sess.run(tf.global_variables_initializer()) 
  print(sess.run(w1))

2 变量维度

1
tensor.get_shape().as_list()

tf.gradients:

https://blog.csdn.net/hustqb/article/details/80260002

参考:

图像预处理之图像翻转、图像色彩调整、图像尺寸调整

如何输出查看tensorflow内的变量值

0%