当前位置:   article > 正文

【深度学习】(3) 全连接层、激活函数_全连接层到底有没有偏置

全连接层到底有没有偏置

各位同学好,今天和大家分享一下tensorflow2.0深度学习中的相关操作。内容有:

(1) 全连接层创建: tf.keras.Sequential(),tf.keras.layers.Dense()

(2) 输出方式: tf.sigmoid(),tf.softmax(),tf.tanh(),tf.nn.relu(),tf.nn.leaky_relu()


1. 全连接层

全连接层在整个网络卷积神经网络中起到特征提取器的作用。全连接层将学到的特征表示映射到样本的标记空间。

(1)在全连接层中创建一层: tf.keras.layers.Dense()

units: 正整数,输出空间的维数

activation=None: 激活函数,不指定则没有

use_bias=True: 布尔值,是否使用偏移向量

kernel_initializer='glorot_uniform': 核权重矩阵的初始值设定项

bias_initializer='zeros': 偏差向量的初始值设定项

kernel_regularizer=None: 正则化函数应用于核权矩阵

bias_regularizer=None: 应用于偏差向量的正则化函数

kernel_constraint=None: 对权重矩阵约束

bias_constraint=None: 对偏置向量约束

(2)堆层构建全连接层: tf.keras.Sequential([layer1,layer2,layer3])

通过组合层来构建模型,直接堆叠各个层


1.1 创建单个连接层

首先构造一个shape为[4,478]的随机正态分布,构造一个连接层tf.keras.layers.Dense(),输出512个特征,shape为[4,512]。将输入层放入连接层自动调用build()函数创建权重w和偏置b,将计算结果返回给out。

  1. # 创建单个连接层
  2. import tensorflow as tf
  3. # 构建输入
  4. x = tf.random.normal([4,478])
  5. # 输入的shape不需要指定,可以自动的根据输入的特征生成对应的权值
  6. net = tf.keras.layers.Dense(512)
  7. # 输出结果
  8. out = net(x)
  9. out.shape # 输出结果的shape[4,512]
  10. net.kernel.shape # 权值W的形状,W的shape为[478,512]
  11. net.bias.shape # 偏置b的形状,X的shape为[4,478]
  12. # 调用net函数时,自动判断,如果当前没有创建w和b,自动调用build函数

1.2 创建多个连接层

使用tf.keras.Sequential()堆叠构建全连接层;使用tf.keras.layers.Dense()创建每一个全连接层;使用build()构建输入层。网络结构为[b,10]=>[b,16]=>[b,32]=>[b,8];通过summary()查看整体网络架构。通过model.trainable_variables查看网络的所有的权重和偏置。

  1. #(4)创建多个全连接层
  2. # 将所有连接层组成一个列表放入
  3. from tensorflow import keras
  4. # 构建全连接层
  5. model = keras.Sequential([
  6. keras.layers.Dense(16, activation='relu'), #w的shape为[10,16],b的shape为[16],共10*16+16=176个参数
  7. keras.layers.Dense(32, activation='relu'), #w的shape为[16,32],b的shape为[32]
  8. keras.layers.Dense(8)]) #w的shape为[32,8],b的shape为[8]
  9. model.build(input_shape=[None,10]) #输入层10个特征
  10. model.summary() # 查看网络结构
  11. # 查看网络所有的权重w和偏置b
  12. for p in model.trainable_variables:
  13. print(p.name,p.shape)

整体网络构架如下:对于第一层,w的shape为[10,16],b的shape为[16],共10*16+16=176个参数 ,下面几层的参数个数同理

  1. Model: "sequential"
  2. _________________________________________________________________
  3. Layer (type) Output Shape Param #
  4. =================================================================
  5. dense (Dense) (None, 16) 176
  6. dense_1 (Dense) (None, 32) 544
  7. dense_2 (Dense) (None, 8) 264
  8. =================================================================
  9. Total params: 984
  10. Trainable params: 984
  11. Non-trainable params: 0
  12. _________________________________________________________________

2. 输出映射方式

2.1 sigmoid函数

sigmoid函数: tf.sigmoid(tensor)

输出结果的范围映射到(0,1)之间,计算公式:\frac{1}{1+e^{-x}}

sigmoid只能保证单个数值的范围在0-1之间

  1. a = tf.linspace(-6,6,10) #-6到6的长度为10的向量
  2. # sigmoid函数将其映射到0-1
  3. tf.sigmoid(a)
  4. # 输入数据:array([-6. , -4.66666667, -3.33333333, -2. , -0.66666667,0.66666667, 2. , 3.33333333, 4.66666667, 6.
  5. # 输出结果:array([0.00247262, 0.00931596, 0.0344452 , 0.11920292, 0.33924363,0.66075637, 0.88079708, 0.9655548 , 0.99068404, 0.99752738])

