浅层神经网络学习笔记

20206-29

神经网络结构

神经网络结构大致分为一下几种结构:

# 拉直层,把输入特征拉直成为一位数组
tf.keras.layers.Flatten()

# 全连接层
tf.keras.layers.Dense(神经元个数,activation="激活函数",kernel_constraint="正则化方式")

# 卷积层
tf.keras.layers.Conv2D(filters="卷积核个数",kernel_size="卷积核尺寸",strides="卷积步长", padding="valid or same")

# LSTM层
tf.keras.layers.LSTM()
#以及其他
拉直层

将通过隐藏层计算之后,全连接之前的计算参数(w,b)拉直成一个一位数组。

全连接层

神经网络的每个权重(w)和偏置(b)都与上层(或下层)网络连接。

卷积层

将一个多维的图片或者是一个特征,通过卷积核卷积计算得到一个新的数组的一种神经网络计算方式。

使用Sequential训练神经网络
# 示例
import tensorflow as tf
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128,activation="relu"),# 神经元个数自取,合适即可
    tf.keras.layers.Dense(10, activation="softmax"),# 输出结果分10类,故最后一层神经元个数为10
])

 

激活函数的选择

激活函数的作用是:通过某种映射方式,将上层网络的结构的输出结果映射到某种规律分布之间,而后进行下层网络连接计算。

sigmoid函数

在这里插入图片描述
sigmoid函数是用于解决二分类问题的函数,函数值是处于0-1之间,如果将其作为全连接网络最后一层激活函数,则表明输出结果是用于判断二分类中其中一类的概率。

relu函数

relu函数是一种使用比较广的函数,它的函数图像负数值为0正数图像结果是他本身。可用于全连接网络之前的网络层激活函数。

tanh函数

tanh函数和relu函数类似,应用范围也类似,但是在当函数取负的时候要定义偏置α。

softmax函数

softmax函数是一个用于解决多分类问题的激活函数,可以将其理解为二分类问题的延伸。经常与交叉熵损失函数联合使用。

配置神经网络训练参数

model.compile(optimizer="优化器",loss="损失函数",metrics=["评价函数"])

优化器的选择

优化器 (optimizer) 是编译 Keras 模型的所需的两个参数之一.
官方给了很多优化器,我只列举出了我用过的。

#optimizer可选:
    'sgd' 或 tf.keras.optimizers.SGD(lr=学习率,momentum=动量参数)
    'adagrad'   或   tf.keras.optimizers.Adadelta(lr=学习率)
    'adadelta'    或   tf.keras.optimizers.Adadelta(lr=学习率)
    'adam'        或   tf.keras.optimizers.Adam(lr=学习率,beta=0.9,beta_2=0.999)
sgd优化器(随机梯度下降优化器)

优点:计算梯度快,对于小噪声,SGD可以很好收敛。对于大型数据,训练很快,从数据中取大量的样本算一个梯度,更新一下参数。
缺点:在随机选择梯度时会引入噪声,权值更新方向可能出现错误。SGD未能克服全局最优。
 

keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)
* lr: float >= 0. 学习率。
* momentum: float >= 0. 参数,用于加速 SGD 在相关方向上前进,并抑制震荡。
* decay: float >= 0. 每次参数更新后学习率衰减值。
* nesterov: boolean. 是否使用 Nesterov 动量。
Adagrad优化器

Adagrad 是一种具有特定参数学习率的优化器,它根据参数在训练期间的更新频率进行自适应调整。参数接收的更新越多,更新越小。【官方建议使用默认参数】

keras.optimizers.Adagrad(lr=0.01, epsilon=None, decay=0.0)
* lr: float >= 0. 学习率.
* epsilon: float >= 0. 若为 None, 默认为 K.epsilon().
* decay: float >= 0. 每次参数更新后学习率衰减值.
adadelta优化器

Adadelta 是 Adagrad 的一个具有更强的扩展版本,它不是累积所有过去的梯度,而是根据渐变更新的移动窗口调整学习速率。 这样,即使进行了许多更新,Adadelta 仍在继续学习。 与 Adagrad 相比,在 Adadelta 的原始版本中,无需设置初始学习率。 在tensorflow2x中,与大多数其他 Keras 优化器一样,可以设置初始学习速率和衰减因子。

keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=None, decay=0.0)
* lr: float >= 0. 学习率,建议保留默认值。
* rho: float >= 0. Adadelta梯度平方移动均值的衰减率。
* epsilon: float >= 0. 模糊因子. 若为 None, 默认为 K.epsilon()。
* decay: float >= 0. 每次参数更新后学习率衰减值。
adam优化器

自适应矩估计(Adam)优化器是计算每个参数的自适应学习率的另一种方法。 除了存储像Adadelta和RMSprop之类的过去平方梯度vtvt的指数衰减平均数之外,Adam也保持了过去梯度mtmt的指数衰减平均值,类似于动量.
Adam一种有效的随机优化方法,它只需要一阶的梯度,并且只需要很小的内存。该方法通过第一,第二梯度的估计,计算不同参数的自适应学习速率;

keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
* lr: float >= 0. 学习率。
* beta_1: float, 0 < beta < 1. 通常接近于 1。
* beta_2: float, 0 < beta < 1. 通常接近于 1。
* epsilon: float >= 0. 模糊因子. 若为 None, 默认为 K.epsilon()。
* decay: float >= 0. 每次参数更新后学习率衰减值。
* amsgrad: boolean. 是否应用此算法的 AMSGrad 变种

Loss函数的选择

损失函数(或称目标函数、优化评分函数)是编译模型时所需的两个参数之一。
我用过的损失函数:

    'mse'  或  tf.keras.losses.MeanSquaredError()
    'sparse_categorical_crossentropy' 或  tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
    # ...

注意:当全连接网络输出是多酚类选择softmax作为激活函数时,sparse_categorical_crossentropy函数的from_logits需定义为Fals

metrics评价函数

评价函数用于评估当前训练模型的性能。当模型编译后(compile),评价函数应该作为 metrics 的参数来输入。评价函数和 损失函数 相似,只不过评价函数的结果不会用于训练过程中。

    
#metrics可选:
    'accuracy'  y和y_ 都是数值,如 y = [1]  y_ = [1]
    'categorical_accuracy'    y和y_都是独热码(概率分布),如 y = [0,1,0]  y_ = [0.256,0.695,0.048]
    'sparse_categorical_accuracy'   y(真实值)是数值,y_(预测值)是独热码,如 y = [1]  y_ = [0.256,0.695,0.048]

注意当损失函数选择为:

tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)

时,对应的metrics也需要选择为:

metrics=['sparse_categorical_accuracy']

完整示例

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])

模型训练

model.fit(训练集输入特征,训练集标签,batch_size=,epochs=,validation_data=(测试集的输入特征,测试集的标签),
          validation_split=从训练集中划分多少比例给测试集(0.2即表示为20%,validation_freq=多少次epoch测试一次)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值