解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”

news/2025/2/21 9:56:43

一、神经网络:AI 领域的 “超级引擎”

机器学习的庞大算法体系中,有十种算法被广泛认为是最具代表性和实用性的,它们犹如机器学习领域的 “十大神器”,各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森林、K - 近邻算法、K - 平均算法、支持向量机、朴素贝叶斯算法、主成分分析(PCA)、神经网络。它们涵盖了回归、分类、聚类、降维等多个机器学习任务领域,是众多机器学习应用的基础和核心。

在当今科技飞速发展的时代,人工智能(AI)无疑是最耀眼的明星,而神经网络作为机器学习中的核心算法,更是推动 AI 不断前行的 “超级引擎”。从智能手机中的语音助手,到自动驾驶汽车,再到图像识别、自然语言处理等领域,神经网络的身影无处不在,它正以强大的学习和预测能力,改变着我们的生活和工作方式。那么,神经网络究竟是如何运作的?它又有着怎样的发展历程和应用前景呢?接下来,就让我们一起走进神经网络的奇妙世界。

二、神经网络的前世今生

神经网络的发展历程可谓是一部充满曲折与突破的科技史诗。它的起源可以追溯到 20 世纪 40 年代,当时,科学家们受到生物神经元的启发,开始尝试构建简单的人工神经元模型。1957 年,Frank Rosenblatt 提出了感知机(Perceptron) ,这是第一个可以学习的线性分类器,它能够实现简单的逻辑运算,如 “与”“或” 等,为神经网络的研究奠定了基础。然而,感知机只能处理线性可分问题,无法解决 “异或” 等非线性问题,这严重限制了其应用范围。加上当时的计算机计算能力有限,无法满足训练复杂神经网络的需求,Marvin Minsky 和 Seymour Papert 在其著作《感知机》中指出了感知机的局限性,对神经网络研究泼了一盆冷水,导致该领域的研究陷入低谷,神经网络迎来了它的第一次寒冬。

到了 20 世纪 80 年代,多层感知机(Multilayer Perceptron, MLP)的提出克服了单层感知机的局限性,能够解决非线性问题。它通过增加隐藏层的数量,使得神经网络能够处理更加复杂的非线性问题,隐藏层中的神经元可以对输入数据进行更加复杂的变换,从而提高了神经网络的表达能力 。同时,反向传播算法(Backpropagation Algorithm)的出现使得训练多层感知机成为可能,该算法通过计算神经网络的误差,并将误差从输出层反向传播到输入层,从而调整神经网络的权重,这一突破推动了神经网络的第二次发展浪潮。神经网络在语音识别、图像识别等领域取得了一定的进展,但由于训练数据不足、计算能力有限等问题,其性能仍然受到限制。随后在 90 年代,支持向量机(Support Vector Machine, SVM)等其他机器学习方法兴起,在性能和泛化能力上超越了当时的神经网络,且神经网络训练困难、容易过拟合等问题仍然没有得到很好解决,使得神经网络研究再次进入低谷。

直到 21 世纪 10 年代,随着硬件性能大幅提升,特别是 GPU 的应用为深度学习提供了强大的计算能力,大数据的出现也为训练深度神经网络提供了充足的数据支持。新的算法和网络结构不断涌现,例如卷积神经网络(Convolutional Neural Network, CNN)、循环神经网络(Recurrent Neural Network, RNN)等,极大地提升了神经网络的性能 。2012 年,Hinton 的团队使用深度学习算法在 ImageNet 图像识别比赛中取得了压倒性胜利,标志着深度学习时代的到来。此后,神经网络在图像识别、语音识别、自然语言处理、机器翻译等领域取得了突破性进展,并被广泛应用于各个行业,开启了神经网络发展的黄金时代。

三、神经网络的运作原理大揭秘

(一)神经元:神经网络的基石

神经元是神经网络的基本组成单元,其结构灵感来源于生物神经元。它主要由输入权重求和函数激活函数组成。每个神经元接收多个输入信号,这些输入信号与对应的权重相乘,然后将乘积结果进行求和,再通过激活函数处理后输出。

用数学公式来表示,假设一个神经元有 n n n 个输入 x 1 , x 2 , ⋯   , x n x_1,x_2,\cdots,x_n x1,x2,,xn,对应的权重为 w 1 , w 2 , ⋯   , w n w_1,w_2,\cdots,w_n w1,w2,,wn,偏置为 b b b,则神经元的输入总和 z z z 为:

