1import math
2
3import torch
4from torch import nn
5
6from labml_helpers.module import Module
7from labml_nn.transformers import MultiHeadAttention10class SpatialDepthWiseConvolution(Module):d_k
එක් එක් හිසෙහි නාලිකා ගණන වේ17 def __init__(self, d_k: int, kernel_size: int = 3):21 super().__init__()
22 self.kernel_size = kernel_sizeඅපිපයිටෝර්ච් Conv1d
මොඩියුලය භාවිතා කරමු. එක් එක් නාලිකාව සඳහා වෙනම සංවහනයක් (විවිධ කර්නල් සමඟ) සිදු වන පරිදි නාලිකා ගණනට සමාන වන පරිදි කණ්ඩායම් ගණන අපි සකස් කරමු. අපි දෙපැත්තටම පුරවන එකතු කර පසුව නිවැරදි වඩාත්ම kernel_size - 1
ප්රති
27 rng = 1 / math.sqrt(kernel_size)
28 self.kernels = nn.Parameter(torch.zeros((kernel_size, d_k)).uniform_(-rng, rng)) x
හැඩය ඇත [seq_len, batch_size, heads, d_k]
30 def forward(self, x: torch.Tensor):35 res = x * self.kernels[0].view(1, 1, 1, -1)
36
37 for i in range(1, len(self.kernels)):
38 res[i:] += x[:-i] * self.kernels[i].view(1, 1, 1, -1)
39
40 return resඅපි බහු-ප්රධාන අවධානය අපගේ මුල් ක්රියාත්මක කිරීම දීර් and කරන අතර විමසුම, යතුර සහ වටිනාකම් ප්රක්ෂේපණ සඳහා අවකාශීය ගැඹුර-නැණවත් සම්මුතිය එක් කරමු.
43class MultiDConvHeadAttention(MultiHeadAttention):51 def __init__(self, heads: int, d_model: int, dropout_prob: float = 0.1):
52 super().__init__(heads, d_model, dropout_prob)බහු-ප්රධාන අවධානය විමසුම නිර්මාණය කරනු ඇත, ප්රධාන සහ අගය ප්රක්ෂේපනය මොඩියුල self.query
self.key
, සහ self.value
.
අපිඔවුන් එක් එක් කිරීමට අවකාශීය ගැඹුර-නැණවත් convolution ස්ථරය ඒකාබද්ධ හා වෙනුවට self.query
self.key
, සහ self.value
.
59 self.query = nn.Sequential(self.query, SpatialDepthWiseConvolution(self.d_k))
60 self.key = nn.Sequential(self.key, SpatialDepthWiseConvolution(self.d_k))
61 self.value = nn.Sequential(self.value, SpatialDepthWiseConvolution(self.d_k))