CV(7)--神经网络训练

news2025/3/15 18:01:19

前言

仅记录学习过程,有问题欢迎讨论

什么是神经网络:

  • 神经网络是一种模拟人脑神经元工作原理的算法,它由多个神经元组成,每个神经元都接受输入,通过计算产生输出,并将输出传递给其他神经元。
  • 神经网络的基本结构包括输入层、隐藏层和输出层。输入层接受外部输入,隐藏层对输入进行计算和转换,输出层产生最终的输出。神经网络中的神经元之间通过权重连接,权重决定了神经元之间的连接强度。
  • 神经网络的学习过程是通过调整权重来实现的。在训练过程中,神经网络会根据输入数据和期望输出,计算误差,并使用梯度下降等优化算法来调整权重,以减少误差。经过多次迭代,学习到输入数据和输出数据之间的关系,从而实现分类、回归等任务

激活函数:引入了非线性的学习和处理的能力

在这里插入图片描述

swish:

  • 在x为负值时,Swish函数输出的负值小于x本身,但不为0,这使得神经元保持一定的激活程度

  • 在零点附近平滑过渡,没有明确的分界点,这有助于梯度的稳定传播
    *

监督学习(有标注样本):

  • 标准的神经网络(Neural Networt):预测房屋价格;是否点击广告
  • 卷积神经网络(Convolutional NN):图像识别;
  • 循环神经网络(Recurrent NN,序列时间线的数据):音频识别;语言翻译
  • 混合神经网络:雷达;无人驾驶

无监督学习:

  • 给予机器没有标注的信息,希望通过算法进行一定的分析,得到一些结论
  • 常见任务:聚类、降维、找特征值

分布外数据(Out - of - Distribution,OOD):
原因:

  • 数据收集偏差:如果在数据收集过程中只关注了特定类型的数据,那么其他类型的数据就会成为 OOD 数据。例如,在收集图像数据时,如果只收集了室内场景的图片,那么室外场景的图片对于这个模型来说就是 OOD 数据。
  • 数据生成过程变化:当数据的生成机制发生变化时,也会产生 OOD 数据。例如,在时间序列数据中,经济环境的变化可能导致数据生成过程与之前不同,新的数据就可能是 OOD 数据

解决:

  • OOD 检测(Out - of - Distribution Detection):开发专门的方法来检测数据是否属于 OOD。例如,使用基于
    密度估计(概率分布)、距离度量(K-means)或分类器的方法来判断数据是否超出了训练数据的分布范围。

  • 模型适应(Model Adaptation):当发现 OOD 数据时,尝试对模型进行调整或重新训练,使其能够适应新的数据分布。例如,采用迁移学习或增量学习的方法,将已有模型的知识迁移到新的数据分布上,或者在新数据上逐步更新模型

前向和反向传播
通过前向传播,模型可以根据输入数据生成预测结果(forward),获取损失函数;
通过反向传播,可以计算模型的梯度信息(loss),从而进行参数优化。

  • 沿着正向传播的路线反向走!反向传播过程中利用下一层存储的值以及梯度的分向量来更新上一层的w和b,极大的提高了梯度计算速度,从而更加有利于利用梯度进行随机梯度下降更新神经网络参数完成机器学习训练任务
  • 先随机权重,计算loss,然后反向传播更新权重(通过就偏导知道该w对loss的影响,得出增大or缩小改w)

计算梯度的方法:

  • 随机梯度下降:代表随机抽样部分数据代替整体(随机一个批次),减少计算量,通过不断沿着反梯度方向(向量拆分)更新参数求解。学习率代表下降的步子,批量随机梯度下降是默认求解方法.
    • 缺点:收敛局部最小值;参数调整比较缓慢
  • 牛顿法:(求导求极值,求出所有找最优,计算量大)优化下降路径
  • 冲(动)量法:通过历史数据来修正每一次的梯度分量(有惯性),越远的影响越小,加权,减少震荡
  • AdaGrad:学习率自适应改动,历史数据的学习率加权,速度比不过冲量法
  • Adam:AdaGrad+动量法!

