3.深度学习入门:多维数组的运算 多维数组 矩阵乘法 神经网络的内积 层神经网络的实现 符号确认 各层间信号传递的实现

3.深度学习入门:多维数组的运算 多维数组 矩阵乘法 神经网络的内积 层神经网络的实现 符号确认 各层间信号传递的实现

多维数组的运算

多维数组

在深度学习中,多维数组是非常重要的数据结构。通常,我们使用 numpy 库来处理多维数组。以下是一些基本的 numpy 操作:

创建一个数组:

import numpy as np
a = np.array([1, 2, 3]) # 一维数组
b = np.array([[1, 2, 3], [4, 5, 6]]) # 二维数组
c = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) # 三维数组

获取数组的形状:

print(a.shape) # 输出 (3,)
print(b.shape) # 输出 (2, 3)
print(c.shape) # 输出 (2, 2, 2)

获取数组的元素个数:

print(a.size) # 输出 3
print(b.size) # 输出 6
print(c.size) # 输出 8

获取数组的数据类型:

print(a.dtype) # 输出 int64
print(b.dtype) # 输出 int64
print(c.dtype) # 输出 int64

改变数组的形状:

d = np.array([1, 2, 3, 4, 5, 6])
d = d.reshape((2, 3)) # 将一维数组转换为二维数组
print(d) # 输出 [[1 2 3] [4 5 6]]

数组的索引和切片:

print(a[0]) # 输出 1
print(b[0, 1]) # 输出 2
print(c[1, 0, 1]) # 输出 6
print(a[:2]) # 输出 [1 2]
print(b[1, :2]) # 输出 [4 5]
print(c[0, :, 1]) # 输出 [2 4]

这些是 numpy中基本的多维数组操作,深度学习中的神经网络模型也是基于多维数组进行计算的。因此,深入理解多维数组的操作和特性是非常重要的。

矩阵乘法

  • 矩阵乘法是线性代数中的一种基本运算,也是深度学习中常用的运算。在深度学习中,矩阵乘法通常用于计算神经网络中的前向传播和反向传播。
  • 假设有两个矩阵 A 和 B,它们的形状分别为 (m, n) 和 (n, p),其中 m、n、p 分别表示矩阵的行数和列数。那么矩阵 A和矩阵 B 的乘积 C 的形状为 (m, p)。

矩阵乘法的计算方式如下:
C i , j = ∑ k = 1 n A i , k × B k , j C_{i,j} = \sum_{k=1}^{n} A_{i,k} \times B_{k,j} Ci,j=k=1nAi,k×Bk,j

其中, C i , j C_{i,j} Ci,j 表示矩阵 C 在第 i i i 行、第 j j j 列的元素, A i , k A_{i,k} Ai,k 表示矩阵 A 在第 i i i 行、第
k k k 列的元素, B k , j B_{k,j} Bk,j 表示矩阵 B 在第 k k k 行、第 j j j 列的元素。

在 Python 中,可以使用 numpy 库来进行矩阵乘法的计算。代码如下:

import numpy as np

A = np.array([[1, 2], [3, 4], [5, 6]])  # 形状为 (3, 2) 的矩阵
B = np.array([[7, 8, 9], [10, 11, 12]])  # 形状为 (2, 3) 的矩阵

C = np.dot(A, B)  # 矩阵乘法,结果为形状为 (3, 3) 的矩阵

print(C)

输出结果为:
[[ 27  30  33]
 [ 61  68  75]
 [ 95 106 117]]

其中,np.dot 函数表示矩阵乘法。

神经网络的内积

神经网络中的内积,也称为点积,是指两个向量的对应元素相乘后相加的结果。在神经网络中,内积通常用于计算神经元之间的连接权重和输入信号的乘积之和。
假设有两个向量 x x x y y y,它们的长度相同,即都有 n n n 个元素。那么它们的内积可以表示为:
x ⋅ y = ∑ i = 1 n x i y i x \cdot y = \sum_{i=1}^{n} x_i y_i xy=i=1nxiyi
在神经网络中,内积通常用于计算神经元之间的连接权重和输入信号的乘积之和,可以表示为:
z = ∑ i = 1 n w i x i + b z = \sum_{i=1}^{n} w_i x_i + b z=i=1nwixi+b
其中, w i w_i wi 表示连接权重, x i x_i xi 表示输入信号, b b b 表示偏置。
在 Python 中,可以使用 numpy 库来计算两个向量的内积。代码如下:

import numpy as np

x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

z = np.dot(x, y)  # 计算内积

print(z)  # 输出 32

在神经网络中,可以使用 numpy 库来计算神经元之间的内积。代码如下:
import numpy as np

