梯度下降和多层感知器

梯度下降算法

致力于找到损失函数极值点,学习即是改进模型参数,以便通过大量训练步骤将损失最小化。

梯度的输出由若干偏导数构成的向量,每个分量对应于函数对输入向量的相应分量的偏导:
在这里插入图片描述
梯度的输出向量表明了在每个位置损失函数增长最快的方向,可以理解为函数在每个位置向哪个方向移动可以增长函数值。

随机初始化,初始化一批值,需要计算梯度值,找到损失值变化最快的方向。

每一次移动的距离,叫做学习速率。学习速率小,迭代次数多,训练慢;学习速率大,会错过极值点,后面会在极值点附近来回抖动。

不用担心局部极值点,是随机初始化的,总能找到最小的极值点。

感知器

线性回归模型是单个神经元:1、计算输入特征的加权和;2、使用一个激活函数计算输出。

缺陷:
要求数据必须线性可分,异或问题无法找到一条直线分割两个类

多个神经元:多层感知器
在这里插入图片描述
为了使用神经网络解决这种不具备线性可分性的问题,采取在神经网络的输入和输出端之间插入更多的神经元。

激活函数

relu:输入信号小于0直接屏蔽,输出0;输入信号大于0,信号原样输出。
在这里插入图片描述

sigmoid:输出结果控制在-1和1之间;靠近0时,输出陡峭,变化快;远大于0远小于0时,输出就趋于稳定,变化小,传入梯度就小。很少用在多层感知机的中间层。
在这里插入图片描述

tanh:输出结果映射在-1和1之间
在这里插入图片描述

Leak relu:将负值信号传入一点进来,不像relu直接屏蔽。一般用在深层网络里面。
在这里插入图片描述

网络结构

# -*- coding: UTF-8 -*-
"""
Author: LGD
FileName: gradient_descent
DateTime: 2020/10/21 10:41 
SoftWare: PyCharm
"""
"""
梯度下降算法

致力于找到损失函数极值点,学习即是改进模型参数,以便通过大量训练步骤将损失最小化
梯度的输出由若干偏导数构成的向量,每个分量对应于函数对输入向量的相应分量的偏导。
梯度的输出向量表明了在每个位置损失函数增长最快的方向,可以理解为函数在每个位置向哪个方向移动可以增长函数值。
随机初始化,初始化一批值,需要计算梯度值,找到损失值变化最快的方向。

每一次移动的距离,叫做学习速率。学习速率小,迭代次数多,训练慢;学习速率大,会错过极值点,后面会在极值点附近来回抖动。

不用担心局部极值点,是随机初始化的,总能找到最小的极值点。
"""

"""
线性回归模型是单个神经元:1、计算输入特征的加权和;2、使用一个激活函数计算输出。
要求数据必须线性可分,异或问题无法找到一条直线分割两个类
多个神经元:多层感知器
为了使用神经网络解决这种不具备线性可分性的问题,采取在神经网络的输入和输出端之间插入更多的神经元。

激活函数:relu(经典,常用)
输入信号小于0直接屏蔽,输出0;
输入信号大于0,信号原样输出。

sigmoid
输出结果控制在-1和1之间;靠近0时,输出陡峭,变化快;远大于0远小于0时,输出就趋于稳定,变化小,传入梯度就小。
很少用在多层感知机的中间层。

tanh
输出结果映射在-1和1之间

Leak relu
将负值信号传入一点进来,不像relu直接屏蔽。一般用在深层网络里面。
"""
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv("datasets/Advertising.csv")
print(data.head())

# 电视和收益之间的关系
plt.scatter(data.TV, data.sales)
plt.show()

# 收音机和收益之间的关系
plt.scatter(data.radio, data.sales)
plt.show()

# 报纸与收益之间的关系 (图片发散,没有明显的线性关系,说明报纸投放广告收益效果差)
plt.scatter(data.newspaper, data.sales)
plt.show()

x = data.iloc[:, 1:-1]
print(x)
y = data.iloc[:, -1]
print(y)

# 建立模型
# 第一层,10个单元隐藏层,输入数据3维,使用relu激活
# 第二层,输出一个单元,输出层;输出维度为1
model = tf.keras.Sequential(
    [tf.keras.layers.Dense(10, input_shape=(3,), activation='relu'),
     tf.keras.layers.Dense(1)]
)

# 查看网络模型
# 中间层10个隐藏单元, 40个参数(4×10)
# 输出层,11个参数,10个中间层加上一个偏置总共11
network_structure = model.summary()
print(network_structure)

# 编译模型,或者叫着配置模型
model.compile(
    optimizer='adam',  # 梯度优化器
    loss='mse'  # 依然使用均方差函数作为损失函数
)

# 训练模型
history = model.fit(x, y, epochs=100)
print(history)

# 预测
test = data.iloc[:10, -1]
print(test)
test = data.iloc[:10, 1:-1]
result = model.predict(test)
print(result)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hong_Youth

您的鼓励将是我创作的动力。

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

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

打赏作者

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

抵扣说明:

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

余额充值