过拟合:
对于测试集的效果差,泛化能力差;可能训练数据带有噪音,或者参数过多导致模型复杂度高
解决办法:减少特征,清洗数据,更多训练样本,dropout,正则化

训练过程:
先随机权重,计算loss,然后反向传播更新权重(通过求偏导知道该w对loss的影响,得出增大or缩小改w)

Keras:
Keras是由纯python编写的基于theano/tensorflow的深度学习框架。
Keras是一个高层神经网络API,支持
a)简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
b)支持CNN和RNN,或二者的结合
c)无缝CPU和GPU切换

手动实现一个神经网络

"""
work-从零训练一个简单的 识别图片数字的模型
"""
import numpy

# 加载数据 返回图片数组和对应label数组
def load_data_set(file_name):
    label = []
    img_data = []
    # 加载图片csv
    data_file = open(file_name)
    data_list = data_file.readlines()
    data_file.close()
    # data_list[0]是第一张图片,data_list[0].split(',')是按照','分割的字符串
    for data in data_list:
        # 第一个值对应的是图片的表示的数字,所以我们读取图片数据时要去掉第一个数值
        all_values = data.split(',')
        image_array = numpy.asfarray(all_values[1:]).reshape((28, 28))
        img_data.append(image_array)

        label.append(all_values[0])
    return img_data, label

# 建立模型结构
class NeuralNetWork:
    def __init__(self,input_nodes, hidden_nodes, output_nodes,lr):
        self.input_nodes = input_nodes
        self.hidden_nodes = hidden_nodes
        self.output_nodes = output_nodes
        self.lr = lr
        # 初始化权重
        self.wih = numpy.random.normal(0.0, pow(self.hidden_nodes, -0.5), (self.hidden_nodes, self.input_nodes))
        self.who = numpy.random.normal(0.0, pow(self.output_nodes, -0.5), (self.output_nodes, self.hidden_nodes))
        # 定义sigmoid 激活函数
        self.activation_function = lambda x: 1 / (1 + numpy.exp(-x))

    def train(self, inputs_list, targets_list):
        # 数据需要转换为 二维数组
        inputs = numpy.array(inputs_list, ndmin=2).T
        targets = numpy.array(targets_list, ndmin=2).T
        # 前向传播
        hidden_inputs = numpy.dot(self.wih, inputs)
        hidden_outputs = self.activation_function(hidden_inputs)
        final_inputs = numpy.dot(self.who, hidden_outputs)
        final_outputs = self.activation_function(final_inputs)
        # 反向传播
        # 计算loss
        output_loss = targets - final_outputs
        hidden_errors = numpy.dot(self.who.T, output_loss * final_outputs * (1 - final_outputs))
        self.who += self.lr * numpy.dot((output_loss * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs))
        self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs))
    # 预测
    def query(self, inputs_list):
        inputs = numpy.array(inputs_list, ndmin=2).T
        hidden_inputs = numpy.dot(self.wih, inputs)
        hidden_outputs = self.activation_function(hidden_inputs)
        final_inputs = numpy.dot(self.who, hidden_outputs)
        final_outputs = self.activation_function(final_inputs)
        return final_outputs

# 测试模型效果
def predict(network):
    print("开始预测")
    img_data, true_label = load_data_set("dataset/mnist_test.csv")
    scores = []
    for i in range(len(img_data)):
        inputs = img_data[i]
        # 将图像数据从0-255的整数范围归一化到0.02-1.00的浮点数范围,以便更好地用于机器学习模型的训练和预测。、
        # 归一化处理可以加快模型的收敛速度,提高模型的性能
        inputs = (numpy.asfarray(inputs.reshape(-1))) / 255.0 * 0.99 + 0.01
        # 初始化one-hot
        targets = [0.01] * 10
        targets[int(true_label[i])] = 0.99
        outputs = network.query(inputs)
        # 找到数值最大的神经元对应的 编号
        label = numpy.argmax(outputs)
        print("predict  is : ", label)
        print("true  is : ", true_label[i])
        # print("网络认为图片的数字是:", label)
        if label == int(true_label[i]):
            scores.append(1)
        else:
            scores.append(0)
    # 计算图片判断的成功率
    scores_array = numpy.asarray(scores)
    print("perfermance = ", scores_array.sum() / scores_array.size)



