【深度学习】3-4 神经网络的学习- 学习算法的实现

article/2025/10/5 17:33:55

神经网络的学习步骤如下所示:

步骤1(mini-batch)
从训练数据中随机选出一部分数据,目标是减小mini-batch的损失函数的值

步骤2(计算梯度)
为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度

步骤3(更新参数)
将权重参数沿梯度方向进行微小更新.

步骤4(重复)
重复步骤1、步骤2、步骤3。

这里因为使用的数据是随机选择的mini batch数据,所以称为随机梯度下降法(stochastic gradient descent)。深度学习的很多框架中,随机梯度下降法一般由一个名为SGD的函数来实现, SGD来源于随机梯度下降法的英文名称的首字母。

下面,来实现手写数字识别的神经网络。这里以2层神经网(隐藏层为1层的网络)为对象,使用MNIST数据集进行学习。
首先,下面看这个名为TwoLayerNet的类

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
from common.functions import *
from common.gradient import numerical_gradientclass 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) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)return y# x:输入数据, t:监督数据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# x:输入数据, t:监督数据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 gradsdef gradient(self, x, t):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']grads = {}batch_num = x.shape[0]# forwarda1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)# backwarddy = (y - t) / batch_numgrads['W2'] = np.dot(z1.T, dy)grads['b2'] = np.sum(dy, axis=0)da1 = np.dot(dy, W2.T)dz1 = sigmoid_grad(a1) * da1grads['W1'] = np.dot(x.T, dz1)grads['b1'] = np.sum(dz1, axis=0)return grads

mini-batch的实现
神经网络的学习的实现使用的是前面介绍过的mini-batch学习。下面,就以TwoLayerNet类为对象,使用MNIST数据集进行学习

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import matplotlib.pyplot as plt
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)network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)iters_num = 10000  # 适当设定循环的次数
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.1train_loss_list = []
train_acc_list = []
test_acc_list = []iter_per_epoch = max(train_size / batch_size, 1)for i in range(iters_num):# 获取mini-batchbatch_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)# 计算每个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))# 绘制图形
markers = {'train': 'o', 'test': 's'}
x = np.arange(len(train_acc_list))
plt.plot(x, train_acc_list, label='train acc')
plt.plot(x, test_acc_list, label='test acc', linestyle='--')
plt.xlabel("epochs")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
plt.legend(loc='lower right')
plt.show()

神经网络的学习中,必须确认是否能够正确识别训练数据以外的其他数据,即确认是否会发生过拟合。过拟合是指,虽然训练数据中的数字图像被正确辨别,但是不在训练数据中的数字图像却无法被识别的现象。
神经网络学习的最初目标是掌握泛化能力,因此,要评价神经网络的泛化能力,就必须使用不包含在训练数据中的数据。所以在进行学习过程中,要定期地对训练数据和测试数据记录识别精度。这里,每经过一个epoch,都会记录下训练数据和测试数据的识别精度。

epoch是一个单位。一个epoch表示学习中所有训练数据均被使用一次时的更新次数。比如,对于10000笔训练数据,用大小为100笔数据的mini-batch进行学习时,重复随机梯度下降法100次有的训练数据就都被“看过”了。此时,100次就是一个epoch

把从上面的代码中得到的结果用图标表示的话,如下图:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/cITO5Uw2.shtml

相关文章

神经网络算法基本介绍,简单神经网络算法原理

神经网络是什么? 生物神经网络主要是指人脑的神经网络,它是人工神经网络的技术原型。 人脑是人类思维的物质基础,思维的功能定位在大脑皮层,后者含有大约10^11个神经元,每个神经元又通过神经突触与大约103个其它神经…

神经元的计算

神经元的计算 单神经元内部参数的设置偏移值 b 的作用神经网络的分层常用的激活函数 单神经元 人类大脑神经元细胞的树突接收来自外部的多个强度不同的刺激,并在神经元细胞体内进行处理,将其转化为一个输出结果,功能抽象图示: 神…

神经学习(算法)

神经元与激励函数 神经元 神经元是神经网络的基本组成,如果把它画出来,大概就长成下面这样: 图中神经元左边的x表示对神经元的多个输入,w表示每个输入对应的权重,神经元右边的箭头表示它仅有一个输出。 当然神经元也…

神经网络十大算法有哪些,神经网络十大算法排名

数学建模的十大算法 。 1、蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟可以来检验自己模型的正确性,是比赛时必用的方法)2、数据拟合、参数估计、插值等数据处理算法…

训练神经网络的五大算法

原文: 5 algorithms to train a neural network 作者: Alberto Quesada 译者: KK4SBB 责编:何永灿,关注人工智能,投稿请联系 heyccsdn.net 或微信号 289416419 神经网络模型的每一类学习过程通常被归纳为一…

论文阅读2--《融合多因素的短时交通流预测研究》

1.问题的提出 现有的交通流预测研究大多为常态下的预测,而未考虑天气、节假日等外部因素的影响。 2.交通流预测相关工作 (1)传统的短时交通流研究方法: 卡尔曼滤波模型、历史平均模型、时间序列模型、非参数回归模型、混沌理论…

