2021-01-07

tensorflow2.0

一、梯度下降法:

梯度下降法是致力于找到函数极值点的算法,“学习“是指改进模型参数,以便通过大量训练来将损失最小化
可以把梯度下降法应用到寻找损失函数的极值点,这样就构成了依据输入数据的模型学习,寻找的过程是通过不断改变参数和权值来寻找极值点。
在这里插入图片描述
可以通过这个图来理解,给定一个初始点,然后判断其左右Z的值的变换,如果下降则将点移到相应位置然后继续进行上一步,直到找到极值点不过需要注意的是,如图所示,每次的间隔不宜太大,否则会导致在极值点附近来回跳跃的情况发生。

二、几种激活函数:

1、relu
在这里插入图片描述
该函数在输入数据小于0时,自动屏蔽,在输入大于0时,原样输出
2、sigmoid
在这里插入图片描述
该激活函数当X趋向于正无穷大时,对应的值趋于1且逐渐稳定,当X趋向于负无穷大时,对应的值趋于0且逐渐趋于稳定当X靠近于Y轴时,对应值的变化较为明显,总体而言其值在0~1内变换,但在 X趋于正负无穷大时,其传播的梯度比较小, 故很少用在多层感知层的中间层
3、Leak relu
在这里插入图片描述
与relu相似但不同的是:Leak relu激活函数,会把小于0的数据传递出来一些,但是传递出来的值非常小,该函数常用于深层网络中。

四、神经网络的基本构架

可以考虑为一个又一个的神经元连接在一起,神经元与神经元之间通过激活函数来传递数据,每个单一神经元有n个特征输入对应n个w权重,接着求特征的加权和,然后通过激活函数(或传递函数)来完成最后的输出。在这里插入图片描述
而神经网络有怎么可能仅局限于浅层的,神经元要求数据必须线性可分,故我们可以在神经网络的输入和输出端加入更多的神经元。这就叫多层感知器。在这里插入图片描述
困扰我许久的是到底如何去实现这一过程,其实超级简单,只需要进行一个tf.keras.(选择模型形式,在这是选择了序贯模型)调用,之后
模型需要知道它所期待的输入的尺寸(shape)。出于这个原因,序贯模型中的第一层(只有第一层,因为下面的层可以自动的推断尺寸)需要接收关于其输入尺寸的信息,后面的各个层则可以自动的推导出中间数据的shape,因此不需要为每个层都指定这个参数。有以下几种方法来做到这一点:
在这里插入图片描述
该第一层是隐含层的定义,包括隐含层的个数,输入的参数的个数和最重要的激活函数,第二行是输出层,由这个代码很容易的得出总共有51个参数,其中隐含层有40个参数(共十层,每层都有三个特征参数和一个输出参数),输出层有十个输入特征参数和一个输出参数。

编译

在训练模型之前,我们需要配置学习过程,这是通过compile方法完成的,他接收三个参数:

优化器 optimizer:它可以是现有优化器的字符串标识符,如 rmsprop 或 adagrad,也可以是 Optimizer 类的实例。详见:optimizers。
损失函数 loss:模型试图最小化的目标函数。它可以是现有损失函数的字符串标识符,如 categorical_crossentropy 或 mse,也可以是一个目标函数。
评估标准 metrics:对于任何分类问题,你都希望将其设置为 metrics = [‘accuracy’]。评估标准可以是现有的标准的字符串标识符,也可以是自定义的评估标准函数。

# 多分类问题
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
 
# 二分类问题
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])
 
# 均方误差回归问题
model.compile(optimizer='rmsprop',
              loss='mse')
 
# 自定义评估标准函数
import keras.backend as K
 
def mean_pred(y_true, y_pred):
    return K.mean(y_pred)
 
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy', mean_pred])

训练

Keras 模型在输入数据和标签的 Numpy 矩阵上进行训练。为了训练一个模型,你通常会使用 fit 函数。

# 对于具有2个类的单输入模型(二进制分类):
 
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])
 
# 生成虚拟数据
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))
 
# 训练模型,以 32 个样本为一个 batch 进行迭代
model.fit(data, labels, epochs=10, batch_size=32)
 
# 对于具有10个类的单输入模型(多分类分类):
 
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
 
# 生成虚拟数据
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(10, size=(1000, 1))
 
# 将标签转换为分类的 one-hot 编码
one_hot_labels = keras.utils.to_categorical(labels, num_classes=10)
 
# 训练模型,以 32 个样本为一个 batch 进行迭代
model.fit(data, one_hot_labels, epochs=10, batch_size=32)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山东金针菇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值