赞
踩
各位同学好,今天和大家分享一下tensorflow2.0深度学习中的相关操作。内容有:
全连接层在整个网络卷积神经网络中起到特征提取器的作用。全连接层将学到的特征表示映射到样本的标记空间。
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: 对偏置向量约束
通过组合层来构建模型,直接堆叠各个层
首先构造一个shape为[4,478]的随机正态分布,构造一个连接层tf.keras.layers.Dense(),输出512个特征,shape为[4,512]。将输入层放入连接层自动调用build()函数创建权重w和偏置b,将计算结果返回给out。
- # 创建单个连接层
- import tensorflow as tf
- # 构建输入
- x = tf.random.normal([4,478])
- # 输入的shape不需要指定,可以自动的根据输入的特征生成对应的权值
- net = tf.keras.layers.Dense(512)
- # 输出结果
- out = net(x)
- out.shape # 输出结果的shape[4,512]
- net.kernel.shape # 权值W的形状,W的shape为[478,512]
- net.bias.shape # 偏置b的形状,X的shape为[4,478]
- # 调用net函数时,自动判断,如果当前没有创建w和b,自动调用build函数
使用tf.keras.Sequential()堆叠构建全连接层;使用tf.keras.layers.Dense()创建每一个全连接层;使用build()构建输入层。网络结构为[b,10]=>[b,16]=>[b,32]=>[b,8];通过summary()查看整体网络架构。通过model.trainable_variables查看网络的所有的权重和偏置。
- #(4)创建多个全连接层
- # 将所有连接层组成一个列表放入
- from tensorflow import keras
- # 构建全连接层
- model = keras.Sequential([
- keras.layers.Dense(16, activation='relu'), #w的shape为[10,16],b的shape为[16],共10*16+16=176个参数
- 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和偏置b
- for p in model.trainable_variables:
- print(p.name,p.shape)
整体网络构架如下:对于第一层,w的shape为[10,16],b的shape为[16],共10*16+16=176个参数 ,下面几层的参数个数同理
- 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
- _________________________________________________________________
把输出结果的范围映射到(0,1)之间,计算公式:
sigmoid只能保证单个数值的范围在0-1之间
- a = tf.linspace(-6,6,10) #-6到6的长度为10的向量
- # sigmoid函数将其映射到0-1
- tf.sigmoid(a)
- # 输入数据:array([-6. , -4.66666667, -3.33333333, -2. , -0.66666667,0.66666667, 2. , 3.33333333, 4.66666667, 6.
- # 输出结果:array([0.00247262, 0.00931596, 0.0344452 , 0.11920292, 0.33924363,0.66075637, 0.88079708, 0.9655548 , 0.99068404, 0.99752738])
对于分类问题,需要每一个概率在0-1之间,且总的概率和为1。
logits:一个非空的Tensor。必须是下列类型之一:half, float32,float64。
axis:将在其上执行维度softmax。默认值为-1,表示最后一个维度。
公式为:
一般将没有加激活函数的称为Logits,加了softmax后称为Probabilities,经过softmax后,有把最大值放大的过程,相当于把强的变得更强,把弱的变得更弱。
- 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)>
tanh是通过sigmoid函数放大平移得到,输出结果在(-1,1)之间
- a = tf.linspace(-2, 2, 5) # -2到2的长度为5的向量
- # 结果映射到(-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])>
将输入小于0的值都变成0,大于0的值保持不变。
公式为:
- # relu函数,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. ])>
features: tensor类型,表示预激活值,必须是下列类型之一:float16,float32,float64,int32,int64.
alpha: x <0时激活函数的斜率.
由于relu函数对于小于0的值,这个神经元的梯度永远都会是0,在实际操作中,如果数据很大,很可能网络中较多的神经元都死了。这时需要leaky_relu函数:
公式:y = max(0, x) + leak*min(0,x)
leak是一个很小的常数,这样保留了一些负轴的值,使得负轴的信息不会全部丢失
- 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. ])>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。