Pytorch学习笔记(2): 一维卷积, RNN, LSTM详解

一维卷积

torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode=‘zeros’)

这个函数用来对输入张量做一维卷积

  • in_channel和out_channel是卷积核个数

  • kernel_size是卷积核的大小

  • stride是卷积核移动步长, padding是否对输入张量补0

现在我有一个音频的梅尔频谱数据输入,一个batch为十张频谱, 一张频谱大小为129帧, 频率幅度为128,这个张量表示为(10, 128, 129),

import torch.nn as nn
import torch

input = torch.randn(10, 128, 129)
m = nn.Conv1d(128, 128, kernel_size=4, padding=2)
out = m(input)
print(out.size()) #(10, 128, 130)

可以看出来上面这个函数只在频谱的时域上进行一维卷积,卷积核大小为4帧,在频域上没有卷积.为什么输出是130,反而多了一帧呢?

这是因为这个一维卷积函数

  • Input(batch_size, Channel_input, length_input)

  • Output(batch_size, Channel_output, length_output)

L o u t = ⌊ L i n + 2 × p a d d i n g − d i l a t i o n × ( k e r n e l _ s i z e − 1 ) − 1 s t r i d e + 1 ⌋ = 129 + 2 × 2 − 1 × ( 4 − 1 ) − 1 1 + 1 = 130 L_{out}=\lfloor\frac{L_{in}+2\times padding-dilation\times(kernel\_size-1)-1}{stride}+1\rfloor=\frac{129+2\times2-1\times(4-1)-1}1+1=130 Lout=strideLin+2×paddingdilation×(kernel_size1)1+1=1129+2×21×(41)1+1=130

RNN

结构
在这里插入图片描述

函数

torch.nn.RNN(*args, **kwargs)

这个函数对输入的的sequence施加一个带tanh或者Relu的RNN.对输入的sequence每一个元素,每一层都施加如下计算:

  • h t = t a n h ( W h i x t + b h i + W h h h t − 1 + b h h ) ​ h_t=tanh(W_{hi}xt+b_{hi}+W_{hh}h_{t-1}+b_{hh})​ ht=tanh(Whixt+bhi+Whhht1+b
  • 6
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RNN卷积网络和图神经网络结合在一起可以用于处理图像序列或时间序列数据。以下是一种可能的方法: 1. 构建一个RNN卷积网络,包括卷积层、池化层和LSTM或GRU层等。 2. 将RNN卷积网络的输出作为图神经网络的输入。 3. 构建一个图神经网络,可以使用GCN、GAT、GraphSAGE等。 4. 将图神经网络的输出连接到一个全连接层,用于分类或回归等任务。 在PyTorch中,可以使用torch_geometric库构建图神经网络,使用torch.nn库构建RNN卷积网络,并使用torch.optim库进行训练。具体步骤如下: 1. 导入必要的库和数据集。 ``` python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision.datasets import MNIST from torchvision.transforms import ToTensor from torch_geometric.datasets import TUDataset from torch_geometric.nn import GCNConv ``` 2. 定义RNN卷积网络模型。 ``` python class RNNConv(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(RNNConv, self).__init__() self.conv1 = nn.Conv2d(1, 32, 3) self.pool1 = nn.MaxPool2d(2) self.conv2 = nn.Conv2d(32, 64, 3) self.pool2 = nn.MaxPool2d(2) self.rnn = nn.LSTM(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): x = self.pool1(torch.relu(self.conv1(x))) x = self.pool2(torch.relu(self.conv2(x))) x = x.view(x.size(0), x.size(1), -1) _, (h, _) = self.rnn(x) h = h.squeeze(0) out = self.fc(h) return out ``` 3. 定义图神经网络模型。 ``` python class GraphConv(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(GraphConv, self).__init__() self.conv1 = GCNConv(input_size, hidden_size) self.conv2 = GCNConv(hidden_size, output_size) def forward(self, x, edge_index): x = self.conv1(x, edge_index) x = torch.relu(x) x = self.conv2(x, edge_index) return x ``` 4. 加载数据集。 ``` python dataset = TUDataset(root='data', name='ENZYMES', pre_transform=ToTensor()) loader = DataLoader(dataset, batch_size=32, shuffle=True) ``` 5. 定义损失函数和优化器。 ``` python criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(list(rnn_conv.parameters()) + list(graph_conv.parameters()), lr=0.001) ``` 6. 训练模型。 ``` python for epoch in range(10): running_loss = 0.0 for i, data in enumerate(loader): x, edge_index, y = data.x, data.edge_index, data.y optimizer.zero_grad() x = x.view(x.size(0), 1, -1, x.size(1)) rnn_out = rnn_conv(x) graph_out = graph_conv(rnn_out, edge_index) loss = criterion(graph_out, y) loss.backward() optimizer.step() running_loss += loss.item() if i % 10 == 9: print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 10)) running_loss = 0.0 ``` 在训练过程中,我们首先将MNIST图像数据集转换为图像序列,然后将其输入到RNN卷积网络中。RNN卷积网络的输出作为图神经网络的输入,图神经网络的输出连接到全连接层进行分类。最后,我们使用交叉熵损失和Adam优化器进行训练。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值