unsqueeze pytorch что это

PyTorch Tutorial for Reshape, Squeeze, Unsqueeze, Flatten and View

Introduction

In this PyTorch tutorial, we are learning about some of the in-built functions that can help to alter the shapes of the tensors. We will go through the following PyTorch functions Reshape, Squeeze, Unsqueeze, Flatten, and View along with their syntax and examples. These functions will be very useful while manipulating tensor shapes in your PyTorch Deep Learning

But let us first import the PyTorch library.

1. PyTorch Reshape : torch.reshape()

The reshape function in PyTorch gives the output tensor with the same values and number of elements as the input tensor, it only alters the shape of the output tensor as required by the user.

But we have to make sure that the reshaped dimension should be able to hold all the elements of the original tensor otherwise it will give an error.

The syntax of PyTorch reshape() is shown below.

Syntax

The parameter used in the function is mentioned below.

Parameters

Output

The output is a tensor having the same value as the input but with a different shape.

Example 1: Simple Reshape Example in PyTorch

An example of PyTorch Reshape is shown below.

Here we build a tensor using the arange function and then we use reshape() function to reshape it into a 3×3 tensor.

Example 2: Flatten Tensor in PyTorch with Reshape()

2. PyTorch Squeeze : torch.squeeze()

The squeeze function in PyTorch is used for manipulating a tensor by dropping all its dimensions of inputs having size 1.

For instance, consider an input tensor with shape as (Ax1xBxCx1xD), the output tensor will have the following shape (AxBxCxD).

The syntax of the PyTorch squeeze() function is given below.

Syntax

There are two parameters for the PyTorch squeeze function.

Parameters

Keyword Arguments

out (Tensor, optional) – The tensor obtained as an output.

Example of PyTorch Squeeze

Now let’s look at the example where we first create a tensor using PyTorch’s zeros function and then check its size. We can see that there are inputs having dimensions as 1.

Источник

torch¶

The torch package contains data structures for multi-dimensional tensors and defines mathematical operations over these tensors. Additionally, it provides many utilities for efficient serializing of Tensors and arbitrary types, and other useful utilities.

It has a CUDA counterpart, that enables you to run your tensor computations on an NVIDIA GPU with compute capability >= 3.0

Tensors¶

Returns True if obj is a PyTorch tensor.

Returns True if obj is a PyTorch storage object.

Returns True if the input is a single element tensor which is not equal to zero after type conversions.

Returns the total number of elements in the input tensor.

Set options for printing.

Disables denormal floating numbers on CPU.

Creation Ops¶

Random sampling creation ops are listed under Random sampling and include: torch.rand() torch.rand_like() torch.randn() torch.randn_like() torch.randint() torch.randint_like() torch.randperm() You may also use torch.empty() with the In-place random sampling methods to create torch.Tensor s with values sampled from a broader range of distributions.

Creates a 1-dimensional Tensor from an object that implements the Python buffer protocol.

Returns a 2-D tensor with ones on the diagonal and zeros elsewhere.

Returns a tensor filled with uninitialized data.

Returns a tensor filled with uninitialized data.

Converts a float tensor to a quantized tensor with given scale and zero point.

Converts a float tensor to a per-channel quantized tensor with given scales and zero points.

Returns an fp32 Tensor by dequantizing a quantized Tensor

Indexing, Slicing, Joining, Mutating Ops¶

Concatenates the given sequence of seq tensors in the given dimension.

Returns a view of input with a flipped conjugate bit.

Attempts to split a tensor into the specified number of chunks.

Stack tensors in sequence depthwise (along third axis).

Stack tensors in sequence horizontally (column wise).

Returns a new tensor that is a narrowed version of input tensor.

Returns a view of the original tensor input with its dimensions permuted.

Splits the tensor into chunks.

Returns a tensor with all the dimensions of input of size 1 removed.

Concatenates a sequence of tensors along a new dimension.

Returns a new tensor with the elements of input at the given indices.

Removes a tensor dimension.

Returns a new tensor with a dimension of size one inserted at the specified position.

Stack tensors in sequence vertically (row wise).

