当前位置: 首页 > news >正文

神经网络构成、优化、常用函数+激活函数

Iris分类

数据集介绍,共有数据150组,每组包括长宽等4个输入特征,同时给出输入特征对应的Iris类别,分别用0,1,2表示。

从sklearn包datasets读入数据集。

from sklearn import darasets
from pandas import DataFrame
import pandas as pd
x_data = datasets.load_iris().data #  输入特征
y_data = datasets.load_iris().target # 标签
x_data = DataFrame(x_data, columns=["花萼长度",'花萼宽度','花瓣长度','花瓣宽度'])
pd.set_option('display.unicode.east_asian_width',True) # 设置列名对齐
x_dara['类别'] = y_data # 新增一列

神经网络实现分类步骤。

1.准备数据:

数据集读入,数据集乱序,生成训练集和测试集,配成输入特征/标签对,每次读入一部分

2.搭建网络

定义神经网络中的所有可训练参数

3.参数优化

嵌套循环迭代,with结构更新参数,显示当前loss

4.测试效果

计算当前向前传播后的准确率,显示当前acc

5可视化acc/loss

# -*- coding: UTF-8 -*-
# 利用鸢尾花数据集,实现前向传播、反向传播,可视化loss曲线# 导入所需模块
import tensorflow as tf
from sklearn import datasets
from matplotlib import pyplot as plt
import numpy as np# 导入数据,分别为输入特征和标签
x_data = datasets.load_iris().data
y_data = datasets.load_iris().target# 随机打乱数据(因为原始数据是顺序的,顺序不打乱会影响准确率)
# seed: 随机数种子,是一个整数,当设置之后,每次生成的随机数都一样(为方便教学,以保每位同学结果一致)
np.random.seed(116)  # 使用相同的seed,保证输入特征和标签一一对应
np.random.shuffle(x_data)
np.random.seed(116)
np.random.shuffle(y_data)
tf.random.set_seed(116)# 将打乱后的数据集分割为训练集和测试集,训练集为前120行,测试集为后30行
x_train = x_data[:-30]
y_train = y_data[:-30]
x_test = x_data[-30:]
y_test = y_data[-30:]# 转换x的数据类型,否则后面矩阵相乘时会因数据类型不一致报错
x_train = tf.cast(x_train, tf.float32)
x_test = tf.cast(x_test, tf.float32)# from_tensor_slices函数使输入特征和标签值一一对应。(把数据集分批次,每个批次batch组数据)
train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)
test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)# 生成神经网络的参数,4个输入特征故,输入层为4个输入节点;因为3分类,故输出层为3个神经元
# 用tf.Variable()标记参数可训练
# 使用seed使每次生成的随机数相同(方便教学,使大家结果都一致,在现实使用时不写seed)
w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1))
b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))lr = 0.1  # 学习率为0.1
train_loss_results = []  # 将每轮的loss记录在此列表中,为后续画loss曲线提供数据
test_acc = []  # 将每轮的acc记录在此列表中,为后续画acc曲线提供数据
epoch = 500  # 循环500轮
loss_all = 0  # 每轮分4个step,loss_all记录四个step生成的4个loss的和# 训练部分
for epoch in range(epoch):  #数据集级别的循环,每个epoch循环一次数据集for step, (x_train, y_train) in enumerate(train_db):  #batch级别的循环 ,每个step循环一个batchwith tf.GradientTape() as tape:  # with结构记录梯度信息y = tf.matmul(x_train, w1) + b1  # 神经网络乘加运算y = tf.nn.softmax(y)  # 使输出y符合概率分布(此操作后与独热码同量级,可相减求loss)y_ = tf.one_hot(y_train, depth=3)  # 将标签值转换为独热码格式,方便计算loss和accuracyloss = tf.reduce_mean(tf.square(y_ - y))  # 采用均方误差损失函数mse = mean(sum(y-out)^2)loss_all += loss.numpy()  # 将每个step计算出的loss累加,为后续求loss平均值提供数据,这样计算的loss更准确# 计算loss对各个参数的梯度grads = tape.gradient(loss, [w1, b1])# 实现梯度更新 w1 = w1 - lr * w1_grad    b = b - lr * b_gradw1.assign_sub(lr * grads[0])  # 参数w1自更新b1.assign_sub(lr * grads[1])  # 参数b自更新# 每个epoch,打印loss信息print("Epoch {}, loss: {}".format(epoch, loss_all/4))train_loss_results.append(loss_all / 4)  # 将4个step的loss求平均记录在此变量中loss_all = 0  # loss_all归零,为记录下一个epoch的loss做准备# 测试部分# total_correct为预测对的样本个数, total_number为测试的总样本数,将这两个变量都初始化为0total_correct, total_number = 0, 0for x_test, y_test in test_db:# 使用更新后的参数进行预测y = tf.matmul(x_test, w1) + b1y = tf.nn.softmax(y)pred = tf.argmax(y, axis=1)  # 返回y中最大值的索引,即预测的分类# 将pred转换为y_test的数据类型pred = tf.cast(pred, dtype=y_test.dtype)# 若分类正确,则correct=1,否则为0,将bool型的结果转换为int型correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)# 将每个batch的correct数加起来correct = tf.reduce_sum(correct)# 将所有batch中的correct数加起来total_correct += int(correct)# total_number为测试的总样本数,也就是x_test的行数,shape[0]返回变量的行数total_number += x_test.shape[0]# 总的准确率等于total_correct/total_numberacc = total_correct / total_numbertest_acc.append(acc)print("Test_acc:", acc)print("--------------------------")# 绘制 loss 曲线
plt.title('Loss Function Curve')  # 图片标题
plt.xlabel('Epoch')  # x轴变量名称
plt.ylabel('Loss')  # y轴变量名称
plt.plot(train_loss_results, label="$Loss$")  # 逐点画出trian_loss_results值并连线,连线图标是Loss
plt.legend()  # 画出曲线图标
plt.show()  # 画出图像# 绘制 Accuracy 曲线
plt.title('Acc Curve')  # 图片标题
plt.xlabel('Epoch')  # x轴变量名称
plt.ylabel('Acc')  # y轴变量名称
plt.plot(test_acc, label="$Accuracy$")  # 逐点画出test_acc值并连线,连线图标是Accuracy
plt.legend()
plt.show()

 根据MP模型可以看出,求出的y实际上就是计算出属于哪一种分类的概率

 

 其求出的loss就是概率和0/1相减,再将loss和w与b求偏导,通过公式运算得到w和b