z = ∑ i = 1 n w i x i + b z=\sum_{i = 1}^{n}w_ix_i + b z=i=1nwixi+b

然后,将 z z z 输入到激活函数 f f f 中,得到神经元的输出 y y y

y = f ( z ) y = f(z) y=f(z)

(二)激活函数:赋予神经网络 “智慧”

激活函数神经网络中起着至关重要的作用,它为神经网络引入了非线性因素。如果没有激活函数,神经网络仅仅是简单的线性组合,无论网络有多少层,其表达能力都非常有限,只能处理线性可分问题。而激活函数的加入,使得神经网络能够学习和模拟复杂的非线性关系,大大提升了模型的表达能力。

常见的激活函数有 SigmoidReLU 等。

  • Sigmoid 函数的表达式为: σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1 + e^{-x}} σ(x)=1+ex1
    它将输入值映射到 0 到 1 之间,在早期的神经网络中应用广泛,比如在逻辑回归二分类问题中,常被用来将输出转换为概率值。但 Sigmoid 函数存在梯度消失问题,当输入值过大或过小时,其导数趋近于 0,导致在反向传播过程中梯度难以传递,使得网络训练困难。

  • ReLU(Rectified Linear Unit)函数则定义为: f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)
    当输入大于 0 时,输出等于输入;当输入小于等于 0 时,输出为 0。ReLU 函数计算简单,能够有效解决梯度消失问题,在现代神经网络中被广泛使用 ,如在卷积神经网络(CNN)和 循环神经网络(RNN)中,ReLU 函数常常作为隐藏层的激活函数,提高了网络的训练效率和性能。

(三)前向传播:数据的 “前进之旅”

前向传播神经网络处理数据的过程,数据从输入层进入,依次经过隐藏层,最后到达输出层。在每一层中,神经元根据输入数据和权重进行计算,并通过激活函数输出结果,作为下一层的输入。

假设一个简单的三层神经网络,输入层有 n n n 个神经元,隐藏层有 m m m 个神经元,输出层有 k k k 个神经元。输入数据为 x = ( x 1 , x 2 , ⋯   , x n ) \mathbf{x}=(x_1,x_2,\cdots,x_n) x=(x1,x2,,xn),输入层到隐藏层的权重矩阵为 W 1 \mathbf{W}_1 W1,偏置为 b 1 \mathbf{b}_1 b1,隐藏层到输出层的权重矩阵为 W 2 \mathbf{W}_2 W2,偏置为 b 2 \mathbf{b}_2 b2

首先,计算隐藏层的输入 z 1 \mathbf{z}_1 z1

z 1 = W 1 T x + b 1 \mathbf{z}_1=\mathbf{W}_1^T\mathbf{x}+\mathbf{b}_1 z1=W1Tx+b1

然后,通过激活函数 f 1 f_1 f1 得到隐藏层的输出 a 1 \mathbf{a}_1 a1

a 1 = f 1 ( z 1 ) \mathbf{a}_1 = f_1(\mathbf{z}_1) a1=f1(z1)

接着,计算输出层的输入 z 2 \mathbf{z}_2 z2

z 2 = W 2 T a 1 + b 2 \mathbf{z}_2=\mathbf{W}_2^T\mathbf{a}_1+\mathbf{b}_2 z2=W2Ta1+b2

最后,通过激活函数 f 2 f_2 f2 得到输出层的输出 y \mathbf{y} y

y = f 2 ( z 2 ) \mathbf{y}=f_2(\mathbf{z}_2) y=f2(z2)

例如,在图像识别任务中,输入图像的像素值作为输入层数据,经过前向传播后,输出层得到对图像内容的预测结果,如识别出图像中的物体类别。

(四)反向传播:神经网络的 “学习秘籍”

反向传播神经网络训练的核心算法,其原理是通过计算损失函数关于网络权重和偏置的梯度,来调整权重和偏置,使得网络的输出更接近真实值。

损失函数用于衡量网络预测值与真实值之间的差异,常见的损失函数有均方误差(MSE)、交叉熵损失等。以均方误差损失函数为例,假设网络的预测值为 y \mathbf{y} y,真实值为 t \mathbf{t} t,则损失函数 L L L 为:

L = 1 2 ∑ i = 1 k ( y i − t i ) 2 L=\frac{1}{2}\sum_{i = 1}^{k}(y_i - t_i)^2 L=21i=1k(yiti)2

