【深度学习】(3) 全连接层、激活函数
各位同學(xué)好,今天和大家分享一下tensorflow2.0深度學(xué)習(xí)中的相關(guān)操作。內(nèi)容有:
(1) 全連接層創(chuàng)建:?tf.keras.Sequential(),tf.keras.layers.Dense()
(2) 輸出方式:?tf.sigmoid(),tf.softmax(),tf.tanh(),tf.nn.relu(),tf.nn.leaky_relu()
1. 全連接層
全連接層在整個網(wǎng)絡(luò)卷積神經(jīng)網(wǎng)絡(luò)中起到特征提取器的作用。全連接層將學(xué)到的特征表示映射到樣本的標(biāo)記空間。
(1)在全連接層中創(chuàng)建一層:?tf.keras.layers.Dense()
units: 正整數(shù),輸出空間的維數(shù)
activation=None: 激活函數(shù),不指定則沒有
use_bias=True: 布爾值,是否使用偏移向量
kernel_initializer='glorot_uniform': 核權(quán)重矩陣的初始值設(shè)定項
bias_initializer='zeros': 偏差向量的初始值設(shè)定項
kernel_regularizer=None: 正則化函數(shù)應(yīng)用于核權(quán)矩陣
bias_regularizer=None: 應(yīng)用于偏差向量的正則化函數(shù)
kernel_constraint=None: 對權(quán)重矩陣約束
bias_constraint=None: 對偏置向量約束
(2)堆層構(gòu)建全連接層:?tf.keras.Sequential([layer1,layer2,layer3])
通過組合層來構(gòu)建模型,直接堆疊各個層
1.1 創(chuàng)建單個連接層
首先構(gòu)造一個shape為[4,478]的隨機(jī)正態(tài)分布,構(gòu)造一個連接層tf.keras.layers.Dense(),輸出512個特征,shape為[4,512]。將輸入層放入連接層自動調(diào)用build()函數(shù)創(chuàng)建權(quán)重w和偏置b,將計算結(jié)果返回給out。
# 創(chuàng)建單個連接層
import tensorflow as tf
# 構(gòu)建輸入
x = tf.random.normal([4,478])
# 輸入的shape不需要指定,可以自動的根據(jù)輸入的特征生成對應(yīng)的權(quán)值
net = tf.keras.layers.Dense(512)
# 輸出結(jié)果
out = net(x)
out.shape # 輸出結(jié)果的shape[4,512]
net.kernel.shape # 權(quán)值W的形狀,W的shape為[478,512]
net.bias.shape # 偏置b的形狀,X的shape為[4,478]
# 調(diào)用net函數(shù)時,自動判斷,如果當(dāng)前沒有創(chuàng)建w和b,自動調(diào)用build函數(shù)
1.2 創(chuàng)建多個連接層
使用tf.keras.Sequential()堆疊構(gòu)建全連接層;使用tf.keras.layers.Dense()創(chuàng)建每一個全連接層;使用build()構(gòu)建輸入層。網(wǎng)絡(luò)結(jié)構(gòu)為[b,10]=>[b,16]=>[b,32]=>[b,8];通過summary()查看整體網(wǎng)絡(luò)架構(gòu)。通過model.trainable_variables查看網(wǎng)絡(luò)的所有的權(quán)重和偏置。
#(4)創(chuàng)建多個全連接層
# 將所有連接層組成一個列表放入
from tensorflow import keras
# 構(gòu)建全連接層
model = keras.Sequential([keras.layers.Dense(16, activation='relu'), #w的shape為[10,16],b的shape為[16],共10*16+16=176個參數(shù) keras.layers.Dense(32, activation='relu'), #w的shape為[16,32],b的shape為[32]keras.layers.Dense(8)]) #w的shape為[32,8],b的shape為[8]model.build(input_shape=[None,10]) #輸入層10個特征
model.summary() # 查看網(wǎng)絡(luò)結(jié)構(gòu)
# 查看網(wǎng)絡(luò)所有的權(quán)重w和偏置b
for p in model.trainable_variables:print(p.name,p.shape)
整體網(wǎng)絡(luò)構(gòu)架如下:對于第一層,w的shape為[10,16],b的shape為[16],共10*16+16=176個參數(shù) ,下面幾層的參數(shù)個數(shù)同理
Model: "sequential"
_________________________________________________________________Layer (type) Output Shape Param #
=================================================================dense (Dense) (None, 16) 176 dense_1 (Dense) (None, 32) 544 dense_2 (Dense) (None, 8) 264 =================================================================
Total params: 984
Trainable params: 984
Non-trainable params: 0
_________________________________________________________________
2. 輸出映射方式
2.1 sigmoid函數(shù)
sigmoid函數(shù): tf.sigmoid(tensor)
把輸出結(jié)果的范圍映射到(0,1)之間,計算公式:
sigmoid只能保證單個數(shù)值的范圍在0-1之間
a = tf.linspace(-6,6,10) #-6到6的長度為10的向量
# sigmoid函數(shù)將其映射到0-1
tf.sigmoid(a)
# 輸入數(shù)據(jù):array([-6. , -4.66666667, -3.33333333, -2. , -0.66666667,0.66666667, 2. , 3.33333333, 4.66666667, 6.
# 輸出結(jié)果:array([0.00247262, 0.00931596, 0.0344452 , 0.11920292, 0.33924363,0.66075637, 0.88079708, 0.9655548 , 0.99068404, 0.99752738])
2.2 softmax函數(shù)
對于分類問題,需要每一個概率在0-1之間,且總的概率和為1。
softmax函數(shù):tf.softmax(logits, axis)
logits:一個非空的Tensor。必須是下列類型之一:half, float32,float64。
axis:將在其上執(zhí)行維度softmax。默認(rèn)值為-1,表示最后一個維度。
公式為:
一般將沒有加激活函數(shù)的稱為Logits,加了softmax后稱為Probabilities,經(jīng)過softmax后,有把最大值放大的過程,相當(dāng)于把強(qiáng)的變得更強(qiáng),把弱的變得更弱。
logits = tf.random.uniform([1,10],minval=-2,maxval=2)
# 使用softmax
prob = tf.nn.softmax(logits,axis=1) #對整個列表的值求softmax
# 求和
tf.reduce_sum(prob,axis=1)# logits:array([[-0.80400324, 1.1189251 , 1.7390656 , 0.8317995 , -1.1970901 ,-0.48806524, -1.1161256 , -0.35890388, 0.765254 , -1.8393846 ]],dtype=float32)>
# prob:array([[0.02841684, 0.19439851, 0.3614236 , 0.14588003, 0.01918051,0.03897498, 0.02079806, 0.0443486 , 0.13648833, 0.01009056]],dtype=float32)>
# sum:<tf.Tensor: shape=(1,), dtype=float32, numpy=array([1.], dtype=float32)>
2.3 tanh函數(shù)
tanh是通過sigmoid函數(shù)放大平移得到,輸出結(jié)果在(-1,1)之間
tanh函數(shù): tf.tanh(tensor)
a = tf.linspace(-2, 2, 5) # -2到2的長度為5的向量
# 結(jié)果映射到(-1,1)
tf.tanh(a)
# 輸入:<tf.Tensor: shape=(5,), dtype=float64, numpy=array([-2., -1., 0., 1., 2.])>
# 輸出:<tf.Tensor: shape=(5,), dtype=float64, numpy=array([-0.96402758, -0.76159416, 0. , 0.76159416, 0.96402758])>
2.4 relu函數(shù)
將輸入小于0的值都變成0,大于0的值保持不變。
relu激活函數(shù):tf.nn.relu(features)
公式為:?
# relu函數(shù),x小于0,梯度0,x大于0梯度1
a = tf.linspace(-1,1,10) # -1到1,長度為10的向量
tf.nn.relu(a)# 輸入為:array([-1. , -0.77777778, -0.55555556, -0.33333333, -0.11111111, 0.11111111, 0.33333333, 0.55555556, 0.77777778, 1. ])>
# 輸出為:array([0. , 0. , 0. , 0. , 0. , 0.11111111, 0.33333333, 0.55555556, 0.77777778, 1. ])>
2.5?leaky_relu函數(shù)
非飽和激活函數(shù): tf.nn.leaky_relu( features, alpha=0.2 )
features: tensor類型,表示預(yù)激活值,必須是下列類型之一:float16,float32,float64,int32,int64.
alpha: x <0時激活函數(shù)的斜率.
由于relu函數(shù)對于小于0的值,這個神經(jīng)元的梯度永遠(yuǎn)都會是0,在實際操作中,如果數(shù)據(jù)很大,很可能網(wǎng)絡(luò)中較多的神經(jīng)元都死了。這時需要leaky_relu函數(shù):
公式:y = max(0, x) + leak*min(0,x)?
leak是一個很小的常數(shù),這樣保留了一些負(fù)軸的值,使得負(fù)軸的信息不會全部丟失
a = tf.linspace(-1,1,10)
# tf.nn.leaky_rulu() ,x小于0y也小于0但接近0
tf.nn.leaky_relu(a)# 輸入:array([-1. , -0.77777778, -0.55555556, -0.33333333, -0.11111111, 0.11111111, 0.33333333, 0.55555556, 0.77777778, 1. ])>
# 輸出:array([-0.2 , -0.15555556, -0.11111111, -0.06666667, -0.02222222, 0.11111111, 0.33333333, 0.55555556, 0.77777778, 1. ])>
總結(jié)
以上是生活随笔為你收集整理的【深度学习】(3) 全连接层、激活函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深度学习】(2) 数据加载,前向传播2
- 下一篇: 【深度学习】(4) 梯度下降、损失函数