MindSpore循环神经网络

本文详细介绍了神经网络的基本组成,包括神经元模型、激活函数和多层感知机。接着,深入探讨了神经网络模型,特别是前馈神经网络的结构。文章还讲解了神经网络的反向传播算法在训练多层网络中的应用。最后,重点阐述了门控循环单元(GRU)和长短期记忆网络(LSTM)的设计,这两种模型有效地解决了循环神经网络在处理时间序列数据时的长期依赖问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MindSpore循环神经网络
一. 神经网络的组成
神经元模型:首先简单的了解以下构成神经网络的最基础单元:神经元。每个神经元与其它神经元相连,处于激活状态时,就会向相连的神经元发送相应信号。从而改变其它神经元的状态。如果某个神经元的信号超过某个阈值。那么将被激活,再接着发送给其它神经元。如图1所示:
在这里插入图片描述

图1:神经元结构
神经网络的任何神经元都可以表述为上述的形式。该单元主要由输入变量、带权参数和激活函数组成。首先是x1,x2,x3带权重的输入变量,该变量的取值来自前面一层所有变量与权重的乘积,然后再求和,在数学上表示为下式:

在这里插入图片描述

其中,x为自由的输入变量,xl为当前l层,这里的累加求和为前面一层所有变量与权重的乘积,n为神经元个数。在实践当中,神经网络的输入层由训练样本给定。隐含层和输出层的x取值由前一层计算得到。其中b为偏置参数。
激活函数:理想中的激活函数是如图2所示的跃迁函数,将输入值映射到O或1,很直观的1对应着神经元激活状态,0则表示神经元处于失活状态。然而由于跃迁函数不连续且非光滑(无法完美表达大脑神经网络的连续传递过程),实际常用Sigmoid函数作为激活函数。典型的Sigmoid函数如图3所示,把可能的数压缩进(0,1)输出值之间,又名挤压函数(squashing function)。
在这里插入图片描述

图2:跃迁函数图

在这里插入图片描述

图3:sigmoid函数图
将许多这样的神经元按照一定的层次结构组织起来,就得到了人工神经网络。发现这个模型是由许多个函数不断嵌套而成。
感知机与多层网络:输入层接收外界的输入信号然后传递给输出层,输出层为逻辑单元,图4中的感知机有三个输入:x1、x2、x3。通常,可以根据数据的维度设置数量。这里是一种计算输出的规则,引入了权重(weight),w1,w2,…,wj等实数来表示各个输人对于输出的重要程度。
在这里插入图片描述

图4:多层感知机结构图
神经元的输出是0或者l,分别代表未激活与激活状态,由加权和的值是否小于或者大于某一个阈值(threshold value)决定。与权重一样,阈值也是一个实数,这是神经元的一个参数。使用更严密的代数形式来表示:
在这里插入图片描述

对于上面决策的式子,基本的思想就是:这是一个通过给每个维度数据赋予不同权重从而做出决策的机器,就可以判断出该事件可不可行。也需要通过调整权重和阈值的大小,得到不同的决策模型。
很显然,感知机不能完全模拟人类的决策系统。但是,一个由感知机构成的复杂网络能够做出更加精细的决策,可解释得通的。在图5所示这个网络中,第一层感知机,通过赋予输入的权重,做出三个非常简单的决策。第二层感知机呢?每一个第二层感知机通过赋予权重给来自第一层感知机的决策结果做出决策。通过这种方式,第二层感知机可以比第一层感知机做出更加复杂,更高层次抽象的决策。第三层感知机能够做出更加复杂的决策。通过这种方式,一个多层网络感知机可以做出更加精细的决策。
在这里插入图片描述

图5:多层感知机网络
图5网络最左边的是输入层神经元,用于接收外界输入信息,中间为隐藏层,对信号进行一定加工与转换,最右边为输出层神经元,最终结果由输出层神经元输出表示。因此,通常被称之为两层网络。一般情况下,只需要包含隐藏层,即可称为多层网络。神经网络的学习过程,就是根据训练数据来调整神经元之间的“权重”,以及每个功能神经元的阈值。
设计网络的输入层通常是非常直接的。例如,,要尝试识别一张输入图像是否有“1”。很自然的,,可以将图片像素的强度进行编码作为输入层。如果图像是64×64的灰度图.需4096=64×64

