卷积操作
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
除去name参数用以指定该操作的name,与方法有关的一共五个参数:
-
input:
指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一; -
filter:
相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维;表示的是卷积层的权重,权重的类型必须与数据的类型一致。 -
strides:
卷积时在图像每一维的步长,这是一个一维的向量,长度4 - padding: string类型的量,只能是”SAME”,”VALID”其中之一,这个值决定了不同的卷积方式,选项为"SAME"或"VALID",其中"SAME"表示添加全0填充,保证卷积前输入的矩阵和卷积后的输出矩阵大小一致,"VALID"表示不添加。
- use_cudnn_on_gpu: bool类型,是否使用cudnn加速,默认为true
结果返回一个Tensor,这个输出,就是我们常说的feature map
防止过拟合
tf.nn.dropout(x,keep_prob,noise_shape=None,seed=None, name=None)
l x:指输入,输入tensor
l keep_prob: float类型,每个元素被保留下来的概率,设置神经元被选中的概率,在初始化时keep_prob是一个占位符, keep_prob = tf.placeholder(tf.float32) 。tensorflow在run时设置keep_prob具体的值,例如keep_prob: 0.5
l noise_shape : 一个1维的int32张量,代表了随机产生“保留/丢弃”标志的shape。
l seed : 整形变量,随机数种子。
l name:指定该操作的名字
dropout必须设置概率keep_prob,并且keep_prob也是一个占位符,跟输入是一样的
keep_prob = tf.placeholder(tf.float32)
train的时候才是dropout起作用的时候,test的时候不应该让dropout起作用
tf.truncated_normal(shape,mean=0.0, stddev=1.0,dtype=tf.float32,seed=None,name=None)
从截断的正态分布中输出随机值。生成的值遵循具有指定平均值和标准偏差的正态分布,不同之处在于其平均值大于 2 个标准差的值将被丢弃并重新选择。
l shape:一维整数张量或 Python 数组,输出张量的形状。
l mean:dtype 类型的 0-D 张量或 Python 值,截断正态分布的均值。
l stddev:dtype 类型的 0-D 张量或 Python 值,截断前正态分布的标准偏差。
l dtype:输出的类型。
l seed:一个 Python 整数。用于为分发创建随机种子。查看tf.set_random_seed行为。
l name:操作的名称(可选)。
函数返回值:tf.truncated_normal函数返回指定形状的张量填充随机截断的正常值。
最大值池化操作
tf.nn.max_pool(value, ksize, strides, padding, name=None)
参数是四个,和卷积很类似:
l value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape
l ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1
l strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]
l padding:和卷积类似,可以取'VALID' 或者'SAME'
返回一个Tensor,类型不变,shape仍然是[batch, height, width, channels]这种形式
两个矩阵中对应元素各自相乘
tf.multiply(x, y, name=None)
参数:
l x: 一个类型为:half, float32, float64, uint8, int8, uint16, int16, int32, int64, complex64, complex128的张量。
l y: 一个类型跟张量x相同的张量。
返回值: x * y element-wise.
注意:
(1) multiply这个函数实现的是元素级别的相乘,也就是两个相乘的数元素各自相乘,而不是矩阵乘法,注意和tf.matmul区别。
(2) 两个相乘的数必须有相同的数据类型,不然就会报错。
将矩阵a乘以矩阵b,生成a * b。
tf.matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=None)
参数:
l a: 一个类型为 float16, float32, float64, int32, complex64, complex128 且张量秩 > 1 的张量。
l b: 一个类型跟张量a相同的张量。
l transpose_a: 如果为真, a则在进行乘法计算前进行转置。
l transpose_b: 如果为真, b则在进行乘法计算前进行转置。
l adjoint_a: 如果为真, a则在进行乘法计算前进行共轭和转置。
l adjoint_b: 如果为真, b则在进行乘法计算前进行共轭和转置。
l a_is_sparse: 如果为真, a会被处理为稀疏矩阵。
l b_is_sparse: 如果为真, b会被处理为稀疏矩阵。
l name: 操作的名字(可选参数)
返回值:一个跟张量a和张量b类型一样的张量且最内部矩阵是a和b中的相应矩阵的乘积。
注意:
(1)输入必须是矩阵(或者是张量秩 >2的张量,表示成批的矩阵),并且其在转置之后有相匹配的矩阵尺寸。
(2)两个矩阵必须都是同样的类型,支持的类型如下:float16, float32, float64, int32, complex64, complex128。
引发错误:
ValueError: 如果transpose_a 和 adjoint_a, 或 transpose_b 和 adjoint_b 都被设置为真
TF-激活函数 tf.nn.relu
tf.nn.relu(features, name = None)
作用:
计算激活函数 relu,即 max(features, 0)。即将矩阵中每行的非最大值置0。是将大于0的数保持不变,小于0的数置为0,计算修正线性单元(非常常用):max(features, 0).并且返回和feature一样的形状的tensor。
参数:
l features: tensor类型,必须是这些类型:A Tensor. float32, float64, int32, int64, uint8, int16, int8, uint16, half.
l name: :操作名称(可选)
重塑张量
reshape( tensor, shape, name=None )
参数:
- tensor:一个Tensor。
- shape:一个Tensor;必须是以下类型之一:int32,int64;用于定义输出张量的形状。
- name:操作的名称(可选)。
返回值:
该操作返回一个Tensor。与tensor具有相同的类型。
用于定义创建变量(层)的操作的上下文管理器。
_init__( name_or_scope, default_name=None, values=None, initializer=None, regularizer=None, caching_device=None, partitioner=None, custom_getter=None, reuse=None, dtype=None, use_resource=None, constraint=None, auxiliary_name_scope=True )
参数:
- name_or_scope:string或者VariableScope表示打开的范围。
- default_name:如果name_or_scope参数为None,则使用默认的名称,该名称将是唯一的;如果提供了name_or_scope,它将不会被使用,因此它不是必需的,并且可以是None。
- values:传递给操作函数的Tensor参数列表。
- initializer:此范围内变量的默认初始值设定项。
- regularizer:此范围内变量的默认正规化器。
- caching_device:此范围内变量的默认缓存设备。
- partitioner:此范围内变量的默认分区程序。
- custom_getter:此范围内的变量的默认自定义吸气。
- reuse:可以是True、None或tf.AUTO_REUSE;如果是True,则我们进入此范围的重用模式以及所有子范围;如果是tf.AUTO_REUSE,则我们创建变量(如果它们不存在),否则返回它们;如果是None,则我们继承父范围的重用标志。当启用紧急执行时,该参数总是被强制为tf.AUTO_REUSE。
- dtype:在此范围中创建的变量类型(默认为传入范围中的类型,或从父范围继承)。
- use_resource:如果为false,则所有变量都将是常规变量;如果为true,则将使用具有明确定义的语义的实验性 ResourceVariables。默认为false(稍后将更改为true)。当启用紧急执行时,该参数总是被强制为true。
- constraint:一个可选的投影函数,在被Optimizer(例如用于实现层权重的范数约束或值约束)更新之后应用于该变量。该函数必须将代表变量值的未投影张量作为输入,并返回投影值的张量(它必须具有相同的形状)。进行异步分布式培训时,约束条件的使用是不安全的。
- auxiliary_name_scope:如果为True,则我们用范围创建一个辅助名称范围;如果为False,则我们不接触名称范围。
返回值:
返回可以捕获和重用的范围。
可能引发的异常:
- ValueError:在创建范围内尝试重用时,或在重用范围内创建时。
- TypeError:某些参数的类型不合适时。
https://www.w3cschool.cn/tensorflow_python/tensorflow_python-61ue2ocp.html
计算张量的各个维度上的元素的平均值
reduce_mean(input_tensor, axis=None, keep_dims=False,name=None,reduction_indices=None )
参数:
- input_tensor:要减少的张量。应该有数字类型。
- axis:要减小的尺寸。如果为None(默认),则减少所有维度。必须在[-rank(input_tensor), rank(input_tensor))范围内。
- keep_dims:如果为true,则保留长度为1的缩小尺寸。
- name:操作的名称(可选)。
- reduction_indices:axis的不支持使用的名称。
返回:该函数返回减少的张量。numpy兼容性相当于np.mean
转换数据类型
tf.cast(x, dtype, name=None)
将x的数据格式转化成dtype.例如,原来x的数据格式是bool,
那么将其转化成float以后,就能够将其转化成0和1的序列。反之也可以
求最大值tf.reduce_max(input_tensor, reduction_indices=None, keep_dims=False, name=None)
求平均tf.reduce_mean(input_tensor, reduction_indices=None, keep_dims=False,name=None)
参数1--input_tensor:待求值的tensor。
参数2--reduction_indices:在哪一维上求解。
举例说明:
# 'x' is [[1., 2.]
# [3., 4.]]
x是一个2维数组,分别调用reduce_*函数如下:
首先求平均值:
tf.reduce_mean(x) ==> 2.5 #如果不指定第二个参数,那么就在所有的元素中取平均值
tf.reduce_mean(x, 0) ==> [2., 3.] #指定第二个参数为0,则第一维的元素取平均值,即每一列求平均值
tf.reduce_mean(x, 1) ==> [1.5, 3.5] #指定第二个参数为1,则第二维的元素取平均值,即每一行求平均值
#使用优化算法使得代价函数最小化
tf.train.AdamOptimizer
__init__(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam')
此函数是Adam优化算法:是一个寻找全局最优点的优化算法,引入了二次方梯度校正。
相比于基础SGD算法,1.不容易陷于局部优点。2.速度更快!
计算交叉熵的代价函数
reduce_sum (input_tensor , axis = None , keep_dims = False , name = None , reduction_indices = None)
此函数计算一个张量的各个维度上元素的总和。
函数中的input_tensor是按照axis中已经给定的维度来减少的;除非 keep_dims 是true,否则张量的秩将在axis的每个条目中减少1;如果keep_dims为true,则减小的维度将保留为长度1。 如果axis没有条目,则缩小所有维度,并返回具有单个元素的张量。
参数:
l input_tensor:要减少的张量。应该有数字类型。
l axis:要减小的尺寸。如果为None(默认),则缩小所有尺寸。必须在范围[-rank(input_tensor), rank(input_tensor))内。
l keep_dims:如果为true,则保留长度为1的缩小尺寸。
l name:操作的名称(可选)。
l reduction_indices:axis的废弃的名称。
返回:
该函数返回减少的张量。 numpy兼容性 相当于np.sum
对比这两个矩阵或者向量的相等的元素
tf.equal(A, B)
如果是相等的那就返回True,反正返回False,返回的值的矩阵维度和A是一样的
例如:
A = [[1,3,4,5,6]]
B = [[1,3,4,3,2]]
with tf.Session() as sess:
print(sess.run(tf.equal(A, B)))
[[ True True True False False]]
该函数将返回一个 bool 类型的张量。