反向传播利用链式法则,从输出层开始,将损失函数对输出层的梯度反向传播到隐藏层和输入层,计算出每一层的梯度。具体来说,首先计算损失函数对输出层输入 z 2 \mathbf{z}_2 z2 的梯度 ∂ L ∂ z 2 \frac{\partial L}{\partial \mathbf{z}_2} z2L ,然后根据 ∂ L ∂ z 2 \frac{\partial L}{\partial \mathbf{z}_2} z2L 计算出对隐藏层输出 a 1 \mathbf{a}_1 a1 的梯度 ∂ L ∂ a 1 \frac{\partial L}{\partial \mathbf{a}_1} a1L,进而计算出对隐藏层输入 z 1 \mathbf{z}_1 z1 的梯度 ∂ L ∂ z 1 \frac{\partial L}{\partial \mathbf{z}_1} z1L,最后得到对权重矩阵 W 1 \mathbf{W}_1 W1 W 2 \mathbf{W}_2 W2 以及偏置 b 1 \mathbf{b}_1 b1 b 2 \mathbf{b}_2 b2 的梯度。根据计算得到的梯度,使用梯度下降等优化算法更新权重和偏置,例如:

W 1 = W 1 − η ∂ L ∂ W 1 \mathbf{W}_1=\mathbf{W}_1-\eta\frac{\partial L}{\partial \mathbf{W}_1} W1=W1ηW1L

W 2 = W 2 − η ∂ L ∂ W 2 \mathbf{W}_2=\mathbf{W}_2-\eta\frac{\partial L}{\partial \mathbf{W}_2} W2=W2ηW2L

b 1 = b 1 − η ∂ L ∂ b 1 \mathbf{b}_1=\mathbf{b}_1-\eta\frac{\partial L}{\partial \mathbf{b}_1} b1=b1ηb1L

b 2 = b 2 − η ∂ L ∂ b 2 \mathbf{b}_2=\mathbf{b}_2-\eta\frac{\partial L}{\partial \mathbf{b}_2} b2=b2ηb2L

其中, η \eta η 为学习率,控制权重和偏置更新的步长。通过不断地进行前向传播和反向传播,网络逐渐学习到数据中的特征和规律,使得损失函数不断减小,网络的性能不断提升。

四、神经网络的强大功能与广泛应用

(一)数据分类:精准的 “分类大师”

数据分类领域神经网络展现出了卓越的能力,堪称精准的 “分类大师”。以图像分类为例,卷积神经网络(CNN)在其中发挥着关键作用。在著名的 ImageNet 图像分类挑战赛中,参赛的 CNN 模型需要对海量的图像进行分类,涵盖了 1000 多个不同的物体类别。这些模型通过卷积层、池化层和全连接层等组件,自动提取图像中的特征,如物体的形状、颜色、纹理等 。例如,AlexNet 通过 5 个卷积层和 3 个全连接层,能够准确地识别出图像中的各种物体,在比赛中取得了优异的成绩,其成功证明了 CNN 在图像分类任务上的强大能力。

文本分类方面,神经网络同样表现出色。在垃圾邮件检测中,基于神经网络的模型可以对邮件内容进行分析,提取文本特征,判断邮件是否为垃圾邮件。循环神经网络(RNN)及其变体,如长短期记忆网络(LSTM)和门控循环单元(GRU),能够处理文本的序列信息,捕捉文本中的语义和上下文关系,从而实现准确的分类。例如,在对新闻文章进行分类时,LSTM 模型可以根据文章的内容,将其准确地分类到政治、经济、体育、娱乐等不同的类别中。

(二)数据预测:未来的 “预言家”

神经网络在数据预测领域也有着广泛的应用,如同未来的 “预言家”,能够根据历史数据预测未来趋势。在时间序列预测中,循环神经网络(RNN)及其变体被广泛应用。以股票价格预测为例,RNN 可以学习股票价格的历史走势,包括开盘价、收盘价、最高价、最低价等信息,以及相关的市场指标,如成交量、宏观经济数据等,从而预测未来的股票价格走势。长短期记忆网络(LSTM)则通过引入门控机制,能够更好地处理时间序列中的长期依赖问题,在股票价格预测、天气预报、电力负荷预测等任务中取得了较好的效果。

回归分析中,神经网络可以用于预测连续值。例如,在房价预测中,神经网络可以将房屋的面积、卧室数量、卫生间数量、地理位置、周边配套设施等特征作为输入,通过训练学习这些特征与房价之间的关系,从而预测出不同房屋的价格 。通过大量的数据训练,神经网络能够捕捉到影响房价的复杂因素,提供相对准确的价格预测。

