深度学习入门-第4章-神经网络的学习

news2024/11/15 21:39:23

学习就是从训练数据中自动获取最优权重参数的过程。引入损失函数这一指标,学习的目的是找出使损失函数达到最小权重参数。使用函数斜率的梯度法来找这个最小值。

人工智能有两派,一派认为实现人工智能必须用逻辑和符号系统,自顶向下看问题;另一派认为通过仿造人脑可以达到人工智能,自底向上看问题。前一派是“想啥来啥”,后一派是“吃啥补啥”。前者偏唯心,后者偏唯物。两派一直是人工智能领域“两个阶级、两条路线”的斗争,这斗争有时还是你死我活。今天学习的是神经网络派。

4.1 从数据中学习

4.1.1 数据驱动

数据是机器学习的命根子。机器学习避免人为介入,通过数据发现模式。比如识别手写数字5,可以从图像中提取特征量,再用机器学习学习这些特征量的模式。其中图像转换为向量时使用的特征量仍由人设计,不同问题需要人工考虑不同的特征量。

神经网络(深度学习)称为端到端学习,图像中的特征量也由机器来学习。不管识别5还是识别狗,神经网络都是通过不断学习数据,尝试发现模式。

4.1.2 训练数据和测试数据

追求的模型泛化能力。训练数据也叫监督数据。一套数据集,无法获得正确的评价。要避免对某数据集的过拟合

4.2 损失函数

损失函数表示神经网络恶劣程度指标。一般乘上一个负值。

4.2.1 均方误差

4.2.2 交叉熵误差

4.2.3 mini-batch学习

从训练数据中选出小批量学习,称为mini-batch学习。随机选择小批量做为全体训练数据的近似值。

4.2.4 mini-batch版交叉熵误差实现

4.2.5 为何要设定损失函数

为了找到使损失函数值尽可能小的地方,需要计算参数导数,以导数为指引,逐步更新参数值。

对权重参数的损失函数求导,表示的是:如果稍微改变这个权重的值,损失函数的值如何变化

1)导数为负,权重参数正向变化,可以减小损失函数的值。

2)导数为正,权重参数负向变化,可以减小损失函数的值。

3)导数为0,权重参数哪个方向变化,损失函数都不变化。

不能直接使用识别精度,是因为大部分地方的参数导数为0,导致参数无法更新。

为啥是0?比如识别精度为32%, 微调权重参数,识别精度仍旧是32%,即使改变,也不会联系变化,而是33%,34%等离散值。而损失函数会连续变化。作为激活函数的阶跃函数也有类似特征,大部分地方导数为0,所以不能使用阶跃函数,要使用斜率连续变化的sigmoid函数。

4.3 数值微分

什么是梯度。

4.3.1 导数

采用中心差分

(f(x+h)-f(x-h))/(2*h)

利用微小的差分求导的过程称为数值微分numerical differentiation

数学公式推导求导称为解析性求导。如y=^X{^{^{2}}} 公式求导为\frac{dy}{dx}=2x,这样算出的是没有误差的真导数

4.3.2 数值微分的例子

数值微分的计算结果和真导数误差很小。

4.3.3 偏导数

有两个变量的情况。或者多个变量。有多个变量的函数的导数称为偏导数

偏导数将多个变量中的某个变量定为目标变量,其他变量固定为某个值

4.4 梯度

由全部变量的偏导数汇总而成的向量称为梯度(gradient)

4.4.1 梯度法

使用梯度寻找损失函数最小值的方法就是梯度法。梯度是各点处函数值减小最多的方向。方向往往不是函数的最小值。是极小值。

不断沿梯度方向前进,逐渐减小函数值的过程,叫梯度法 gradient method

学习率:一次学习,在多大程度上更新参数。

梯度下降法实现:

def gradient_descent(f, init_x, lr=0.01,step_num=100):
    x = init_x
    for i in range(step_num):
        grad = numerical_gradient(f,x)
        x -= lr * grad
    return x

4.4.2 神经网络的梯度

神经网络梯度:损失函数关于权重参数的梯度。形状与W相同。

求梯度代码

import sys,os
sys.path.append(os.pardir)
import numpy as np
from common.functions import softmax,cross_entropy_error
from common.gradient  import numerical_gradient

class simpleNet:
    def __init__(self):
        self.W = np.random.randn(2,3)
    def predict(self,x):
        return np.dot(x,self.W)
    def loss(self,x,t):
        z = self.predict(x)
        y = softmax(z)
        loss = cross_entropy_error(y,t)
        return loss

4.5 学习算法的实现

4.5.1 二层神经网络类

#two_layer_net.py
import sys,os
sys.path.append(os.pardir)
from common.functions import *
from common.gradient import numerical_gradient