Generators¶

Creates and returns a generator object that manages the state of the algorithm which produces pseudo random numbers.

Random sampling¶

Sets the seed for generating random numbers to a non-deterministic random number.

Sets the seed for generating random numbers.

Sets the random number generator state.

Draws binary random numbers (0 or 1) from a Bernoulli distribution.

Returns a tensor of random numbers drawn from separate normal distributions whose mean and standard deviation are given.

Returns a tensor of the same size as input with each element sampled from a Poisson distribution with rate parameter given by the corresponding element in input i.e.,

Returns a tensor filled with random integers generated uniformly between low (inclusive) and high (exclusive).

Returns a tensor with the same shape as Tensor input filled with random integers generated uniformly between low (inclusive) and high (exclusive).

Returns a tensor filled with random numbers from a normal distribution with mean 0 and variance 1 (also called the standard normal distribution).

Returns a tensor with the same size as input that is filled with random numbers from a normal distribution with mean 0 and variance 1.

In-place random sampling¶

There are a few more in-place random sampling functions defined on Tensors as well. Click through to refer to their documentation:

Quasi-random sampling¶

The torch.quasirandom.SobolEngine is an engine for generating (scrambled) Sobol sequences.

Serialization¶

Saves an object to a disk file.

Loads an object saved with torch.save() from a file.

Parallelism¶

Returns the number of threads used for parallelizing CPU operations

Sets the number of threads used for intraop parallelism on CPU.