(三)图像处理:图像领域的 “魔法师”

图像处理领域神经网络就像一位神奇的 “魔法师”,展现出了强大的能力。在图像识别方面,卷积神经网络(CNN)是最常用的模型之一。人脸识别技术在安防、门禁系统、支付认证等领域有着广泛的应用。基于 CNN 的人脸识别系统,如商汤科技的 SenseFace 人脸识别技术,可以准确地识别出人脸的身份信息。该系统通过对大量人脸图像的学习,能够提取出人脸的独特特征,即使在不同的光照条件、姿态和表情下,也能实现高精度的识别。

目标检测任务中,神经网络可以识别出图像中感兴趣的物体,并确定其位置和类别。例如,在自动驾驶领域,基于神经网络的目标检测算法,如 YOLO(You Only Look Once)系列算法,可以实时检测出道路上的车辆、行人、交通标志等物体,为自动驾驶汽车的决策提供重要依据。YOLO 算法通过将图像划分为多个网格,每个网格负责预测物体的类别和位置,大大提高了检测速度,使其能够满足自动驾驶的实时性要求。

图像生成也是神经网络在图像处理中的重要应用。生成对抗网络(GAN)由生成器和判别器组成,生成器负责生成逼真的图像,判别器则负责判断生成的图像是否真实。在图像修复中,GAN 可以根据图像的现有部分,生成缺失的内容,实现图像的完整修复;在图像风格迁移中,GAN 可以将一幅图像的风格迁移到另一幅图像上,创造出具有独特艺术风格的图像作品。

(四)自然语言处理:语言的 “理解者”

自然语言处理领域神经网络成为了语言的 “理解者”,能够实现机器翻译、情感分析、问答系统等多种任务。在机器翻译中,神经网络,特别是序列到序列(Seq2Seq)模型和 Transformer 模型,取得了重大突破。例如,谷歌的神经机器翻译系统(GNMT)采用了 Seq2Seq 模型和注意力机制,能够将一种自然语言自动翻译成另一种自然语言。该系统通过编码器将源语言文本编码为固定长度的向量,解码器再将该向量解码为目标语言文本。在解码过程中,注意力机制使解码器能够关注源语言文本中的不同部分,从而提高翻译质量,使得机器翻译的结果更加准确和自然。

情感分析是自然语言处理中的一个重要任务,旨在识别文本中所表达的情感倾向,如正面、负面或中立。神经网络在情感分析中发挥着重要作用。基于词向量的方法,如 Word2Vec 和 GloVe,将文本中的单词映射到向量空间,然后利用神经网络进行分类。卷积神经网络(CNN)可以通过卷积层提取文本中的局部情感特征,循环神经网络(RNN)及其变体则能够捕捉文本中的时序依赖关系,用于识别连续文本中的情感变化。例如,在社交媒体监控中,通过对用户发布的评论和帖子进行情感分析,企业可以了解公众对品牌、产品或事件的看法,及时调整策略。

问答系统中,神经网络能够理解用户的问题,并从大量的文本数据中找到准确的答案。例如,基于 Transformer 架构的 BERT 模型,在预训练过程中学习了大量的语言知识,能够理解文本的语义和上下文关系。当用户提出问题时,BERT 模型可以对问题进行分析,然后在相关的文本库中进行搜索和匹配,找到最符合问题的答案 。像智能客服系统,就利用了神经网络的问答能力,能够快速准确地回答用户的问题,提高客户服务效率。

五、Python 实现简单神经网络

(一)导入必要的库

在使用 Python 实现神经网络时,我们通常会用到一些强大的深度学习库,如 TensorFlow 和 Keras。TensorFlow 是一个由 Google 开发和维护的开源深度学习框架,具有高度的灵活性和可扩展性,能够在 CPU、GPU 甚至移动设备上高效运行,支持多种深度学习任务,如神经网络的构建、训练和部署 。Keras 则是一个基于 Python 的高级神经网络 API,它以简洁易用著称,提供了一致且简洁的接口,使得快速搭建和训练神经网络模型变得轻而易举,并且 Keras 可以使用 TensorFlow、CNTK 或 Theano 作为后端,这里我们使用 TensorFlow 作为 Keras 的后端。

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt

在上述代码中,我们首先导入了 TensorFlow 库,并别名为 tf。然后从 tensorflow.keras 中导入了 datasets(用于加载数据集)、layers(用于构建神经网络层)、models(用于构建和训练模型)。最后,导入 matplotlib.pyplot 库,用于数据可视化。