x = np.array([1, 2, 3])
w = np.array([0.1, 0.2, 0.3])
b = 0.4

z = np.dot(w, x) + b # 计算神经元之间的内积

print(z) # 输出 1.2

其中, x x x 表示输入信号, w w w 表示连接权重, b b b 表示偏置, z z z 表示神经元之间的内积。

层神经网络的实现

符号确认

在实现一个层神经网络之前,需要确认一些符号的含义:

  • 输入层:输入层是神经网络的第一层,用于接收输入数据。输入层通常表示为 x x x
  • 隐藏层:隐藏层是在输入层和输出层之间的一层或多层,用于对输入数据进行加工和转换。隐藏层通常表示为 h h h
  • 输出层:输出层是神经网络的最后一层,用于输出神经网络的预测结果。输出层通常表示为 y y y
  • 权重:权重是神经元之间的连接强度,用于计算神经元之间的内积。权重通常表示为 w w w
  • 偏置:偏置是神经元的激活阈值,用于调整神经元的输出值。偏置通常表示为 b b b
    激活函数:激活函数是神经元的非线性变换,用于增强神经网络的表达能力。激活函数通常表示为 σ \sigma σ

各层间信号传递的实现

层神经网络的实现通常需要实现各层之间信号传递的过程,包括前向传播和反向传播。下面是一个简单的层神经网络的实现,包括输入层、隐藏层和输出层。
首先,需要导入 numpy 库,用于实现矩阵乘法和激活函数等操作。

import numpy as np

然后,定义一个 NeuralNetwork 类,用于实现层神经网络。该类包括以下方法:

init:初始化神经网络,包括输入层、隐藏层和输出层的大小、权重和偏置。
sigmoid:sigmoid 激活函数,用于增强神经网络的表达能力。
sigmoid_derivative:sigmoid 激活函数的导数,用于反向传播时计算梯度。
feedforward:前向传播,用于将输入信号传递到输出层。
backpropagation:反向传播,用于计算损失函数的梯度并更新权重和偏置。
train:训练神经网络,包括多次迭代前向传播和反向传播。
predict:预测输出结果。

代码如下:

class NeuralNetwork:
    # 初始化神经网络
    def __init__(self, X, y, hidden_size):
        # 输入层大小为 X 的列数
        self.input_size = X.shape[1]
        # 输出层大小为 y 的列数
        self.output_size = y.shape[1]
        # 隐藏层大小
        self.hidden_size = hidden_size
        # 权重
        self.weights1 = np.random.randn(self.input_size, self.hidden_size)
        self.weights2 = np.random.randn(self.hidden_size, self.output_size)
        # 偏置
        self.bias1 = np.zeros((1, self.hidden_size))
        self.bias2 = np.zeros((1, self.output_size))

<span class="hljs-comment"># sigmoid 激活函数</span>
<span class="hljs-keyword">def</span> <span class="hljs-function">sigmoid</span><span class="hljs-params">(self, z)</span>:
    return <span class="hljs-number">1</span> / ( <span class="hljs-number">1</span> + np.exp(-z))

<span class="hljs-comment"># sigmoid 激活函数的导数</span>
<span class="hljs-keyword">def</span> <span class="hljs-function">sigmoid_derivative</span><span class="hljs-params">(self, z)</span>:
    return self.sigmoid(z) * ( <span class="hljs-number">1</span> - self.sigmoid(z))

<span class="hljs-comment"># 前向传播</span>
<span class="hljs-keyword">def</span> <span class="hljs-function">feedforward</span><span class="hljs-params">(self, X)</span>:
    <span class="hljs-comment"># 输入层到隐藏层的信号传递</span>
    self.z1 = np.dot(X, self.weights1) + self.bias1
    self.a1 = self.sigmoid(self.z1)
    <span class="hljs-comment"># 隐藏层到输出层的信号传递</span>
    self.z2 = np.dot(self.a1, self.weights2) + self.bias2
    self.a2 = self.sigmoid(self.z2)
    <span class="hljs-comment"># 返回输出层的结果</span>
    <span class="hljs-keyword">return</span> self.a2

