代码学习笔记(一)
卷积模块
tf.keras.layers.Conv2D
用于描述卷积层,卷积层的作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器。
outputs = tf.keras.layers.Conv2D(filters=filters,
kernel_size=(1, 3),
strides=(1, 1),
padding="same",
activation=None)(inputs)
参数 | 描述 |
---|
filters | 卷积过滤器的数量,对应输出的维数–卷积核的数目(即输出的维度) | kernel_size | 过滤器的大小,单个整数或由两个整数构成的list/tuple,表示卷积核的宽度和长度。如果为单个整数,则表示在各个空间维度的相同长度。 | strides | 横向和纵向的步长,单个整数或由两个整数构成的list/tuple,为卷积的步长。如果为一个整数则横向和纵向相同步长。任何不为1的strides均与任何不为1的dilation_rata均不兼容 | padding | 补0策略,为"valid",“same”。“valid”代表只进行有效的卷积,即对边界数据不处理。“same”代表保留边界处的卷积结果,通常会导致输出shape与输入shape相同。 | activation | 激活函数,如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:a(x)=x) | inputs | 把上一层的输出作为输入(直接将上一层作为参数输入即可) |
tf.keras.layers.LeakyReLU
激活函数:在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。 引入激活函数是为了增加神经网络模型的非线性。 如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。 如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
outputs = tf.keras.layers.LeakyReLU()(outputs)
一些复杂的激活函数如:Leaky ReLU、PReLU是不可以这样直接使用的,必须使用add方法将高级激活函数作为层(layer)来使用. 这里我们在卷积层中去掉激活函数的参数,并在卷积层后加入高级激活层
注意力机制
作为一种资源分配方案,将有限的计算资源用来处理更重要的信息,是解决信息超载的重要手段。
inputs.shape.as_list()
用于tensor来返回shape,但是是一个元组,需要通过as_list()的操作转换成list.
tf.keras.layers.AveragePooling2D
平均池化(average pooling):计算图像区域的平均值作为该区域池化后的值。
参数 | 描述 |
---|
pool_size | 2个整数的整数或元组/列表:(pool_height,pool_width),用于指定池窗口的大小;可以是单个整数,以指定所有空间维度的相同值. | strides | 2个整数的整数或元组/列表,指定池操作的步幅.可以是单个整数,以指定所有空间维度的相同值. | padding | 一个字符串,填充方法:“'valid”或“same”,不区分大小写. |
属性:input 检索图层的输入张量.
只适用于图层只有一个输入,即如果它连接到一个输入层.
返回:
输入张量或输入张量列表.
可能引发的异常:
AttributeError:如果图层连接到多个输入图层. RuntimeError:如果在Eager模式下调用. AttributeError:如果找不到入站节点.
tf.transpose
outputs = tf.transpose(outputs, [0, 1, 3, 2])
置换 outputs,根据 [0,1,3,2] 重新排列尺寸.
tf.keras.layers.Multiply
该层接收一个列表的同shape张量,并返回它们的逐元素积的张量,shape不变。
特征提取层
tf.keras.layers.MaxPooling2D
最大池化(max pooling):选图像区域的最大值作为该区域池化后的值。 池化层:池化层是模仿人的视觉系统对数据进行降维,用更高层次的特征表示图像。 实施池化的目的: (1) 降低信息冗余; (2) 提升模型的尺度不变性、旋转不变性; (3) 防止过拟合。 无论max pooling还是mean pooling,都没有需要学习的参数。因此,在卷积神经网络的训练中,Pooling层需要做的仅仅是将误差项传递到上一层,而没有梯度的计算。
特征提取
tf.keras.layers.Flatten
用于将输入层的数据压成一维的数据,一般用在卷积层和全连接层之间(因为全连接层只能接收一维数据,而卷积层可以处理二维数据,就是全连接层处理的是向量,而卷积层处理的是矩阵)
对信号做快速傅里叶变换
FFT的基本思想是把原始的N点序列,依次分解成一系列的短序列。充分利用DFT计算式中指数因子 所具有的对称性质和周期性质,进而求出这些短序列相应的DFT并进行适当组合,达到删除重复计算,减少乘法运算和简化结构的目的。
tf.reshape
函数的作用是将tensor变换为参数shape形式,其中的shape为一个列表形式,特殊的是列表可以实现逆序的遍历,即list(-1).-1所代表的含义是我们不用亲自去指定这一维的大小,函数会自动进行计算,但是列表中只能存在一个-1。(如果存在多个-1,就是一个存在多解的方程)
tf.pad
tf.pad( tensor,paddings, mode='CONSTANT',name=None)
填充函数 tensor是要填充的张量 padings ,代表每一维填充多少行/列,它的维度一定要和tensor的维度是一样的,这里的维度不是传统上数学维度,如[[2,3,4],[4,5,6]]是一个3乘4的矩阵,但它依然是二维的,所以pad只能是[[1,2],[1,2]]这种。
tf.abs
计算张量的绝对值.
tf.signal.fft
tf.signal.rfft(
input_tensor, fft_length=None, name=None
)
tf.cast
tf.cast()函数的作用是执行 tensorflow 中张量数据类型转换,比如读入的图片如果是int8类型的,一般在要在训练前把图像的数据格式转换为float32。
cast(x, dtype, name=None)
全连接层
全连接层在整个网络卷积神经网络中起到“特征提取器”的作用。如果说卷积层、池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样本的标记空间的作用。
tf.keras.layers.Dense
tf.keras.layers.Dense( units, # 正整数,输出空间的维数
activation=None, # 激活函数,不指定则没有)
tf.keras.layers.Dropout
tf.keras.layers.Dropout(rate)
作用:将Dropout应用于输入 Dropout层在训练期间的每一步中将输入单位随机设置为0,频率为速率,这有助于防止过拟合。 未设置为0的输入将按1 /(1-rate)放大,以使所有输入的总和不变。 请注意,仅当训练设置为True时才应用Dropout层,以便在推理过程中不会丢弃任何值。 使用model.fit时,训练将自动适当地设置为True,在其他情况下,可以在调用图层时将kwarg显式设置为True。 (这与为Dropout图层设置trainable = False形成对比。trainable不会影响该图层的行为, 因为Dropout没有任何可以在训练期间冻结的变量/权重。)
网络结构
tf.keras.layers.Concatenate
作用是:它接受一个张量列表作为输入,除了连接轴外,所有的张量形状都相同,返回一个张量,它是所有输入的连接。
损失函数
tf.keras.losses.CategoricalCrossentropy
计算标签和预测之间的交叉熵损失。
度量函数
tf.keras.metrics.CategoricalAccuracy
用于度量测试集的准确率。 (无论是训练还是评估,loss是都会保存在history中的,也即可以当做loss是默认的评估指标;但是我们还可以指定另外的评估指标,一般情况下都是使用训练和测试精度accuracy这个指标,也即在history中保留住每个epoch的训练精度;当然也可以使用交叉熵crossentropy这个指标,每个epoch都计算一下此次循环里的output和label的平均交叉熵。)
训练过程
tf.GradientTape
tf.GradientTape () 是一个自动求导的记录器。 只要进入了 with tf.GradientTape () as tape 的上下文环境,则在该环境中计算步骤都会被自动记录。
model.trainable_variables
查看管理变量的函数
tape.gradient
GradientTape是eager模式下计算梯度用的,而eager模式(eager模式的具体介绍请参考文末链接)是TensorFlow 2.0的默认模式。 通过GradientTape可以对损失的计算过程、计算方式进行深度定制,即所谓的Custom training, 而不仅仅是通过model.train这样过于高级(傻白甜)的API的方式进行训练。这在很多场合下是非常有用的。
apply_gradients
该函数的作用是将compute_gradients()返回的值作为输入参数对variable进行更新。
tf.keras.optimizers.Adam
其大概的思想是开始的学习率设置为一个较大的值,然后根据次数的增多,动态的减小学习率,以实现效率和效果的兼得。
|