预备函数

tf.where

a=tf.constant([1,2,3,1,1])

b=tf.constant([0,1,3,4,5])

c=tf.where(tf.greater(a,b),a,b)

2.np.random.RandomState.rand(维度)返回[0,1]的随机数

3.np.vstack() 将两个数组按垂直方向叠加

4np.mgridp[起始值:结束值:步长,....] [)

5.x.ravel() 将x变为一维数组

6.np.c_ [数组1,数组2]返回的间隔数值点配对

神经网络复杂度

指数衰减学习率

可以先用较大的学习率,快速得到较优解,然后逐步减小学习率,使模型在训练后期稳定

指数衰减学习率=初始学习率*学习率衰减率^(当前轮数/多少轮衰减一次)更新频率

epoch = 40
LR_BASE = 0.2
LR_DECAY = 0.99
LR_STEP = 1
for epoch in range(epoch):lr = LR_BASE*LR_DECAY**(epoch/LR_STEP)with tf.GradientTape() as tape:loss = tf.square(w + 1)grads = tape.gradient(loss, w)w.assign_sub(;lr*grads)

激活函数

1.Signmoid函数

特点:容易造成梯度消失,输出非0均值,收敛慢,幂运算复杂,训练时间长

2.Tanh函数

特点:输出是0均值,容易造成梯度消失,幂运算复杂,训练时间长

3.Relu函数

解决梯度消失问题正区间,容易造成神经元死亡,改变随机初始化,避免过多设置更小学习率,减少参数的巨大变化,避免训练中产生过多负数特征进入函数

Leaky Rely

1首选relu函数

2学习率设置较小值

3输入特征标准化,既让输入特征满足以0为均值,1为标准差的正态分布

4初始参数中心化,既让随机生成的参数满足以0为均值,sqrt(2/当前层输入特征个数)为标准差的正态分布

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 项目/代码规范与Apifox介绍使用
  • 孟德尔随机化--痛风与饮食
  • k8s 中间件
  • ProFuzzBench入门教学——使用(Ubuntu22.04)
  • Java使用POI导出后数字类型为常规类型,不能计算
  • 使用Mplayer实现MP3功能
  • 前端调用有道翻译
  • FPGA设计之跨时钟域(CDC)设计篇(1)----亚稳态到底是什么?
  • 牛市中途深度调整,一览下半场值得关注的 Solana 生态五大潜力项目
  • arm环境安装达梦数据库
  • Linux之免费证书工具certbot安装和使用
  • 设计模式探索:适配器模式
  • 关于ppmlhdfe和possion两个命令回归显示观测值不同
  • 掌握计算机网络基础:从零开始的指南
  • 基于conda包的环境创建、激活、管理与删除
  • 【node学习】协程
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Gradle 5.0 正式版发布
  • IP路由与转发
  • leetcode46 Permutation 排列组合
  • mac修复ab及siege安装
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • spring + angular 实现导出excel
  • Zsh 开发指南(第十四篇 文件读写)
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 记一次和乔布斯合作最难忘的经历
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 选择阿里云数据库HBase版十大理由
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • (20)docke容器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (javascript)再说document.body.scrollTop的使用问题
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • .net dataexcel 脚本公式 函数源码
  • .net 中viewstate的原理和使用
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET导入Excel数据
  • .net快速开发框架源码分享
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ C++ ] STL---string类的模拟实现
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [] 与 [[]], -gt 与 > 的比较
  • []指针
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [Android Pro] Notification的使用
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C# 开发技巧]实现属于自己的截图工具
  • [CTF夺旗赛] CTFshow Web1-12 详细过程保姆级教程~
  • [Hive] 常见函数
  • [HNCTF 2022 WEEK2]easy_include 文件包含遇上nginx