用于交通流预测的时间多图卷积网络

为了联合建模道路网络中各种全局特征的空间、时间和语义关联,本文提出了一种用于交通流预测的深度学习框架T-MGCN(时态多图卷积网络)。首先,我们识别了几种语义关联,并将道路之间的非欧几里德空间关联和异构语义关联编…

交通流分析1:《基于大数据的城市公路交通流短时预测研究_张红》阅读总结

大概读了一下,第6节小波分析那里实在没有看懂。 如果有理解不对的地方欢迎批评指正。 建模方法 这篇论文选用的是时间序列模型和小波理论,小波理论那里我实在没看懂,说说他基于时间序列模型的组合建模方法,这是选择时间序列模型的…

matlab中的AR模型短时预测交通流

1、内容简介 略 438-可以交流、咨询、答疑 2、内容说明 智能交通系统的宗旨,就是利用丰富的交通检测数据,对未来的交通流状态进行预测,对于最大效率的利用快速路资源,减少出行者时间,减少快速路交通拥挤与交通事故。短时交通流预测是道路交通控制系统、交通流诱导系统等领域…

交通流预测爬坑记(三):使用pytorch实现LSTM预测交通流

很长时间没有更新内容了,上一篇可以看做是刚接触深度学习写的,看法非常狭隘,内容非常粗糙。 在最近的学习中接触到了Pytorch,不得不承认,相对于TensorFlow来讲,灵活很多。 这次就使用pytroch来进行一下交通…

Python交通流仿真【含源码】

虽然交通并不总是畅通无阻,但汽车无缝穿越交叉路口,在交通信号灯处转弯和停车看起来相当壮观。这种沉思让我思考交通流对人类文明的重要性。 在此之后,内心的书呆子特质让我忍不住思考一种模拟交通流的方法。我在一个涉及交通流量的本科项目…

基于深度学习的短时交通流预测与优化

TOC 第二章 数据预处理与短时交通流量特性分析 2.1 数据来源 数据记录了明尼苏达州双子城19条高速环城公路一整年的交通流量,交通流量数据采样间隔为30秒(采用2018年6月1日至8月31日期间,采集间隔为5分钟,选取公路上的5个车辆检测站点的交…

基于Spatial-Temporal Transformer的城市交通流预测

文章信息 本周阅读的论文是题目为《Spatial-Temporal Transformer Networks for Traffic Flow Forecasting》的一篇2021年发布在arXiv网站上的使用时空Transformer网络(STTNs)预测交通流的文章。 摘要 交通预测已成为智能交通系统的核心组成部分。然而&a…

基于推特数据挖掘交通事件的城市交通流深度学习预测模型

文章信息 本周阅读的论文是题目为《A deep-learning model for urban traffic flow prediction with traffic events mined from twitter》的一篇2021年发表在《World Wide Web》涉及交通事故下的城市交通客流预测的文章。 摘要 短期交通预测是现代城市交通管理和控制系统的关键…

交通流优化:一种强化学习方法

1. 文章信息 《Traffic flow optimization: A reinforcement learning approach》是2016年发表在Engineering Applications of Artificial Intelligence的一篇文章。 2. 摘要 交通拥堵会导致诸如延误、燃油消耗增加和额外污染等重要问题。本文提出了一种新的基于强化学习的交通…

SUMO交通流仿真实战

理解、预测并最终减少城市路网中的交通拥堵是一个复杂的问题。即使了解最简单的单车道情况下出现的交通拥堵, 也是具有挑战性的。SUMO是一个开源平台,可模拟复杂环境中的交通流。在这个教程里,我们将学习如何从零创建复杂的交通流模拟&#x…

python交通流预测算法_一种高速公路交通流预测方法与流程

本发明涉及智能交通领域,更具体地,涉及一种高速公路交通流预测方法。 背景技术: 随着社会经济的不断增长,国内汽车的拥有量越来越多,高速公路车流量急剧上升,从而导致高速公路上车辆拥堵愈发严重。现有方法采用径向基函数神经网络训练网络参数的算法,在粗略搜索过程中容…

交通流特征工程小技巧与思考

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、交通流是什么?二、特征工程是什么?三、处理数据时的一些小技巧四、一些常用的机器学习python库总结 前言 小编最近参与了一些工程方…

初等模型---交通流和道路通行能力

交通流的基本参数及其特性 为明确和简单起见,这里的交通流均指由标准长度的小型汽车在单方向的。 道路上行驶而形成的车流,没有外界因素如岔路、信号灯等的影响。 借用物理学的概念,将交通流近似看作一辆辆汽车组成的连续的流体,可以 用流量、…

交通流理论 第一章 绪论

第一章 绪论 1.1 交通流理论研究的内容和意义 交通流理论是运用物理学和数学的定律描述交通特性的交通工程学基础理论之一;道路设施可以分为两类:连续流和间断流设施。连续流设施为机动车流提供了相对连续的运行环境,几乎没有强制性阻断干扰…