<span class="hljs-comment"># 反向传播</span>
<span class="hljs-keyword">def</span> <span class="hljs-function">backpropagation</span><span class="hljs-params">(self, X, y, output)</span>:
    <span class="hljs-comment"># 计算输出层的误差</span>
    self.output_error = y - output
    <span class="hljs-comment"># 计算输出层的梯度</span>
    self.output_delta = self.output_error * self.sigmoid_derivative(self.z2)
    <span class="hljs-comment"># 计算隐藏层的误差</span>
    self.hidden_error = self.output_delta.dot(self.weights2.T)
    <span class="hljs-comment"># 计算隐藏层的梯度</span>
    self.hidden_delta = self.hidden_error * self.sigmoid_derivative(self.z1)
    <span class="hljs-comment"># 更新权重和偏置</span>
    self.weights1 += X.T.dot(self.hidden_delta)
    self.weights2 += self.a1.T.dot(self.output_delta)
    self.bias1 += np.sum(self.hidden_delta, axis=<span class="hljs-number">0</span>, keepdims=<span class="hljs-literal">True</span>)
    self.bias2 += np.sum(self.output_delta, axis=<span class="hljs-number">0</span>, keepdims=<span class="hljs-literal">True</span>)

<span class="hljs-comment"># 训练神经网络</span>
<span class="hljs-keyword">def</span> <span class="hljs-function">train</span><span class="hljs-params">(self, X, y, epochs)</span>:
    <span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(epochs):
        output = self.feedforward(X)
        self.backpropagation(X, y, output)

<span class="hljs-comment"># 预测输出结果</span>
<span class="hljs-keyword">def</span> <span class="hljs-function">predict</span><span class="hljs-params">(self, X)</span>:
    <span class="hljs-keyword">return</span> self.feedforward(X)

在实现层神经网络的过程中,需要注意以下几点:

  • 初始化权重时,可以使用随机数来初始化,以避免权重的初始值对神经网络的训练产生影响。
  • 在前向传播中,需要对输入信号进行加权和加偏置,并经过激活函数进行非线性变换。
  • 在反向传播中,需要计算损失函数的梯度,并根据梯度来更新权重和偏置。
  • 在训练神经网络时,需要进行多次迭代,每次迭代都包括前向传播和反向传播。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容推荐 预测是作决策、规划之前的必不可少的重要环节 ,是科学决 策、规划的重要前提。混沌时序列预测是预测领域 内的一个重 要研究方向。基于小波和人工神经网络的混沌时序 列预测研究 是近几年来的研究热点,受到了特别的重视。小波神 经网络是结 合小波变换理论与人工神经网络的思想而构造的一种 新的神经网 络模型,它结合了小波变换良好的时频局域化性质及 神经网络的 自学习功能,因而具有较强的逼近能力和容错能力。 自从小波神 经网络被提出以后,它在非线性函数或信号逼近、信 号表示和分 类、系统辨识和动态建模、非平稳时序列预测与分 析等许多领域 中被较为广泛地应用。尽管如此,将小波和人工神经 网络理论应 用到预测还有许多不尽如人意和有待进一步研究的地 方,还有很 大的研究余地。姜爱萍编著的《混沌时序列的小波 神经网络预测方法及其优化研究》对此进行了深入分 析和研究,主要研究了小 波神经网络的构造、学习和优化以及小波神经网络在 混沌时序 列预测中的应用,构建了适应于混沌时序列短期预 测的模型,并 将其应用于中国股票价格预测。《混沌时序列的小 波神经网络预测方法及其优化研究》主要研究成果与 创新点分述 如下: (1)用混沌理论及其分析方法对非线性时序 列进行了研 究,为混沌时序列的短期预测性提供了理论基础。 并以上证综 合指数为例,通过对其进行相空重构,反映了股指 序列具有吸引 子结构。同时,对股指序列进行了确定性检验,求取 最大李雅普诺 夫指数。根据最大李雅普诺夫指数,确定了上证综合 指数序列具 有混沌特性,这为探求股指变化规律和正确建立其短 期预测模型 奠定了基础。 (2)从小波神经网络构造理论出发,详细介绍 了小波神经网 络的数学基础和性质,对目前广泛应用的四种小波神 经网络的结 构进行了深入分析,根据网络算法、逼近细节能力、 包含频域信息 广等方面因素,提出多分辨小波神经网络更适合混沌 时序列预 测,因为多分辨小波神经网络既能逼近混沌时序列 的整体变化 趋势,又能捕捉细节的变化。 (3)利用相空重构技术,把消噪后得到的状 态矢量作为多 分辨小波神经网络的多维输入,构建了多维多分辨小 波神经网络 预测模型,将其应用于混沌时序列预测,并给出了 实现方法。针 对多分辨小波神经网络提出了BP和多分辨率学习组合 算法,解 决了传统学习算法网络隐层节点数难以确定的问题, 克服了BP 网络单尺度学习算法很难学习复杂的时序列的不足 。以上证综 合指数为例,分别采用具有相同结构的MRA—WNN和 RBF_ VJNN预测模型对股价时序进行预测,仿真结果表明, 多分辨小波 神经网络具有较高的预测精度。 (4)给出了小波神经网络的优化的两类非单调 的方法。一类 是非单调的滤子方法,并且证明了该算法是全局收敛 到一阶临界 点。这个算法不同于传统的滤子信赖域方法,因为它 使用了试探 步的切向和法向的分解;也不同于Gould提出的非单 调方法,因为 本书提出的非单调性更为松弛。这使得在不引入二阶 校正步的情 况下改进了滤子方法。同时也不再定义支配区域的边 界,而直接 使用面,这样也相应简化了算法。另一类是非单调 的无罚函数 方法,该方法利用非单调线搜索和对于约束违反度函 数的可行性 恢复阶段来达到目标函数和约束违反度函数之的平 衡,而非单 调的方法在M一1时是等价于单调方法的,非单调方法 从M步看 来仍然是单调的。当然,在这种方法中,也可以采用 试探步分解的 技术,然后利用滤子来做接受性的检验。进一步地, 我们还可以将 非单调的滤子方法推广到一般的约束最小化问题之中 ,数值结果 表明这种方法也是可执行的且是有效的,并用此两种 方法作为训 练小波神经网络的优化新算法。 (5)提出将无罚函数方法与非线性互补问题相 结合用于小波 神经网络的优化,将互补问题转化为约束优化问题, 应用约束优化 问题的策略和技巧对其求解,融入无罚函数的概念, 并得到了算法 的收敛性。同时,其数值结果也表明这类算法和同类 的其他方法 比起来更为灵活,且具有更好的数值效果。 (6)提出基于修正的SQP滤子方法的小波神经网 络的优化, 修正了序列二次规划子问题,使得二次规划子问题在 每个迭代处 总是可解的,同时不用线搜索,提出了修正的滤子方 法。另外,引 入极集策略,减小运算量。当第一次得到的搜索方 向不被滤子 接受时,不是直接舍弃它,而是转而以这个方向为基 础,构造另一 个可行下降的搜索方向。并在此基础上加入了线搜索 ,得到了带 线搜索的滤子方法,其数值结果也说明基于修正的 SQP滤子方法 的小波神经网络的优化是有效的。 (7)提出基于新的无罚函数方法的小波神经网 络的优化,应 用NCP函数把约束优化问题转化为非线性非光滑方程 的求解问 题。运用分裂的思想将其分裂为光滑函数和非光滑函 数之和, 同时将NCP函数的信息融入了滤子对中,改造了原有 的滤子对 的形式,最终得到了算法的全局收敛性和局部超线性 收敛性。 另外,为了求解大规模问题,结合极集策略,提出 了极集滤 子方法,得到了非单调的滤子方法简化小波神经网络 优化运算 的目的。 (8)用全局优化方法——填充函数法研究了小 波神经网络 的优化方法,构造了一种新的易于计算的单参数的填 充函数,不 仅证明了新构造的函数具有填充函数的性质,还把填 充函数和 BP算法相结合,提出一种训练小波神经网络的混合型 全局优化 新算法。 (9)在退火遗传算法的基础上提出一个新的自 适应退火策 略,将自适应退火策略用于选择概率的计算以增强算 法的收敛性, 在交叉和变异概率的选取上也进行了自适应处理,以 进一步改善 算法的稳定性和收敛性,并将此自适应退火遗传算法 应用于小波 神经网络权值的优化。