def main():
    img_data, label = load_data_set("dataset/mnist_train.csv")
    # 定义超参数
    input_nodes = 784
    hidden_nodes = 200
    output_nodes = 10
    learning_rate = 0.01
    epochs = 5
    # 建立模型
    network = NeuralNetWork(input_nodes, hidden_nodes, output_nodes, learning_rate)
    for epoch in range(epochs):
        for i in range(len(img_data)):
            inputs = img_data[i]
            # 将图像数据从0-255的整数范围归一化到0.02-1.00的浮点数范围,以便更好地用于机器学习模型的训练和预测。、
            # 归一化处理可以加快模型的收敛速度,提高模型的性能
            inputs = (numpy.asfarray(inputs.reshape(-1))) / 255.0 * 0.99 + 0.01
            # 初始化one-hot
            targets = [0.01] * 10
            targets[int(label[i])] = 0.99
            network.train(inputs, targets)

    print("训练完成")
    predict(network)







if __name__ == '__main__':
    main()





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2266915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python实战案例笔记:统计出数据中路劲下没有文件的文件夹

数据样例:👇有如下excel数据 需求:有如下excel,a.xls,统计出路劲下没有文件的路劲 详细实现代码: import os from openpyxl import Workbook from datetime import datetimedef get_empty_dirs(paths):# …

API安全学习笔记

必要性 前后端分离已经成为web的一大趋势,通过TomcatNgnix(也可以中间有个Node.js),有效地进行解耦。并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器&#x…

金仓数据库对象访问权限的管理

基础知识 对象的分类 数据库的表、索引、视图、缺省值、规则、触发器等等,都称为数据库对象,对象分为如下两类: 模式(SCHEMA)对象:可以理解为一个存储目录,包含视图、索引、数据类型、函数和操作符等。非模式对象:其他的数据库对象&#x…

【连续学习之ResCL算法】2020年AAAI会议论文:Residual continual learning