### 使用循环神经网络 (RNN) 进行影评情感分类 #### 数据准备 为了实现基于 RNN 的影评情感分类,首先需要准备好数据集。通常使用 IMDB 影评数据集作为标准的情感分析数据源。该数据集包含了大量带有正面或负面标签的电影评论[^1]。 ```python from mindspore.dataset import TextFileDataset # 加载IMDB数据集 train_dataset = TextFileDataset("path/to/imdb/train", shuffle=True) test_dataset = TextFileDataset("path/to/imdb/test", shuffle=False) ``` #### 预处理与词嵌入 在实际建模之前,需对文本进行预处理并转化为数值形式以便输入到神经网络中。这一步骤包括分词、建立词汇表以及利用预训练词向量初始化权重矩阵[^2]。 ```python import numpy as np from mindspore.common.tensor import Tensor vocab_size = len(vocab) def preprocess(texts): tokenized_texts = [text.split() for text in texts] padded_sequences = pad_sequences(tokenized_texts, padding='post', maxlen=sequence_length) return Tensor(padded_sequences), labels embeddings = load_pretrained_embeddings(vocab) # 加载GloVe或其他预训练好的词向量 embedding_dim = embeddings.shape[1] ``` #### 构建 RNN 模型 定义一个双向 LSTM 或 GRU 来捕捉时间序列特征,并通过全连接输出最终预测结果。这里我们采用双方向结构以更好地理解上下文关系。 ```python class RNN(nn.Cell): def __init__(self, embedding_matrix, hidden_size, output_size, num_layers, bidirectional, pad_idx): super(RNN, self).__init__() self.embedding = nn.Embedding.from_pretrained(Tensor(embedding_matrix.astype(np.float32)), freeze=True) self.rnn = nn.LSTM(input_size=embedding_dim, hidden_size=hidden_size, num_layers=num_layers, batch_first=True, dropout=dropout_rate if num_layers > 1 else 0., bidirectional=bidirectional) direction_factor = 2 if bidirectional else 1 self.fc = nn.Dense(hidden_size * direction_factor, output_size) def construct(self, x): embedded = self.dropout(self.embedding(x)) _, (hn, _) = self.rnn(embedded) out = torch.cat([hn[-2,:,:], hn[-1,:,:]], dim=1) if self.bidirectional else hn[-1,:,:] logits = self.fc(out.squeeze(0)) return logits ``` #### 设置损失函数与优化器 选用适合二分类任务的交叉熵损失函数,并搭配 Adam 优化算法调整参数值达到最优解的目的[^4]。 ```python criterion = nn.BCEWithLogitsLoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate) ``` #### 训练过程 迭代读取批次样本送入 GPU 设备加速计算效率;记录每轮 epoch 平均 loss 值变化趋势直至收敛为止[^5]。 ```python for epoch in range(num_epochs): total_loss = 0. model.train() for inputs, targets in train_loader: optimizer.zero_grad() outputs = model(inputs).squeeze(-1) loss = criterion(outputs, targets.type_as(outputs)) loss.backward() optimizer.step() total_loss += loss.item() avg_train_loss = total_loss / len(train_loader) print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {avg_train_loss:.4f}') ``` #### 测试评估性能指标 最后,在验证集中测试模型表现情况并通过准确率 ACC 来衡量其优劣程度[^6]。 ```python correct_preds = 0 total_samples = 0 model.eval() with torch.no_grad(): for inputs, targets in test_loader: preds = model(inputs).round().long() correct_preds += (preds == targets.view(-1)).sum().item() total_samples += targets.size(0) accuracy = correct_preds / total_samples print('Test Accuracy:', accuracy*100., '%') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值