(二)准备数据集

我们以 MNIST 手写数字识别数据集为例来讲解神经网络的实现。MNIST 数据集是一个经典的手写数字图像数据集,包含 60,000 张训练图像和 10,000 张测试图像,每张图像都是 28x28 像素的灰度图像,图像中的数字范围是 0 到 9。

# 加载MNIST数据集
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

# 数据预处理
train_images = train_images.reshape((-1, 28, 28, 1)).astype('float32') / 255.0
test_images = test_images.reshape((-1, 28, 28, 1)).astype('float32') / 255.0

# 将标签进行独热编码
train_labels = tf.keras.utils.to_categorical(train_labels)
test_labels = tf.keras.utils.to_categorical(test_labels)

在这段代码中,我们首先使用 datasets.mnist.load_data() 函数加载 MNIST 数据集,返回的训练数据和测试数据分别存储在 (train_images, train_labels)(test_images, test_labels) 中。然后,对数据进行预处理,将图像数据重塑为适合神经网络输入的形状,即 (样本数量, 高度, 宽度, 通道数),这里通道数为 1 表示灰度图像,并将像素值归一化到 0 到 1 之间,以加快模型的训练速度。最后,使用 to_categorical 函数将标签进行独热编码,将每个数字标签转换为一个长度为 10 的向量,其中只有对应数字的索引位置为 1,其他位置为 0,这样可以方便模型进行分类预测。

(三)构建神经网络模型

使用 Keras 的 Sequential 模型来构建一个简单的神经网络,它是一个线性的层叠模型,我们可以通过 add 方法依次添加各个层。

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

在这个模型中,我们首先添加了两个卷积层 Conv2D,用于提取图像的特征。第一个卷积层有 32 个滤波器,滤波器大小为 3x3,激活函数使用 ReLU;第二个卷积层有 64 个滤波器,同样使用 ReLU 激活函数。每个卷积层之后都添加了一个最大池化层 MaxPooling2D,用于降低特征图的尺寸,减少计算量。接着,使用 Flatten 层将多维的特征图展平为一维向量,以便输入到全连接层。然后,添加了两个全连接层 Dense,第一个全连接层有 64 个神经元,激活函数为 ReLU;最后一个全连接层有 10 个神经元,对应 10 个数字类别,激活函数使用 softmax,将输出转换为概率分布,每个概率值表示对应数字类别的预测可能性。

(四)编译和训练模型

在构建好模型后,需要对模型进行编译,指定优化器、损失函数和评估指标,然后使用训练数据对模型进行训练。

# 编译模型
model.compile(optimizer='adam',
             loss='categorical_crossentropy',
             metrics=['accuracy'])

# 训练模型
history = model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_data=(test_images, test_labels))

在编译模型时,我们使用 adam 优化器,它是一种自适应学习率的优化算法,能够在训练过程中自动调整学习率,提高训练效率。损失函数选择 categorical_crossentropy,即分类交叉熵损失,适用于多分类问题,用于衡量模型预测值与真实标签之间的差异。评估指标选择 accuracy,即准确率,用于评估模型在训练和验证过程中的分类准确性。

在训练模型时,使用 fit 方法,传入训练数据 train_imagestrain_labels,设置训练轮数 epochs 为 5,每批训练数据的大小 batch_size 为 64,并指定验证数据 validation_data,以便在训练过程中监控模型在验证集上的性能。训练过程中,模型会不断更新权重和偏置,以最小化损失函数,并输出每一轮训练的损失值和准确率等信息。

(五)模型评估与预测

训练完成后,我们需要评估模型的性能,并使用模型进行预测。

# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)

# 进行预测
predictions = model.predict(test_images)

使用 evaluate 方法评估模型在测试集上的性能,返回测试损失 test_loss 和测试准确率 test_acc,并打印测试准确率。然后,使用 predict 方法对测试集进行预测,得到每个测试样本属于各个类别的概率值,存储在 predictions 中。

为了更直观地展示预测结果,我们可以对预测结果进行可视化展示。

# 可视化预测结果
plt.figure(figsize=(10, 10))
for i in range(25):
   plt.subplot(5, 5, i + 1)
   plt.xticks([])
   plt.yticks([])
   plt.grid(False)
   plt.imshow(test_images[i].reshape(28, 28), cmap=plt.cm.binary)
   predicted_label = np.argmax(predictions[i])
   true_label = np.argmax(test_labels[i])
   if predicted_label == true_label:
       color = 'blue'
   else:
       color ='red'
   plt.xlabel("Pred:{} True:{}".format(predicted_label, true_label), color=color)
