| 370 | |
| 371 | |
| 372 | class NonEquivariantStdFeature(nn.Module): |
| 373 | def __init__(self, in_channels, dim=4, normalize_frame=False, negative_slope=0.2): |
| 374 | super(NonEquivariantStdFeature, self).__init__() |
| 375 | self.dim = dim |
| 376 | self.normalize_frame = normalize_frame |
| 377 | |
| 378 | self.fc1 = NonEquivariantLinearLeakyReLU(in_channels, in_channels // 2, dim=dim, negative_slope=negative_slope) |
| 379 | self.fc2 = NonEquivariantLinearLeakyReLU(in_channels // 2, in_channels // 4, dim=dim, negative_slope=negative_slope) |
| 380 | |
| 381 | def forward(self, x): |
| 382 | ''' |
| 383 | x: point features of shape [B, C_in, N] |
| 384 | ''' |
| 385 | z0 = x |
| 386 | z0 = self.fc1(z0) |
| 387 | z0 = self.fc2(z0) |
| 388 | |
| 389 | # No need for orthogonalization or frame normalization in non-equivariant version |
| 390 | return z0 |
| 391 | |
| 392 | |
| 393 | |