Python神经网络不使用数组进行计算的原因有以下几点: 1. Python是一种解释型语言,相比于使用数组进行计算,使用Python的列表或者其他数据结构可以更加灵活方便地处理数据。虽然数组在数值计算方面更快,但是在神经网络实现中,数据的处理和转换更需要便捷性和灵活性。 2. 神经网络的计算涉及到多维矩阵运算,而Python的数组是使用列表实现的,其性能相对较低。为了加快神经网络的计算速度,一般会使用一些高性能的科学计算库,如NumPy,来进行数组计算。这些库会使用C或者Fortran来实现底层计算,以提高计算效率。 3. 使用数组进行计算,需要手动编写循环来处理每个元素,而Python提供了丰富的集合(如列表、元组等)和高级函数(如map、reduce等)来简化代码编写。使用这些集合和函数,可以更加直观地表达神经网络的计算过程,提高代码的可读性和维护性。 4. 神经网络通常需要处理大量的数据,而Python的数组是动态的,可以自由地添加、删除元素。这在处理大规模的数据集时,会导致频繁地进行内存分配和释放,影响性能。而使用固定大小的数组,可以提前分配好内存,避免这个问题。 总的来说,虽然Python的数组在数值计算方面性能相对较低,但由于Python的高级特性和科学计算库的支持,可以更方便地表达神经网络的计算过程,并且在实际应用中可以通过其他方式来加速计算。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值