plt.show()

在这段代码中,我们使用 matplotlib 库进行可视化。首先创建一个 10x10 大小的图形窗口,然后遍历前 25 个测试样本,对于每个样本,使用 imshow 函数显示图像,通过 np.argmax 函数获取预测标签和真实标签。如果预测正确,标签文本颜色设为蓝色;如果预测错误,颜色设为红色,最后将预测标签和真实标签显示在图像下方,展示模型的预测结果(如下图所示:只有第4行第4列的3识别错误)。
在这里插入图片描述

六、总结与展望

神经网络作为机器学习的核心算法之一,以其独特的结构和强大的学习能力,在众多领域取得了令人瞩目的成果。从神经元的基本原理,到前向传播和反向传播的运作机制,再到广泛的应用场景,我们深入了解了神经网络的方方面面。通过 Python 实现简单神经网络的过程,我们也亲身体验了神经网络的构建和训练流程,感受到了它在解决实际问题中的强大威力。

展望未来,随着技术的不断进步,神经网络在 AI 领域的发展前景将更加广阔。在硬件方面,量子计算、边缘计算等新技术的出现,将为神经网络的计算效率和性能带来质的飞跃 。在算法方面,新的神经网络架构和算法将不断涌现,进一步提升模型的表达能力和泛化能力。同时,神经网络与其他领域的交叉融合也将成为趋势,如神经科学、心理学、生物学等,这将有助于我们从不同的角度深入理解神经网络的工作原理,为其发展提供更多的灵感和思路。

对于想要深入学习神经网络的读者来说,这仅仅是一个开始。希望大家能够在本文的基础上,继续探索神经网络的奥秘,不断尝试新的算法和应用,为推动人工智能的发展贡献自己的力量。相信在不久的将来,神经网络将在更多领域发挥重要作用,为我们创造更加美好的生活。


延伸阅读


http://www.niftyadmin.cn/n/5860648.html

相关文章

ARM64 Trust Firmware [四]

完成第二阶段 BL2 的操作后就加载并进入 BL31,BL31 位于 DRAM 中,EL3 模式。除了做架构初始化和平台初始化外,还做了如下工作: 基本硬件初始化,比如 GIC,串口,timer 等;PSCI 服务的…

js中常用方法整理

数据类型 typeOf()Number()parseInt()parseFloat()- * / %检测数据类型转换为数字转换为整数类型转换为浮点类型非加法的数字运算toString()Boolean()String()转换为字符串,不能转换undefined/null字符串拼接转换为布尔类型转换为字符串、所有…

OpenCV二值化处理

1.1. 为什么需要二值化操作 二值化操作将灰度图像转换为黑白图像,即将图像中的像素值分为两类:前景(通常为白色,值为 255)和背景(通常为黑色,值为 0)。二值化的主要目的是简化图像&…

lab4 CSAPP:Cachelab

写在前面 最简单的一集 实验室分为两个部分。在A部分中,实现一个缓存模拟器。在B部分中,编写一个矩阵针对高速缓存性能优化的转置功能。 感觉是比较经典的问题,之前在体系结构的课程中接触过,终于能通过lab实操一下了。 实验目…

tomcat中如何配置,可以支持域名访问

tomcat中如何配置,可以支持域名访问 在Tomcat中配置以支持域名访问,主要涉及到两个方面:配置Tomcat的server.xml文件和在Tomcat的conf目录下的Catalina目录中为每个域名或上下文配置context.xml文件。下面将详细介绍如何进行这些配置。 修改server.xml…

基于契约理论的竞争性组织数据共享安全激励机制matlab模拟与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 参考论文《A Secure Incentive Mechanism for Competitive Organization Data Sharing: A Contract Theoretic Approach》。信息技术发展使数据驱动的智能服务兴起…

【MySQL】索引和视图

索引 索引定义 索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。一个字段可以添加一个索引,多个字段联合起来也可以添加索引。MySQL查询主要为两种方式:索引检索和全表扫描。如果条件中包含某个字段,而该字段…

android调用ffmpeg解析rtsp协议的视频流

文章目录 一、背景二、解析rtsp数据1、C层功能代码2、jni层的定义3、app层的调用 三、源码下载 一、背景 本demo主要介绍android调用ffmpeg中的接口解析rtsp协议的视频流(不解析音频),得到yuv数据,把yuv转bitmap在android设备上显…