class TwoLayerNet:
    def __init__(self,input_size,hidden_size,output_size,weight_init_std=0.01):
        self.params = {}
        self.params['W1'] = weight_init_std * np.random.randn(input_size,hidden_size)
        self.params['b1'] = np.zeros(hidden_size)
        self.params['W2'] = weight_init_std * np.random.randn(hidden_size,output_size)
        self.params['b2'] = np.zeros(output_size)
    def predict(self,x):
        W1,W2 = self.params['W1'], self.params['W2']
        b1,b2 = self.params['b1'], self.params['b2']
        a1 = np.dot(x,W1) + b1
        z1 = sigmoid(a1)
        a2 = np.dot(z1,W2) + b2
        y = softmax(a2)
        return y
    def loss(self, x, t):
         y = self.predict(x)
         return cross_entropy_error(y,t)
    def accuracy(self,x,t):
         y = self.predict(x)
         y = np.argmax(y, axis=1)
         t = np.argmax(t, axis=1)
         accuracy = np.sum(y==t)/float(x.shape[0])
         return accuracy
    def numerical_gradient(self,x,t):
        loss_W = lambda W:self.loss(x,t)
        grads = {}
        grads['W1'] = numerical_gradient(loss_W, self.params['W1']
        grads['b1'] = numerical_gradient(loss_W, self.params['b1']
        grads['W2'] = numerical_gradient(loss_W, self.params['W2']
        grads['b2'] = numerical_gradient(loss_W, self.params['b2']
        return grads

4.5.2  mini-batch学习

# train_neuralnet.py
import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet

(x_train,t_train),(x_test,t_test) = load_mnist(normalize=True,one_hot_label=True)
train_loss_list=[]

#超参数
iters_num = 10000
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.1
network = TwoLayerNet(input_size=784,hidden_size=50,output_size=10)
for i in range(iters_num):
    # 获取mini-batch
    batch_mask = np.random.choice(train_size,batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]
    #计算梯度
    grad = network.numerical_gradient(x_batch,t_batch)
    #grad = network.gradient(x_batch,t_batch)  #高速版,下一章介绍反向传播法再说
    #更新参数
    for key in ('W1','b1','W2','b2'):
        network.params[key] -= learning_rate * grad[key]
    #记录学习过程
    loss = network.loss(x_batch,t_batch)
    train_loss_list.append(loss)

4.5.3 基于测试数据评价

epoch是一个单位,所有训练数据被使用一次时的更新次数。10000训练数据,mini-batch为100,共执行梯度下降法10000/100=100次,100次就是一个epoch

import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet

(x_train,t_train),(x_test,t_test) = load_mnist(normalize=True,one_hot_label=True)
train_loss_list = []
train_acc_list = []
test_acc_list = []
#平均每个epoch的重复次数
iter_per_epoch = max(train_size/batch_size,1)
#超参数
iters_num = 10000
batch_size=100
learning_rate=0.1
network=TwoLayerNet(input_size=784,hidden_size=50,output_size=10)
for i in range(iters_num):
    batch_mask = np.random.choice(train_size,batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]
    grad = network.numerical_gradient(x_batch,t_batch)
    for key in ('W1','b1','W2','b2'):
        network.params[key] -= learning_rate*grad[key]
    loss = network.loss(x_batch,t_batch)
    train_loss_list.append(loss)
    #计算每个epoch的识别精度
    if i % iter_per_epoch == 0:
        train_acc = network.accuracy(x_train,t_train)
        test_acc = network.accuracy(x_test,t_test)
        train_acc_list.append(train_acc)
        test_acc_list.append(test_acc)
        print("train acc,test acc | " + str(train_acc) + "," + str(test_acc))

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

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

相关文章

java-Mybatis框架

简介 MyBatis 是一款优秀的持久层框架,它支持自定义 SQl、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Obje…

DFS 算法:全排列问题

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法:记忆化搜索 此系列更新频繁&…

k8s中service对象

文章目录 一、Service简介Service和kube-proxy的作用与区别Service的工作过程kube-proxy的工作过程总结 二、具体实践ClusterIPClusterIP 基本概念应用场景 NodePortNodePort 简介应用场景 ExternalName简介应用场景 一、Service 简介 Kubernetes (k8s) 中的 Service 对象是一…

使用redis设计延迟队列

目录 延迟队列概念与重要性 定义:延迟队列的基本概念 重要性:延迟队列在处理异步任务中的关键作用 图表:延迟队列的工作流程图 ​编辑延迟队列设计案例 背景介绍 设计目标 系统架构 设计要点 现有物理拓扑 图表:有赞延迟…

GStreamer 简明教程(五):Pad 相关概念介绍,Pad Capabilities/Templates

系列文章目录 GStreamer 简明教程(一):环境搭建,运行 Basic Tutorial 1 Hello world! GStreamer 简明教程(二):基本概念介绍,Element 和 Pipeline GStreamer 简明教程(三…

自修C++Primer----3.2标准库类型string

目录 1.String的相关操作 1.1拷贝初始化&&直接初始化 1.2显示创建临时对象 1.3读取string对象内容 1.4一次读取多个未知对象 1.5使用getline读取一整行内容 1.6size()的返回值size_type类型 1.7两个string对象比较 1.8string对象赋值 1.9两个string对象相加 1…

策略产品 ①算法逻辑

目录 一、机器学习与AI的关系 二、机器学习全流程 1. 问题定义 2. 数据处理 3. 特征工程 4. 模型训练 5. 模型评估 6. 模型应用 机器学习是AI的关键技术之一,是指机器从历史数据中学习规律,从而提升系统某个性能度量的过程。这篇文章,我们在作…

C Primer Plus第十四章编程练习,仅供参考

第十四章编程练习 第一个问题让我们改写复习题5&#xff0c;创建一个函数去计算一年到某个月份的天数&#xff0c;在一个结构数组中去存储相关数据。完整程序代码以及运行结果如下&#xff1a; #include<stdio.h> #include<string.h> #include<ctype.h> st…

当外接硬盘接入到macOS上,只读不可写时,应当格式化

当windows磁盘格式例如 NTFS 的硬盘接入到macOS上时&#xff0c;会发现无法新建文件夹&#xff0c;无法删除、重命名。原因是磁盘格式对不上macOS&#xff0c;需要进行格式化。格式化时请注意备份重要数据。具体做法如下&#xff0c;在macOS中找到磁盘工具&#xff0c;然后对磁…

【HTML】常用几种模拟动画效果【附源代码】

1. 模拟音频波纹加载效果 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

计算机视觉编程

目录 灰色度 缩略图 拷贝粘贴区域 调整图像尺寸 旋转图像45 画图线、描点 灰色度 灰度是指图像中每个像素的亮度值&#xff0c;用来描述图像中各个像素的明暗程度。在计算机视觉中&#xff0c;灰度可以通过以下方式来计算&#xff1a; 1. 平均值法&#xff1a;将图像中每…

如何在程序中创建出多条线程

多线程是编程中的一个重要概念&#xff0c;它允许程序同时执行多个任务&#xff0c;每个任务可以看作是一个线程。在Java中&#xff0c;多线程尤为常见且强大&#xff0c;它通过允许程序在并发环境下运行&#xff0c;提高了程序的执行效率和响应速度。以下是对Java多线程的详细…

数学建模~~~预测方法--决策树模型

目录 0.直击重点 1.决策树概念 2.节点特征的选择算法 3.基尼系数的计算 4.决策树的分类 5.模型的搭建 6.模型的改进和评价 ROC曲线 参数调优 &#xfeff;GridSearch网格搜索 使用搜索结果重新建模 0.直击重点 这个文章&#xff0c;我们从三个维度进行说明介绍&#…

如何使用Python快速修改文件的标签(如何将歌词嵌入到音乐文件中,含歌词嵌入接口源码)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Python与Music 📒📝 1. 初探音乐文件的标签📝 使用Python修改标签📝 将歌词嵌入音乐文件⚓️ 相关链接 ⚓️📖 介绍 📖 你是否曾经听过一首好听的歌曲,却发现它的标签信息(元数据信息)杂乱无章?甚至找不到歌词?…

【Remi Pi开发板镜像烧录】使用sd卡进行瑞米派镜像的烧录

烧录大典 按照《软件开发指南》4.2.1和4.2.2的顺序进行&#xff0c;具体烧录哪个镜像结合你自己的需求&#xff0c;每个镜像的区别参考以下链接 https://mbb.eet-china.com/forum/topic/143906_1_1.html Tera term界面全屏如下设置看着比较舒服 设置完之后setup->save-&g…

智能优化特征选择|基于鹦鹉优化(2024年新出优化算法)的特征选择(分类器选用的是KNN)研究Matlab程序 【优化算法可以替换成其他优化方法】

智能优化特征选择|基于鹦鹉优化&#xff08;2024年新出优化算法&#xff09;的特征选择&#xff08;分类器选用的是KNN&#xff09;研究Matlab程序 【优化算法可以替换成其他优化方法】 文章目录 一、PO基本原理PO基本原理基本流程示例应用 二、实验结果三、核心代码四、代码获…

npm pack使用

npm pack 的作用主要是从包中创建一个压缩文件&#xff08;tarball&#xff09;&#xff0c;通常具有.tgz扩展名&#xff0c;包含了打包的模块及其依赖&#xff0c;可用于分发或部署。其应用场景包括私有库或组件的分发、离线环境的依赖安装、CI/CD 自动化构建等。 在使用npm管…

UE管理内容 —— FBX Material Pipeline

目录 Material Support Multiple Materials Material Naming Material Ordering Texture Import FBX管道将应用于网格体&#xff08;静态网格体和骨架网格体&#xff09;的材质和纹理&#xff0c;从3D应用程序传输到虚幻&#xff1b; 要转换简单材质&#xff0c;可以导入源…

Gameplay Ability System(通过GameplayEffect里的Execution修改角色属性)

一、关于GameplayEffectExecutionCalculation类 1、查看GameplayEffectExecutionCalculation类的Execute函数 这个函数将编辑器里设置的参数传进来&#xff0c;然后通过计算再返回出去&#xff0c;这个函数被标记为BlueprintNativeEvent&#xff0c;所以我们可以在自己的类Pla…

python怎么去除换行符

在Python的编写过程中&#xff0c;获取到的字符串进场存在不明原因的换行和空格&#xff0c;如何整合成一个单句&#xff0c;成为问题。 方法&#xff1a; 一、去除空格 “ ”代表的为空格 "xyz".strip() # returns "xyz" "xyz".ls…