Ввод в CNN Conv1D

#python #deep-learning #pytorch #reinforcement-learning

#python #глубокое обучение #pytorch #подкрепление-обучение

Вопрос:

Я работаю в области машинного обучения.

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

Входные данные представляют собой одномерный список данных, поэтому я просто подумал, что Conv1D — лучший выбор.

Что произойдет, если размер ввода равен (1, 740) ? Будет ли нормально, если входной канал равен 1?

Я имею в виду, у меня такое чувство, что (1, 740) вывод Conv1D тензора должен быть таким же, как у простых линейных сетей.

Конечно, я также включу другой слой conv1d, как показано ниже.

 self.conv1 = torch.nn.Conv1d(in_channels=1, out_channels=64, kernel_size=5)
self.conv2 = torch.nn.Conv1d(in_channels=64,out_channels=64, kernel_size=5)
self.conv3 = torch.nn.Conv1d(in_channels=64, out_channels=64, kernel_size=5)
self.conv4 = torch.nn.Conv1d(in_channels=64, out_channels=64, kernel_size=5)
 

Будет ли это иметь смысл, когда входной канал равен 1?

Заранее спасибо. 🙂

Ответ №1:

Я думаю, что это нормально. Обратите внимание, что ввод Conv1D должен быть (B, N, M), где B — размер пакета, N — количество каналов (например, для RGB равно 3), а M — количество функций. out_channels указывает на количество используемых фильтров 5×5. посмотрите на форму вывода следующего кода:

 k = nn.Conv1d(1,64,kernel_size=5)
input = torch.randn(1, 1, 740)
print(k(input).shape) # -> torch.Size([1, 64, 736])
 

736 является результатом неиспользования заполнения, размер которого не сохраняется.

Ответ №2:

nn.Слой Conv1d принимает входные данные формы (b, c, w) (где b — размер пакета, c количество каналов и w ширина ввода). Его размер ядра является одномерным. Он выполняет операцию свертки над входным измерением (кроме осей пакетов и каналов). Это означает, что ядро будет применять одну и ту же операцию ко всем входным данным (будь то 1D, 2D или 3D). Как «скользящее окно». Как таковой, он имеет только kernel_size параметры. Это основная характеристика слоя свертки.

Conv1d позволяет извлекать объекты на входе независимо от того, где они расположены во входных данных: в начале или в конце ввода вашей w ширины. Это имело бы смысл, если ваш ввод является временным (последовательность ввода во времени) или пространственными данными (изображение).

С другой стороны, a nn.Linear принимает 1D тензор в качестве входных данных и возвращает другой 1D тензор. Вы могли бы считать w , что это количество нейронов. В конечном итоге у вас будут w*output_dim параметры. Если ваш ввод содержит компоненты, которые не зависят друг от друга (например, с одним / несколькими горячими кодировками), тогда предпочтительнее использовать полностью подключенный уровень в качестве nn.Linear инструментов.

Эти два ведут себя по-разному. При использовании a nn.Linear — в сценариях, где вы должны использовать a nn.Conv1d — ваше обучение в идеале привело бы к получению нейронов с равным весом, если это имеет смысл… но вы, вероятно, этого не сделаете. В прошлом в глубоком обучении для компьютерного зрения использовались полностью плотно связанные слои. Сегодня используются свертки, потому что есть гораздо более эффективные и подходящие для задач такого типа.