2.2 softmax函数

对于分类问题,需要每一个概率在0-1之间,且总的概率和为1

softmax函数:tf.softmax(logits, axis)

logits:一个非空的Tensor。必须是下列类型之一:half, float32,float64。

axis:将在其上执行维度softmax。默认值为-1,表示最后一个维度。

公式为:\sigma (z)_{j}=\frac{e^zj}{\sum_{k=1}^{K}e^{z}k} \;\;\;\; for\;\;j=1,...,K

一般将没有加激活函数的称为Logits,加了softmax后称为Probabilities,经过softmax后,有把最大值放大的过程,相当于把强的变得更强,把弱的变得更弱。

  1. logits = tf.random.uniform([1,10],minval=-2,maxval=2)
  2. # 使用softmax
  3. prob = tf.nn.softmax(logits,axis=1) #对整个列表的值求softmax
  4. # 求和
  5. tf.reduce_sum(prob,axis=1)
  6. # logits:array([[-0.80400324, 1.1189251 , 1.7390656 , 0.8317995 , -1.1970901 ,-0.48806524, -1.1161256 , -0.35890388, 0.765254 , -1.8393846 ]],dtype=float32)>
  7. # prob:array([[0.02841684, 0.19439851, 0.3614236 , 0.14588003, 0.01918051,0.03897498, 0.02079806, 0.0443486 , 0.13648833, 0.01009056]],dtype=float32)>
  8. # sum:<tf.Tensor: shape=(1,), dtype=float32, numpy=array([1.], dtype=float32)>

2.3 tanh函数

tanh是通过sigmoid函数放大平移得到,输出结果在(-1,1)之间

tanh函数: tf.tanh(tensor)

  1. a = tf.linspace(-2, 2, 5) # -2到2的长度为5的向量
  2. # 结果映射到(-1,1)
  3. tf.tanh(a)
  4. # 输入:<tf.Tensor: shape=(5,), dtype=float64, numpy=array([-2., -1., 0., 1., 2.])>
  5. # 输出:<tf.Tensor: shape=(5,), dtype=float64, numpy=array([-0.96402758, -0.76159416, 0. , 0.76159416, 0.96402758])>


2.4 relu函数

将输入小于0的值都变成0,大于0的值保持不变。

relu激活函数:tf.nn.relu(features)

公式为: f(x)=\begin{bmatrix} 0\;\,\;x<0 & \\ x \;\;\;x>=0 & \end{bmatrix}

  1. # relu函数,x小于0,梯度0,x大于0梯度1
  2. a = tf.linspace(-1,1,10) # -1到1,长度为10的向量
  3. tf.nn.relu(a)
  4. # 输入为:array([-1. , -0.77777778, -0.55555556, -0.33333333, -0.11111111, 0.11111111, 0.33333333, 0.55555556, 0.77777778, 1. ])>
  5. # 输出为:array([0. , 0. , 0. , 0. , 0. , 0.11111111, 0.33333333, 0.55555556, 0.77777778, 1. ])>

2.5 leaky_relu函数

非饱和激活函数: tf.nn.leaky_relu( features, alpha=0.2 )

features: tensor类型,表示预激活值,必须是下列类型之一:float16,float32,float64,int32,int64.

alpha: x <0时激活函数的斜率.

由于relu函数对于小于0的值,这个神经元的梯度永远都会是0,在实际操作中,如果数据很大,很可能网络中较多的神经元都死了。这时需要leaky_relu函数:

公式:y = max(0, x) + leak*min(0,x) 

leak是一个很小的常数,这样保留了一些负轴的值,使得负轴的信息不会全部丢失

  1. a = tf.linspace(-1,1,10)
  2. # tf.nn.leaky_rulu() ,x小于0y也小于0但接近0
  3. tf.nn.leaky_relu(a)
  4. # 输入:array([-1. , -0.77777778, -0.55555556, -0.33333333, -0.11111111, 0.11111111, 0.33333333, 0.55555556, 0.77777778, 1. ])>
  5. # 输出:array([-0.2 , -0.15555556, -0.11111111, -0.06666667, -0.02222222, 0.11111111, 0.33333333, 0.55555556, 0.77777778, 1. ])>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/144892
推荐阅读
相关标签
  

闽ICP备14008679号