目录
激活函数
向神经网络中引入非线性因素,通过激活函数,神经网络就可以拟合各种曲线。如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合
Sigmoid/logistics函数
tf.nn.sigoid
tanh(双曲正切曲线)
相比sigmoid,其以0为中心
tf.nn.tanh
RELU
tf.nn.relu
LeakyReLu
缓解relu的“神经元死亡”
tf.nn.leaky_relu
SoftMax
用于多分类过程中,它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来
tf.nn.softmax
其他激活函数
如何选择激活函数
参数初始化
对于某一个神经元来说,需要初始化的参数有两类:一类是权重w,还有一类是偏置b,偏置b初始为0即可。而权重w的初始化比较重要
随机初始化
从均值为0,标准差是1的正态分布中取样,使用一些很小的值对参数W进行初始化
标准初始化
权重参数初始化从区间均匀随值。即在( − 1 d \frac{-1}{\sqrt{d}} d−1, 1 d \frac{1}{\sqrt{d}} d1)均匀分布中生成当前神经元的权重,其中d为每个神经元的输入数量
Xavier初始化(Glorot初始化)
import tensorflow as tf
init=tf.keras.initializers.glorot_normal()
values=init(shape=(9,1))
print(values)
import tensorflow as tf
init=tf.keras.initializers.glorot_uniform()
values=init(shape=(9,1))
print(values)
He初始化
import tensorflow as tf
init=tf.keras.initializers.he_normal()
values=init(shape=(9,1))
print(values)
import tensorflow as tf
init=tf.keras.initializers.he_uniform()
values=init(shape=(9,1))
print(values)
神经网络的搭建
通过Sequential搭建
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
model=keras.Sequential([
#第一个隐层
layers.Dense(3,activation='relu',kernel_initializer='he_normal',name='layer1',input_shape=(3,)),
#第二个隐层
layers.Dense(2,activation='relu',kernel_initializer='he_normal',name='layer2'),
#输出层
layers.Dense(2,activation='sigmoid',kernel_initializer='he_normal',name='layer3')
],
name='sequential'
)
model.summary()
param是权重和偏置的个数
keras.utils.plot_model(model)
利用function API构建
#定义模型的输入
inputs=keras.Input(shape=(3,),name='input')
#第一个隐层
x=layers.Dense(3,activation='relu',name='layer1')(inputs) #此层输入为inputs,输出为x
#第二个隐层
x=layers.Dense(2,activation='relu',name='layer2')(x)
#输出层
outputs=layers.Dense(2,activation='sigmoid',name='output')(x)
#创建模型
model=keras.Model(inputs=inputs,outputs=outputs,name='Functional API Model')
model.summary()
keras.utils.plot_model(model,show_shapes=True)
通过model的子类搭建
#定义一个model的子类
class MyModel(keras.Model):
#定义网络的层结构
def __init__(self):
super(MyModel,self).__init__() #继承并初始化父类MyModel的方法
#第一个隐层
self.layers1=layers.Dense(3,activation='relu',name='layer1')
#第二个隐层
self.layers2=layers.Dense(2,activation='relu',name='layer2')
#输出层
self.layers3=layers.Dense(2,activation='sigmoid',name='layer3')
#定义网络的前向传播
def call(self,inputs):
x=self.layers1(inputs)
x=self.layers2(x)
outputs=self.layers3(x)
return outputs
#实例化模型
model=MyModel()
#设置输入
x=tf.ones((1,3))
y=model(x)
model.summary()