Returns the number of threads used for inter-op parallelism on CPU (e.g.

Sets the number of threads used for interop parallelism (e.g.

Locally disabling gradient computation¶

Context-manager that disabled gradient calculation.

Context-manager that enables gradient calculation.

Context-manager that sets gradient calculation to on or off.

Returns True if grad mode is currently enabled.

Context-manager that enables or disables inference mode

Returns True if inference mode is currently enabled.

Math operations¶

Pointwise Ops¶

Computes the element-wise angle (in radians) of the given input tensor.

Computes the bitwise NOT of the given input tensor.

Computes the left arithmetic shift of input by other bits.

Computes the right arithmetic shift of input by other bits.

Computes the element-wise conjugate of the given input tensor.

Returns a new tensor with each of the elements of input converted from angles in degrees to radians.

Applies C++’s std::fmod for floating point tensors, and the modulus operation for integer tensors.

Читайте также:  аниме часто имеет первоисточники что никогда первоисточником не бывает

Returns a new tensor containing imaginary values of the self tensor.

Does a linear interpolation of two tensors start (given by input ) and end based on a scalar or tensor weight and returns the resulting out tensor.

Returns a new tensor with the natural logarithm of (1 + input ).

Logarithm of the sum of exponentiations of the inputs.

Logarithm of the sum of exponentiations of the inputs in base-2.

Computes the element-wise logical AND of the given input tensors.

Computes the element-wise logical NOT of the given input tensor.

Computes the element-wise logical OR of the given input tensors.

Computes the element-wise logical XOR of the given input tensors.

Given the legs of a right triangle, return its hypotenuse.

Takes the power of each element in input with exponent and returns a tensor with the result.

Applies batch normalization on a 4D (NCHW) quantized tensor.

Applies a 1D max pooling over an input quantized tensor composed of several input planes.

Applies a 2D max pooling over an input quantized tensor composed of several input planes.

Returns a new tensor with each of the elements of input converted from angles in radians to degrees.

Returns a new tensor containing real values of the self tensor.

Returns a new tensor with the reciprocal of the elements of input

Like torch.fmod() this applies C++’s std::fmod for floating point tensors and the modulus operation for integer tensors.

Returns a new tensor with each of the elements of input rounded to the closest integer.

This function is an extension of torch.sign() to complex tensors.

Tests if each element of input has its sign bit set (is less than zero) or not.

Reduction Ops¶

Returns the indices of the maximum value of all elements in the input tensor.

Returns the indices of the minimum value(s) of the flattened tensor or along a dimension

Computes the minimum and maximum values of the input tensor.

Returns the maximum value of all elements in the input tensor.

Returns the minimum value of all elements in the input tensor.

Returns the mean value of all elements in the input tensor.

Computes the mean of all non-NaN elements along the specified dimensions.

Returns the matrix norm or vector norm of a given tensor.

Returns the sum of all elements, treating Not a Numbers (NaNs) as zero.

Returns the product of all elements in the input tensor.

This is a variant of torch.quantile() that “ignores” NaN values, computing the quantiles q as if NaN values in input did not exist.

Returns the sum of all elements in the input tensor.

Returns the unique elements of the input tensor.

Eliminates all but the first element from every consecutive group of equivalent elements.

Comparison Ops¶

This function checks if all input and other satisfy the condition:

Returns the indices that sort a tensor along a given dimension in ascending order by value.

Computes element-wise equality

True if two tensors have the same size and elements, False otherwise.

Returns a new tensor with boolean elements representing if each element is finite or not.

Tests if each element of input is infinite (positive or negative infinity) or not.

Tests if each element of input is positive infinity or not.

Tests if each element of input is negative infinity or not.

Returns a new tensor with boolean elements representing if each element of input is NaN or not.

Returns a new tensor with boolean elements representing if each element of input is real-valued or not.

Sorts the elements of the input tensor along a given dimension in ascending order by value.

Returns the k largest elements of the given input tensor along a given dimension.

Sorts the elements of the input tensor along its first dimension in ascending order by value.

Spectral Ops¶

Short-time Fourier transform (STFT).

Inverse short time Fourier Transform.

Bartlett window function.

Blackman window function.

Hamming window function.

Hann window function.

Other Operations¶

Returns a 1-dimensional view of each input tensor with zero dimensions.

Returns a 2-dimensional view of each input tensor with zero dimensions.

Returns a 3-dimensional view of each input tensor with zero dimensions.

Count the frequency of each value in an array of non-negative ints.

Create a block diagonal matrix from provided tensors.

Similar to broadcast_tensors() but for shapes.

Do cartesian product of the given sequence of tensors.

Computes batched the p-norm distance between each pair of the two collections of row vectors.

Compute combinations of length r r r of the given tensor.

Estimates the Pearson product-moment correlation coefficient matrix of the variables given by the input matrix, where rows are the variables and columns are the observations.

Estimates the covariance matrix of the variables given by the input matrix, where rows are the variables and columns are the observations.

If input is a vector (1-D tensor), then returns a 2-D square tensor

If input is a vector (1-D tensor), then returns a 2-D square tensor

Returns a partial view of input with the its diagonal elements with respect to dim1 and dim2 appended as a dimension at the end of the shape.

Computes the n-th forward difference along the given dimension.

Sums the product of the elements of the input operands along dimensions specified using a notation based on the Einstein summation convention.

Flattens input by reshaping it into a one-dimensional tensor.

Reverse the order of a n-D tensor along given axis in dims.

Flip tensor in the left/right direction, returning a new tensor.

Flip tensor in the up/down direction, returning a new tensor.

Rotate a n-D tensor by 90 degrees in the plane specified by dims axis.

Computes the histogram of a tensor.

Computes a histogram of the values in a tensor.

Creates grids of coordinates specified by the 1D inputs in attr :tensors.

Return a contiguous flattened tensor.

Repeat elements of a tensor.

Roll the tensor along the given dimension(s).

Find the indices from the innermost dimension of sorted_sequence such that, if the corresponding values in values were inserted before the indices, the order of the corresponding innermost dimension within sorted_sequence would be preserved.

Returns a contraction of a and b over multiple dimensions.

Returns the sum of the elements of the diagonal of the input 2-D matrix.

Returns the indices of the upper triangular part of a row by col matrix in a 2-by-N Tensor, where the first row contains row coordinates of all indices and the second row contains column coordinates.

Generates a Vandermonde matrix.

Returns a view of input as a real tensor.

Returns a view of input as a complex tensor.

BLAS and LAPACK Operations¶

Returns the matrix product of the N N N 2-D tensors.

Computes the Cholesky decomposition of a symmetric positive-definite matrix A A A or for batches of symmetric positive-definite matrices.

Computes the dot product of two 1D tensors.

Читайте также:  Что такое лето мультфильм песня

Computes the eigenvalues and eigenvectors of a real square matrix.

This is a low-level function for calling LAPACK’s geqrf directly.

Источник

Русские Блоги

Оптимизатор нейронной сети pytorch (SGD, Momentum, RMSprop, Adam)

Точка

Объяснение нескольких оптимизаторов,См. Объяснение Мофана (SGD, Momentum, RMSprop, Adam)
В этой статье в основном объясняется реальный бой SGD, Momentum, RMSprop и Адама.

На следующем рисунке показано сравнение эффектов различных оптимизаторов в этом разделе:

Поддельные данные

В начале необходимо определить 3 параметра
LR = 0.01 Скорость обучения установлена ​​на 0,01
BATCH_SIZE = 32 Это количество пакетов, что означает, что 32 данных будут загружены в модель для обучения за раз.
EPOCH = 12 Это означает, что все образцы были пройдены 12 раз в обучающей модели и возвращены 12 раз (есть некоторые из них).

y = x.pow(2) + 0.1torch.normal(torch.zeros(x.size()))*
torch.normal представляет дискретное нормальное распределение для генерации данных о помехах.

torch_dataset = Data.TensorDataset(x,y)
здесь означает набор данных для создания тензора

loader = Data.DataLoader(
dataset=torch_dataset,
batch_size=BATCH_SIZE,
shuffle=True,
num_workers=2
)
Здесь немного больше информации
DataLoader Это итератор, удобный для нас для чтения данных в несколько потоков
batch_size Установить на 5
shuffle=True Каждая эпоха нарушает порядок данных, значение False означает, что порядок данных для каждой эпохи одинаков.
num_workers= 2 Используйте 2 дочерних процесса

Каждый оптимизатор оптимизирует нейронную сеть

Чтобы сравнить каждый оптимизатор, мы создаем нейронную сеть для каждого из них, но эта нейронная сеть имеет одну и ту же сетевую форму.

Приведенный выше код определяет четыре нейронные сети, а затем объединяет эти четыре нейронные сети в одну сеть.

Оптимизатор

Расчет ошибки

Обучение / Изображение

Далее тренируйтесь и нарисуйте убыток.

Объясните следующую функцию zip ()
zip используется для того, чтобы взять итерируемый объект в качестве параметра, упаковать соответствующие элементы в объекте в кортежи, а затем вернуть список этих кортежей.

Выходное значение zip:

Кроме того, в коде Mofan есть строка:

Ошибка здесь
IndexError: invalid index of a 0-dim tensor. Use tensor.item() to convert a 0-dim tensor to a Python number
Изменить на:

Рисование


SGD Это самый распространенный оптимизатор, еще можно сказать, что нет эффекта ускорения, иMomentum Да SGD Усовершенствованная версия, добавляет принцип импульса.RMSprop Очередной раз Momentum Обновленная версия.Adam Очередной раз RMSprop Обновленная версия. Но из этого результата мы видим, чтоAdam Кажется более эффективным, чемRMSprop Это немного хуже. Так что дело не в том, что чем более продвинутый оптимизатор, тем лучше результат. Мы можем попробовать разные оптимизаторы в наших собственных экспериментах и ​​найти тот, который лучше всего подходит для ваших данных / сети.

Источник

Модели глубоких нейронных сетей sequence-to-sequence на PyTorch (Часть 5)

В этом разделе мы будем реализовывать модель из статьи Convolutional Sequence to Sequence Learning.

Введение

Эта модель кардинально отличается от предыдущих моделей, реализованных нами. Здесь вообще не используются рекуррентные компоненты. Вместо этого применяются свёрточные слои CNN, обычно используемые для обработки изображений. В качестве введения в особенности использования свёрточных слоёв для обработки текста см. руководство здесь.

Если коротко, то свёрточный слой использует фильтры. Эти фильтры имеют ширину (а также высоту в изображениях, но обычно не для текстов). Если фильтр имеет ширину 3, он может видеть 3 последовательных токена. Каждый свёрточный слой имеет множество таких фильтров 1024вэтомразделе. Каждый фильтр будет скользить по последовательности от начала до конца, просматривая все 3 последовательных токена одновременно. Идея состоит в том, что каждый из этих 1024 фильтров научится извлекать из текста разные признаки. Результат этого извлечения признаков будет затем использоваться моделью — потенциально в качестве входных данных для другого свёрточного слоя. Далее всё это можно использовать для извлечения особенностей из исходного предложения для перевода его на целевой язык.

Как и ранее, если визуальный формат поста вас не удовлетворяет, то ниже ссылки на английскую и русскую версию jupyter notebook:

Замечание: русская версия jupyter notebook отличается от исходной добавленным в конце тестом на инверсию предложения.

Подготовка данных

Во-первых, давайте импортируем все необходимые модули и зададим случайные начальные числа для воспроизводимости.

Затем мы загрузим модели spaCy и определим токенизаторы для исходного и целевого языков.

Мы также добавляем токены начала и конца последовательности, и переводим весь текст в нижний регистр.

Затем мы загружаем наш набор данных.

Мы, как и раньше, пополняем наш словарь, конвертируя любые токены, которые встречаются менее двух раз, в токены.

Последний этап подготовки данных — определение устройства, а затем создание итератора.

Построение модели

Следующим шагом будет построение модели. Как и прежде, модель состоит из кодировщика и декодера. Кодировщик кодирует вводное предложение, на исходном языке, в вектор контекста. Декодер декодирует вектор контекста для создания выходного предложения на целевом языке.

Кодировщик

Предыдущие модели в этих уроках имели кодировщик, который сжимает всё входное предложение в один вектор контекста . Свёрточная модель sequence-to-sequence немного отличается — она получает два вектора контекста для каждого токена во входном предложении. Итак, если бы в нашем входном предложении было 6 токенов, мы получили бы 12 контекстных векторов, по два на каждый токен.

Затем токен и позиционные эмбеддинги поэлементно суммируются, чтобы получить вектор, который содержит информацию о токене, а также его позицию в последовательности, которую мы будем называть вектор эмбеддинга. Затем следует линейный слой, который преобразует вектор эмбеддинга в вектор с требуемым размером скрытого слоя.

Наконец, преобразованный вектор поэлементно суммируется с вектором эмбеддинга через остаточное соединение, чтобы получить комбинированный вектор для каждого токена. Опять же, имеется комбинированный вектор для каждого токена во входной последовательности.

Свёрточные блоки

Итак, как работают эти свёрточные блоки? На изображении ниже показаны 2 свёрточных блока с одним фильтром синий, который скользит по токенам в последовательности. В реальной реализации у нас будет 10 свёрточных блоков с 1024 фильтрами в каждом блоке.

После прохождения активации GLU размер скрытого измерения для каждого токена такой же, как и при входе в свёрточные блоки. Теперь он поэлементно суммируется со своим собственным вектором, прежде чем он будет пропущен через следующий свёрточный слой.

На этом завершается одиночный свёрточный блок. Последующие блоки берут вывод предыдущего блока и выполняют те же шаги. У каждого блока есть свои параметры, они не разделяются между блоками. Вывод последнего блока возвращается в основной кодировщик — где он проходит через линейный слой для получения преобразованного вывода, а затем поэлементно суммируется с токеном эмбеддига для получения комбинированного вывода.

Реализация кодировщика

Чтобы упростить реализацию, мы допускаем только ядра нечётного размера. Это позволяет добавлять одинаковые отступы к обеим сторонам исходной последовательности.

Переменная величина scale используется авторами, чтобы «гарантировать, что дисперсия во всей сети не изменится кардинально». Производительность модели может сильно различаться, если не использовать данное ухищрение.

Позиционный эмдеддинг инициализируется так, чтобы иметь «словарь» 100. Это означает, что он может обрабатывать последовательности длиной до 100 элементов с индексами от 0 до 99. Его можно увеличить, если использовать в наборе данные с большей длиной последовательностей.

Декодер

Декодер принимает фактическое целевое предложение и пытается его предсказать. Эта модель отличается от моделей рекуррентных нейронных сетей, описанных ранее, тем, что она прогнозирует все токены в целевом предложении параллельно. Нет последовательной обработки, то есть цикла декодирования. Это будет подробно описано позже.

Читайте также:  Что такое код бюджетной классификации и где его взять

Декодер похож на кодировщик, с некоторыми изменениями как в основной модели, так и в свёрточных блоках внутри модели.

Во-первых, эмбеддинги не имеют остаточной связи, которая соединяется после свёрточных блоков и преобразования. Вместо этого эмбеддинги подаются в свёрточные блоки, которые будут использоваться там в качестве остаточных соединений.

Во-вторых, для подачи информации декодеру от кодера используются преобразованные и комбинированные выходные данные кодера — опять же, в свёрточных блоках.

Наконец, выход декодера представляет собой линейный слой от размера эмбеддинга до размера вывода. Это используется для предсказания того, каким должно быть следующее слово в переводе.

Свёрточные блоки декодера

Они похожи на свёрточные блоки в кодировщике с некоторыми изменениями.

Во-первых, дополнения. Вместо того, чтобы заполнять одинаково с каждой стороны, чтобы длина предложения оставалась неизменной на всем протяжении, мы выполняем заполнение только в начале предложения. Поскольку мы обрабатываем все целевые токены одновременно параллельно, а не последовательно, нам нужен метод, позволяющий фильтрам, переводящим токен , смотреть только на токены перед словом . Если бы им было разрешено смотреть на -ый токен токен,которыйонидолжнывыводить, то модель просто научилась бы предоставлять следующее слово в последовательности напрямую, копируя его, фактически не обучаясь переводить.

Давайте посмотрим, что произойдет, если мы неправильно сделали добавления с каждой стороны, как в кодировщике.

Внимание рассчитывается путем использования сначала линейного слоя, для изменения скрытого размера на тот же размер, что и размер эмбеддинга. Затем эмбеддинг суммируется с помощью остаточного соединения. Затем к этой комбинации применяется стандартный расчет внимания путем нахождения того, насколько оно «совпадает» с закодированным преобразованным вектором, а затем это применяется путем получения взвешенной суммы по закодированному объединенному вектору. Затем эта спроецированная копия до размера скрытого измерения и применяется остаточная связь с начальным входом к слою внимания.

Почему они сначала вычисляют внимание с закодированным преобразованным вектором, а затем используют его для вычисления взвешенной суммы по закодированному комбинированному векторы? В статье утверждается, что закодированный преобразованный код хорош для получения более широкого контекста по сравнению с закодированной последовательностью, тогда как закодированный комбинированный вектор содержит больше информации о конкретном токене и, следовательно, более полезен для создания прогноза.

Реализация декодера

Поскольку мы дополняем только одну сторону, декодеру разрешено использовать заполнение как нечетного, так и четного размера. Опять же, scale используется для уменьшения дисперсии по всей модели, а встраивание позиции инициализируется, чтобы иметь «словарь» равный 100.

Seq2Seq

Инкапсулирующий модуль Seq2Seq сильно отличается от методов рекуррентной нейронной сети, используемых в предыдущих разделах, особенно при декодировании.

У нашего trg элемент отрезан от конца последовательности потому, что мы не вводим токен в декодер.

Поскольку декодирование выполняется параллельно, нам не нужен цикл декодирования. Вся целевая последовательность сразу вводится в декодер, а заполнение используется для обеспечения того, чтобы каждый свёрточный фильтр в декодере мог видеть только текущий и предыдущий токены в последовательности, когда он скользит по предложению.

Однако это также означает, что мы не можем применять обучение с принуждением, используя эту модель. У нас нет цикла, в котором мы можем выбрать, вводить ли предсказанный токен или фактический токен в последовательности, поскольку все предсказывается параллельно.

Обучение модели Seq2Seq

В статье авторы считают, что более выгодно использовать небольшой фильтр размерядра3 и большое количество слоев 5+.

Мы также можем видеть, что модель имеет почти вдвое больше параметров, чем модель, основанная на внимании от20до37миллионов.

Далее мы определяем оптимизатор и функцию потерь критерий. Как и раньше, мы игнорируем потери, когда целевая последовательность является маркером заполнения.

Затем мы определяем цикл обучения модели.

Мы обрабатываем последовательности немного иначе, чем в предыдущих уроках. Для всех моделей мы никогда не помещаем в декодер. В моделях RNN это объяснялось тем, что цикл декодера останавливается при достихении значения в качестве входа для декодера. В этой модели мы просто отрезаем токен от конца последовательности. Таким образом:

обозначает фактический элемент целевой последовательности. Затем мы вводим это в модель, чтобы получить предсказанную последовательность, которая, как мы надеемся, должна предсказывать токен :

Затем мы рассчитываем наши потери и обновляем наши параметры, как это обычно делается.

Опять же, у нас есть функция, которая сообщает нам, сколько времени занимает каждая эпоха.

Наконец, мы обучаем нашу модель. Обратите внимание, что мы уменьшили значение CLIP с 1 до 0.1, чтобы обучить эту модель более точно. При более высоких значениях «CLIP» градиент иногда резко увеличивается.

Хотя у нас почти в два раза больше параметров, чем у модели RNN, основанной на внимании, на самом деле она обучение занимает примерно половину времени от стандартной версии, и примерно столько же, как в версии упакованных дополненных последовательностей. Это связано с тем, что все вычисления выполняются параллельно с использованием свёрточных фильтров вместо последовательного использования RNN.

Замечание: эта модель всегда имеет коэффициент для обучения с принуждением равный 1, то есть всегда будет использоваться истинное значение для следующего токена из целевой последовательности. Это означает, что мы не можем сравнивать значения точности с предыдущими моделями, в которых использовался коэффициент обучения с принуждением отличный от 1. Смотрите здесь для результатов RNN, основанной на внимании, с использованием коэффициента обучения с принуждением равным 1.

Затем мы загружаем параметры, которые имеют наименьшие потери при проверке, и вычисляем потери по набору тестов.

Вывод

Теперь мы можем переводить с помощью нашей модели использую функцию translate_sentence ниже.

Выполняются следующие шаги при переводе:

токенизируем исходное предложение, если оно не было токенизировано являетсястрокой

добавляем токены и

нумеруем исходное предложение

преобразовываем его в тензор и добавляем размер батча

передаём исходное предложение в кодировщик

создаём список для хранения выходного предложения, инициализированного токеном

пока мы не достигли максимальной длины

преобразуем текущий прогноз выходного предложения в тензор с размерностью батча

поместим текущий выход и два выхода кодировщика в декодер

получим предсказание следующего выходного токена от декодера

добавим предсказание к предсказанию текущего выходного предложения

прерываем, если предсказание было токеном

преобразоваем выходное предложение из индексов в токены

возвращаем выходное предложение (с удаленным токеном ) и вектор внимания с последнего слоя

Затем у нас есть функция, которая будет отображать, насколько модель обращает внимание на каждый входной токен на каждом этапе декодирования.

Затем мы, наконец, начнем переводить несколько предложений.

Сначала возьмем пример из обучающей выборки:

Наконец, мы рассчитываем оценку BLEU для модели.

Мы получили оценку BLEU

34 по сравнению с моделью RNN, основанной на внимании, которая дала нам

28. Это улучшение показателя BLEU на

Обучение сети инвертированию предложения

В конце приведу один из моих любимых тестов: тест на инверсию предложения. Очень простая для человека задача ученики начальной школы обучаются за 10-15 примеров, но, порой, непреодолима для искусственных систем.

Для Google Colab скачаем обучающие последовательности

В начале обучим сеть инверсии и посмотрим на результат.

Мы рассмотрели первую из наших моделей, не использующих RNN! Далее идет модель «Transformer», в которой даже не используются свёрточные слои — только линейные слои и множество механизмов внимания.

Источник

Информ портал о технике и не только