RNN(Recurrent Neural Network,循环神经网络)是一类能够处理序列数据的神经网络,它在处理时考虑了之前的状态,因此能够对序列数据中的每个元素进行建模和预测。
RNN的应用非常广泛,特别是在自然语言处理和时间序列分析方面。以下是RNN在各个领域的应用:
自然语言处理(NLP)
文本分类:将文本归类到不同的类别中,如情感分析、垃圾邮件过滤、新闻分类等。
机器翻译:将一种语言的文本翻译成另一种语言的文本。
语音识别:将人类语音转化为文本。
文本生成:根据给定的文本生成新的文本,如对话生成、诗歌生成等。
问答系统:回答用户的自然语言问题。
时间序列分析
时序预测:根据过去的数据预测未来的数据,如股票价格预测、气温预测等。
行为识别:根据传感器数据识别人的行为,如健身追踪、手势识别等。
异常检测:识别与正常行为不同的行为或异常行为,如网络入侵检测、设备故障检测等。
除此之外,RNN还可以用于图像和视频处理等领域。
RNN(Recurrent Neural Network,循环神经网络)是一种可以对序列数据进行建模的神经网络。相比于传统神经网络,RNN增加了循环连接,使得网络可以处理序列数据中的时序信息。
RNN的结构包含了一个循环单元,可以看做是对于前一时刻的状态 \(h_{t-1}\) 和当前时刻的输入 \(x_t\) 的函数,即 \(h_t=f(h_{t-1},x_t)\),其中 \(f\) 为非线性的激活函数。通过这种方式,RNN可以在处理当前输入的同时,记忆之前输入的信息,即将上一时刻的状态作为当前时刻的输入。
下图是一个简单的RNN结构示意图,其中 \(x_t\) 为输入,\(h_t\) 为当前时刻的状态,\(y_t\) 为输出:
在每个时间步中,输入 \(x_t\) 会与上一时刻的状态 \(h_{t-1}\) 经过一个带有权重矩阵 \(U\) 和 \(W\) 的线性变换,然后通过激活函数 \(f\) 得到当前时刻的状态 \(h_t\)。接下来,\(h_t\) 会作为下一时刻的输入状态 \(h_{t+1}\),并与下一时刻的输入 \(x_{t+1}\) 经过相同的变换和激活函数,直到所有时刻的输入都处理完成。
最终,我们可以通过将所有时刻的状态 \(h_1,h_2,...,h_T\) 经过一个带有权重矩阵 \(V\) 的线性变换,再通过激活函数得到每个时刻的输出 \(y_1,y_2,...,y_T\)。输出的具体形式取决于具体的任务,如分类任务通常使用 Softmax 激活函数,而回归任务则使用线性激活函数。
RNN的前向传播和反向传播算法是神经网络训练的核心。在前向传播算法中,我们将输入序列逐步输入到网络中,并计算每个时刻的输出;在反向传播算法中,我们通过比较网络输出和真实标签之间的误差,计算每个参数对误差的贡献,并使用梯度下降算法来更新参数。
前向传播算法
假设我们的输入序列为 \(x_{1:T}={x_1,x_2,...,x_T}\),其中 \(x_t\) 表示第 \(t\) 个时刻的输入向量。我们使用 \(h_t\) 表示第 \(t\) 个时刻的隐藏状态向量,\(y_t\) 表示第 \(t\) 个时刻的输出向量。
在前向传播算法中,我们首先将第一个时刻的输入向量 \(x_1\) 与初始状态 \(h_0\) 输入到网络中,通过一个线性变换和激活函数计算出第一个时刻的隐藏状态 \(h_1\),然后再将 \(h_1\) 和第二个时刻的输入向量 \(x_2\) 输入到网络中,依次计算出第二个时刻到第 \(T\) 个时刻的隐藏状态 \(h_2,h_3,...,h_T\) 和输出向量 \(y_1,y_2,...,y_T\)。具体的计算方式如下:
\(h_t = f(U_{xt} + Wh_{t-1}+b_h)\)
\(y_t=g(Vh_t + b_y)\)
其中,\(U\)、\(W\)、\(V\) 分别为输入、隐藏状态和输出的权重矩阵,\(b_h\) 和 \(b_y\) 分别为隐藏状态和输出的偏置向量,\(f\) 和 \(g\) 分别为隐藏状态和输出的激活函数。
反向传播
首先,我们需要根据当前时刻的输出向量 \(y_t\) 和真实标签 \(y_t^\prime\) 计算输出向量的梯度 \(\frac{\partial L}{\partial y_t}\),其中 \(L\) 表示损失函数。具体来说,如果我们使用平方损失函数,那么输出向量的梯度可以表示为:
\[\frac{\partial L}{\partial y_t} = 2(y_t - y_t^\prime) \]接下来,我们需要利用反向传播算法依次计算每个时刻的隐藏状态向量 \(h_t\) 和输入向量 \(x_t\) 的梯度 \(\frac{\partial L}{\partial h_t}\)、\(\frac{\partial L}{\partial x_t}\)。具体来说,对于某个时刻 \(t\),我们可以通过下面的公式计算隐藏状态向量 \(h_t\) 的梯度:
\[\frac{\partial L}{\partial h_t} = \frac{\partial L}{\partial y_t} \cdot W_{hy}^T + \frac{\partial L}{\partial h_{t+1}} \cdot W_{hh}^T \]其中 \(W_{hy}\) 和 \(W_{hh}\) 分别表示输出层到隐藏层和隐藏层到隐藏层的权重矩阵。需要注意的是,在最后一个时刻 \(T\),我们需要将 \(\frac{\partial L}{\partial h_{T+1}}\) 设置为零向量。
接着,我们可以利用隐藏状态向量的梯度 \(\frac{\partial L}{\partial h_t}\) 计算输入向量 \(x_t\) 的梯度 \(\frac{\partial L}{\partial x_t}\)。具体来说,对于某个时刻 \(t\),我们可以通过下面的公式计算输入向量 \(x_t\) 的梯度:
\[\frac{\partial L}{\partial x_t} = \frac{\partial L}{\partial h_t} \cdot W_{xh}^T \]其中 \(W_{xh}\) 表示输入层到隐藏层的权重矩阵。
最后,我们可以利用输出向量的梯度 \(\frac{\partial L}{\partial y_t}\)、隐藏状态向量的梯度 \(\frac{\partial L}{\partial h_t}\) 和输入向量的梯度 \(\frac{\partial L}{\partial x_t}\) 对模型参数进行更新。具体来说,我们可以采用梯度下降算法或者其他优化算法来更新权重矩阵和偏置向量,以便更好地训练模型。
需要注意的是,在实际应用中,我们可能需要对学习率进行动态调整,以便更好地训练模型。此外,在实现反向传播算法时,我们通常需要采用递归或者循环的方式进行计算,以便有效地利用历史信息。
除了标准的RNN,还有两种常见的变种RNN,分别是长短期记忆网络(LSTM)和门控循环单元(GRU)。这两种变种网络都是在标准RNN的基础上进行改进,旨在解决标准RNN中出现的梯度消失或爆炸问题,并能够更好地捕捉序列中的长期依赖关系。
LSTM
长短期记忆网络(LSTM)是由Hochreiter和Schmidhuber在1997年提出的。LSTM的主要改进在于引入了三个门机制:输入门、遗忘门和输出门。LSTM的核心思想是通过这三个门控制信息的流动,从而更好地维护序列中的长期依赖关系。
具体来说,输入门控制新信息的输入,遗忘门控制之前的信息是否需要被遗忘,输出门控制输出的信息。这三个门的计算方式都包含了一个sigmoid函数,用于将输入映射到0-1之间的范围。LSTM的结构如下图所示:
其中,圆圈表示神经元,箭头表示信息的传递。绿色方框表示输入门,红色方框表示遗忘门,黄色方框表示输出门。
LSTM的前向传播和反向传播算法与标准RNN类似,只是在计算中要加上门机制的计算。
GRU
门控循环单元(GRU)是由Cho等人在2014年提出的。相比于LSTM,GRU更为简单,只包含了两个门机制:重置门和更新门。GRU的计算复杂度较低,训练速度也更快,而且在某些任务中性能表现与LSTM相当甚至更好。
GRU的结构如下图所示:
其中,绿色方框表示重置门,蓝色方框表示更新门。GRU的前向传播和反向传播算法也与标准RNN类似,只是在计算中要加上门机制的计算。
总的来说,LSTM和GRU都是为了解决标准RNN中的梯度消失或爆炸问题,并能够更好地捕捉序列中的长期依赖关系而提出的。两者的计算复杂度都比标准RNN高,但在某些
- 文本分类
文本分类是将文本分为不同类别的任务,例如将新闻文章分为体育、政治、娱乐等类别。RNN可以通过学习文本的序列信息,对文本进行分类。具体地,可以将文本的每个单词或字符依次输入到RNN中,最后通过全连接层进行分类。
- 情感分析
情感分析是对文本进行情感判断的任务,例如判断一篇文章是正面的、负面的还是中性的。RNN可以通过学习文本的上下文信息,对文本中的情感进行分析。具体地,可以将文本的每个单词或字符依次输入到RNN中,最后通过全连接层输出情感分类结果。
- 机器翻译
机器翻译是将一种语言的文本自动翻译成另一种语言的任务。RNN在机器翻译中的应用主要是seq2seq模型,它将源语言文本编码成一个向量,然后将该向量作为目标语言文本的初始状态,并逐步生成目标语言的词语序列。具体地,seq2seq模型包含编码器和解码器两个部分,其中编码器是一个RNN,用于编码源语言文本,而解码器也是一个RNN,用于生成目标语言的词语序列。
- 时序预测
时序预测是根据历史数据预测未来数据的任务。RNN可以通过学习历史时序数据的序列信息,对未来时序数据进行预测。具体地,可以将历史时序数据作为输入序列,将未来时序数据作为输出序列,通过训练RNN模型,使得模型能够对未来时序数据进行预测。
- 异常检测
异常检测是识别时间序列中不同于正常模式的数据点的任务。RNN可以通过学习时间序列数据的模式,对异常点进行识别。具体地,可以将时间序列数据输入到RNN中,通过训练模型,使得模型能够对正常模式进行建模,从而识别不同于正常模式的数据点。
- 行为识别
行为识别是识别时间序列数据中的行为或动作的任务。RNN可以通过学习时间序列数据的序列信息,对不同的行为或动作进行识别。具体地,可以将时间序列数据作为输入序列,通过训练RNN模型,使得模型能够对不同的行为或动作进行分类。
注意力机制和Seq2Seq模型是RNN在自然语言处理中应用的两个重要领域。
- 注意力机制
在处理长序列输入时,传统的RNN模型往往会出现梯度消失或梯度爆炸的问题,导致模型难以学习到长期依赖关系。为了解决这个问题,注意力机制被引入到RNN中。注意力机制可以让模型在处理长序列输入时,将注意力集中在与当前任务相关的部分,从而提高模型的性能。
具体地,注意力机制通过对输入序列中不同位置的信息进行加权,来构建一个加权和向量,使得模型能够关注与当前任务相关的信息。在RNN中,通常使用双向RNN或者门控RNN结构与注意力机制相结合,从而能够更好地处理长序列输入。
- Seq2Seq模型
Seq2Seq模型是一种用于序列到序列转换任务的模型,如机器翻译、对话系统等。它由两个RNN模型组成,分别是编码器和解码器。编码器将源语言的序列输入,输出一个固定维度的向量作为上下文信息,解码器根据上下文信息以及目标语言的上一个单词,逐步生成目标语言的序列。
在Seq2Seq模型中,编码器和解码器通常采用门控RNN结构,如LSTM和GRU。同时,注意力机制也被广泛应用于Seq2Seq模型中,用于提高模型的性能。通过注意力机制,模型能够在解码过程中动态地将注意力集中在输入序列的不同部分,从而能够更好地处理长序列输入。
- 多层RNN
多层RNN由多个RNN层堆叠而成,每个RNN层的输出都作为下一层RNN的输入。多层RNN可以增加模型的复杂度,提高模型的表达能力。在处理复杂的任务时,多层RNN往往能够比单层RNN取得更好的性能。
在多层RNN中,可以使用不同的RNN变种,如LSTM和GRU等。同时,为了防止梯度消失或梯度爆炸的问题,可以采用梯度裁剪等方法来调整梯度大小。
- 双向RNN
双向RNN是由两个RNN组成的模型,分别是前向RNN和后向RNN。前向RNN从输入序列的第一个元素开始,逐步向后处理;后向RNN则从输入序列的最后一个元素开始,逐步向前处理。最后,前向RNN和后向RNN的输出会被合并起来,形成最终的输出。
双向RNN能够更好地捕捉输入序列中的上下文信息,从而提高模型的性能。在自然语言处理中,双向RNN经常被用于词性标注、命名实体识别等任务。
RNN和CNN是两种常见的神经网络模型,分别在自然语言处理和图像处理等领域中得到广泛应用。为了更好地利用它们各自的优势,研究人员开始探索将它们结合起来的方法。
一种常见的RNN和CNN结合的方法是使用卷积神经网络(Convolutional Neural Network, CNN)提取文本或图像的局部特征,再使用循环神经网络(Recurrent Neural Network, RNN)对这些特征进行全局建模。
具体来说,在文本处理中,可以先使用CNN提取出文本中的n-gram特征,并将这些特征转换成定长的向量表示。然后,将这些向量输入到RNN中,让RNN学习文本中的长期依赖关系。
在图像处理中,可以使用CNN提取图像的局部特征,得到一系列的卷积特征图。然后,将这些特征图输入到RNN中,让RNN学习图像中的长期依赖关系。
RNN和CNN的结合能够更好地处理序列数据和局部特征,从而提高模型的性能。在实际应用中,需要根据具体的任务和数据情况选择合适的模型结构和参数设置。
- 学习率(Learning Rate)
学习率是指在每次迭代中更新模型参数时所采用的步长大小。过大的学习率可能导致模型参数在迭代过程中来回摆动,收敛速度慢或不收敛;过小的学习率则可能导致模型收敛速度过慢。通常需要对学习率进行适当的调整,可以使用学习率衰减等技术。
- 正则化(Regularization)
正则化是指在损失函数中加入一些惩罚项,以避免过拟合。常见的正则化方法包括L1正则化、L2正则化和dropout等。
L1正则化通过在损失函数中添加权重系数的绝对值之和来惩罚过大的权重,可以促使模型学习到更稀疏的特征。
L2正则化通过在损失函数中添加权重系数的平方和来惩罚过大的权重,可以促使模型学习到较小的权重,从而避免过拟合。
dropout是一种在网络层之间随机丢弃一些节点的技术,可以使得模型在训练过程中不依赖于特定的节点,从而提高模型的鲁棒性。
- 丢弃(Dropout)
丢弃是一种在神经网络中随机丢弃一些神经元的技术,可以减轻过拟合的问题。在训练过程中,每个神经元都有一定的概率被丢弃,这样可以强制模型学习到更加鲁棒的特征,从而提高模型的泛化能力。
在训练深度神经网络(DNN)时,梯度消失和梯度爆炸问题是常见的挑战之一。这些问题同样存在于RNN中,因为RNN的网络结构导致了梯度在反向传播时会反复相乘。这可能导致在网络深度增加时,梯度变得非常小(梯度消失)或非常大(梯度爆炸),从而使网络难以训练。
梯度消失问题通常是由于在反向传播中反复相乘的梯度很小,导致在早期层的参数更新几乎不起作用。为了解决这个问题,可以使用不同的激活函数(例如ReLU、LeakyReLU、ELU等)来代替传统的sigmoid函数,因为这些函数在输入的某些范围内有更大的梯度。此外,可以使用LSTM或GRU等具有更少参数的RNN变体,以避免在长时间序列上的梯度消失问题。
梯度爆炸问题通常是由于在反向传播中梯度反复相乘的结果变得非常大,导致权重更新非常大,网络无法收敛。为了解决这个问题,可以使用梯度截断技术,通过设置阈值来限制梯度的最大值。
此外,正则化和dropout等技术也可以用于避免过拟合和减少梯度消失问题的影响。
- AdaGrad算法是梯度下降法的改进算法,其优点是可以自适应学习率。该优化算法在较为平缓处学习速率大,有比较高的学习效率,在陡峭处学习率小,在一定程度上可以避免越过极小值点。
- AdaGrad算法虽然解决了学习率无法根据当前梯度自动调整的问题,但是过于依赖之前的梯度,在梯度突然变化无法快速响应。RMSProp算法为了解决这一问题,在AdaGrad的基础上添加了衰减速率参数。也就是说在当前梯度与之前梯度之间添加了权重,如果当前梯度的权重较大,那么响应速度也就更快
- Adam优化算法是在RMSProp的基础上增加了动量。有时候通过RMSProp优化算法得到的值不是最优解,有可能是局部最优解,引入动量的概念时,求最小值就像一个球从高处落下,落到局部最低点时会继续向前探索,有可能得到更小的值
import torch
import torch.nn as nn
import numpy as np
class RNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(RNN, self).__init__()
self.hidden_size = hidden_size
self.i2h = nn.Linear(input_size + hidden_size, hidden_size)
self.i2o = nn.Linear(input_size + hidden_size, output_size)
self.softmax = nn.LogSoftmax(dim=1)
def forward(self, input, hidden):
combined = torch.cat((input, hidden), 1)
hidden = self.i2h(combined)
output = self.i2o(combined)
output = self.softmax(output)
return output, hidden
def initHidden(self):
return torch.zeros(1, self.hidden_size)
上面的代码定义了一个简单的RNN模型,该模型接受一个输入向量和一个隐藏状态向量,并输出一个预测向量和一个更新后的隐藏状态向量。
在init函数中,我们定义了输入到隐藏层和输入到输出层的线性变换,并将输出层的输出通过LogSoftmax进行归一化处理。
在forward函数中,我们首先将输入和隐藏状态向量进行拼接,然后将拼接后的向量传递给线性变换,并通过LogSoftmax输出预测结果。
在initHidden函数中,我们初始化隐藏状态向量为全0向量。
def train(inputs, targets, rnn):
hidden = rnn.initHidden()
rnn.zero_grad()
loss = 0
for i in range(len(inputs)):
output, hidden = rnn(inputs[i], hidden)
loss += criterion(output, targets[i])
loss.backward()
for p in rnn.parameters():
p.data.add_(-learning_rate, p.grad.data)
return output, loss.item()
上面的代码定义了一个训练函数,该函数接受输入和目标序列以及RNN模型作为参数,并返回模型的输出和损失。
在训练过程中,我们首先初始化隐藏状态向量,并将模型的梯度清零。然后我们遍历输入序列,并将每个输入向量和隐藏状态向量传递给RNN模型,计算预测结果并累加损失。最后,我们计算损失的梯度,并使用随机梯度下降更新模型的参数。
pythonCopy codeinput_size = 4
hidden_size = 10
output_size = 3
learning_rate = 0.1
inputs = [torch.randn(1, input_size) for _ in range(5)]
targets = [torch.randint(0, output_size, (1,)).long() for _ in range(5)]
criterion = nn.NLLLoss()
rnn = RNN(input_size, hidden_size, output_size)
我们使用Adam优化器来更新模型的参数,并使用交叉熵损失函数作为模型的损失函数。在PyTorch中,可以通过torch.optim.Adam和nn.CrossEntropyLoss分别定义优化器和损失函数。
import torch.optim as optim
import torch.nn as nn
# 定义优化器和损失函数
optimizer = optim.Adam(model.parameters(), lr=0.01)
criterion = nn.CrossEntropyLoss()
在训练模型之前,我们需要先定义一些超参数,例如训练轮数、批次大小等。我们还需要在每个训练轮次结束后计算模型在验证集上的准确率,以便及时发现过拟合的情况。
# 定义超参数
num_epochs = 10
batch_size = 64
learning_rate = 0.01
# 训练模型
for epoch in range(num_epochs):
# 训练集迭代器
train_iter.init_epoch()
for batch_idx, batch in enumerate(train_iter):
# 获取数据和标签
data = batch.text
target = batch.label - 1
# 前向传播
output = model(data)
# 计算损失
loss = criterion(output, target)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 打印训练信息
if batch_idx % 100 == 0:
print('Epoch: {}, Batch: {}, Loss: {:.4f}'.format(epoch+1, batch_idx+1, loss.item()))
# 验证集迭代器
val_iter.init_epoch()
# 计算验证集准确率
correct = 0
total = 0
with torch.no_grad():
for batch in val_iter:
data = batch.text
target = batch.label - 1
output = model(data)
_, predicted = torch.max(output.data, 1)
total += target.size(0)
correct += (predicted == target).sum().item()
accuracy = correct / total
print('Validation Accuracy: {:.2f}%'.format(accuracy*100))
训练完成后,我们可以使用测试集来测试模型的性能。
# 测试集迭代器
test_iter.init_epoch()
# 计算测试集准确率
correct = 0
total = 0
with torch.no_grad():
for batch in test_iter:
data = batch.text
target = batch.label - 1
output = model(data)
_, predicted = torch.max(output.data, 1)
total += target.size(0)
correct += (predicted == target).sum().item()
accuracy = correct / total
print('Test Accuracy: {:.2f}%'.format(accuracy*100))
至此,我们使用PyTorch实现了一个简单的RNN模型,用于文本分类任务。在实际应用中,我们可以通过改变模型结构和超参数的设置来进一步优化模型的性能。
优点:
缺点:
总的来说,RNN适合处理序列数据,可以通过记忆历史信息来预测未来数据。但是它也存在着训练困难和计算资源消耗较大等问题,需要根据具体情况进行选择和优化。
书籍:
代码库:
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
如何学习ruby的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk=Var(yt)Cov(yt,yt−k)其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞
写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
进行这种深度检查的最佳方法是什么:{:a=>1,:b=>{:c=>2,:f=>3,:d=>4}}.include?({:b=>{:c=>2,:f=>3}})#=>true谢谢 最佳答案 我想我从那个例子中明白了你的意思(不知何故)。我们检查子哈希中的每个键是否在超哈希中,然后检查这些键的对应值是否以某种方式匹配:如果值是哈希,则执行另一次深度检查,否则,检查值是否相等:classHashdefdeep_include?(sub_hash)sub_hash.keys.all?do|key|self.has_key?(key)&&ifs