Я реализую что-то тесно связанное с архитектурой DeepSets на облаках точек:
https://arxiv.org/abs/1703.06114
Это означает, что я работаю с набором входных данных (координат ), полностью соединенные слои обрабатывают каждый из них по отдельности, а затем выполняют среднее объединение по ним (чтобы затем выполнить дальнейшую обработку).
Вход для каждого образца i представляет собой тензор формы [L_i, 3]
, где L_i
- количество точек, а последнее измерение - 3
, поскольку каждая точка имеет координаты x, y, z. Важно, что L_i
зависит от образца. Так что у меня разное количество баллов за экземпляр. Когда я помещаю все в пакет, у меня есть вход в форме [B, L, 3]
, где L
больше, чем L_i
для всех i. Отдельные образцы дополняются нулями. Проблема в том, что 0 не игнорируются сетью, они обрабатываются и подаются в средний пул. Вместо этого я хотел бы, чтобы среднее объединение учитывало только реальные точки (не дополненные 0). У меня есть еще один массив, в котором хранятся длины [L_1, L_2, L_3, L_4...]
, но я не уверен, как его использовать.
Мой вопрос: как вы обрабатываете входные данные разного размера в одной партии наиболее изящным образом?
Вот как определяется модель:
encoder = nn.Sequential(nn.Linear(3, 128), nn.ReLU(), nn.Linear(128, 128))
x = self.encoder(x)
x = x.max(dim=1)[0]
decoder = ...