1 介绍 年份:2020 会议: AAAI Lee J, Joo D, Hong H G, et al. Residual continual learning[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2020, 34(04): 4553-4560. 本文提出的算法是Residual Continual Learning (ResC…

超时空跑跑新手池抽什么比较好 超时空跑跑风火水雷配队搭配

在超时空跑跑这款游戏中,各种角色分为风、火、水、雷四类,我们可以根据新手池抽出的角色进行搭配,今天就给大家推荐一下四种属性分别适合的队伍。 一、风系队 阵容搭配:关偃月方源少阳 1.关偃月的弹指次数可以持续很长的时间&am…

PHP实现登录和注册(附源码)

前言 本博客主要讲述利用php环境实现一个简单的前后端结合的用户登录和注册功能。phpstudy是PHP调试环境的集成包,该程序包集成了 ApachePHPMySQLphpMyAdmin 等多个工具,是很好用的调试环境的程序集成包。 目录 前言 1. 准备工作 1.1 工具 1.2 php…

HTTPS验证流程

http通常是直接和TCP进行通信的,而https中http是和SSL通信,再由SSL与TCP进行通信。SSL协议是一个介于应用层和传输层之间的一个安全协议。 1.对称加密与非对称加密 对称加密: 加密和解密方式都使用同一个私钥和公开的加密算法,优…

云手机:Instagram 矩阵搭建方案

云手机概述 1.亚矩阵云手机是依托先进的 ARM 虚拟化技术构建的云手机平台,综合运用云计算、大数据、人工智能及边缘计算等前沿技术,全方位支持各类安卓手机应用的使用与管理服务。借助全天候云端智能托管应用,用户能够突破终端设备的限制&…

指针详解之 多层嵌套的关系

1 例子之指向3个字符串的指针数组,易混淆! 1.1过程详解: char *str[3]{ "Hello,thisisasample!", "Hi,goodmorning.", "Helloworld" }; char s[80]; strcpy(s,str[0]); //也可写成strcpy(s,*st…

内置ALC的前置放大器D2538A/D3308

一、概述 D2538A/D3308是芯谷科技推出的带有ALC(自动电平控制)的前置音频放大器芯片,最初产品为单声道/立体声收录机及盒式录音机而开发,作为录音/回放的磁头放大器使用;由于产品的高增益、低噪声及ALC外部可调的特性&…

重发布和路由策略实验

需求:将1.1.1.0/24网段重发布到网络中,不允许出现次优路径,实现全网可达。1、在R1上重发布1.1.1.0/24网段,但是需要过滤192.168.12.0/24和192.168.13.0/242、在R2和R3上执行双向重发布因为R1引入的域外路由信息的优先级为150&…

低资源场景下的知识抽取

Information Extraction in Low-Resource Scenarios: Survey and Perspective Low-Resource & IE 技术解决方案 传统 1. 数据增强 概念:主要利用内源或外源辅助资源对原始小数据集进行数据增强或知识增强目标:创建更具代表性的样本并利用更高资源…

Pico “版权校验不通过:签名非法” 处理方法?

遇到 ”版权校验不通过“ 问题时,参考以下思路进行排查。 若应用的 APK 文件未上传至 PICO 开发者管理平台,参考以下排查思路: 检查应用包名,如果使用了 Unity 模板工程默认包名,比如 com.UnityTechnologies.com.uni…

去除 el-input 输入框的边框(element-ui@2.15.13)

dgqdgqdeMac-mini spid-admin % yarn list --pattern element-ui yarn list v1.22.22 └─ element-ui2.15.13 ✨ Done in 0.23s.dgqdgqdeMac-mini spid-admin % yarn list vue yarn list v1.22.22 warning Filtering by arguments is deprecated. Please use the pattern opt…

RCE-PLUS (学习记录)

源码 <?php error_reporting(0); highlight_file(__FILE__); function strCheck($cmd) {if(!preg_match("/\;|\&|\\$|\x09|\x26|more|less|head|sort|tail|sed|cut|awk|strings|od|php|ping|flag/i", $cmd)){return($cmd);}else{die("i hate this"…

macrodroid通过http请求控制手机运行宏

macrodroid adb命令 adb shell pm grant com.arlosoft.macrodroid android.permission.WRITE_SECURE_SETTINGS例:http请求手机播放指定MP3文件 声音素材_电量过低提醒 新建一个宏 添加触发器-连接-http服务器请求 路径随意填,最好不要有特殊符号,不然浏览器识别链接会出错,…

产品初探Devops!以及AI如何赋能Devops?

DevOps源自Development&#xff08;开发&#xff09;和Operations&#xff08;运维&#xff09;的组合&#xff0c;是一种新的软件工程理念&#xff0c;旨在打破传统软件工程方法中“开发->测试->运维”的割裂模式&#xff0c;强调端到端高效一致的交付流程&#xff0c;实…

再谈c++线性关系求值

目的 线性关系是最简单的一种关系&#xff0c;在编程当中应用非常多&#xff0c;所以&#xff0c;再说一次线性关系。 线性关系的定义是这样的&#xff1a; 两个变量之间存在一次方函数关系&#xff0c;就称它们之间存在线性关系。正比例关系是线性关系中的特例&#xff0c;反…

“事务认证平台”:个人日常事务管理系统的诚信体系建设

3.1系统体系结构 系统的体系结构非常重要&#xff0c;往往决定了系统的质量和生命周期。针对不同的系统可以采用不同的系统体系结构。本系统为个人日常事务管理系统&#xff0c;属于开放式的平台&#xff0c;所以在体系结构中采用B/s。B/s结构抛弃了固定客户端要求&#xff0c;…

无人零售 4G 工业无线路由器赋能自助贩卖机高效运营

工业4G路由器为运营商赋予 “千里眼”&#xff0c;实现对贩卖机销售、库存、设备状态的远程精准监控&#xff0c;便于及时补货与维护&#xff1b;凭借强大的数据实时传输&#xff0c;助力深度洞察销售趋势、优化库存、挖掘商机&#xff1b;还能远程升级、保障交易安全、快速处理…