Spaces:
Running
on
Zero
Running
on
Zero
| import numpy as np | |
| a = np.arange(12).reshape(2, 3, 2) # (batch, channel, dim) | |
| print(a) | |
| array([[[0, 1], [2, 3], [4, 5]], [[6, 7], [8, 9], [10, 11]]]) | |
| swap_mat = create_swap_channel_mat(input_shape, swap_channel=(1, 2)) | |
| # will swap channel 1 and 2 of batch 0 with channel 1 and 2 of batch 1 | |
| b = a @ swap_mat | |
| print(b) | |
| # expected output | |
| array([[[0, 1], [8, 9], [10, 11]], [[6, 7], [2, 3], [4, 5]]]) | |
| import torch | |
| def swap_channels_between_batches(a_tensor, swap_channels): | |
| # Copy the tensor to avoid modifying the original tensor | |
| result_tensor = a_tensor.clone() | |
| # Unpack the channels to be swapped | |
| ch1, ch2 = swap_channels | |
| # Swap the specified channels between batches | |
| result_tensor[0, ch1, :], result_tensor[1, ch1, :] = a_tensor[1, ch1, :].clone(), a_tensor[0, ch1, :].clone() | |
| result_tensor[0, ch2, :], result_tensor[1, ch2, :] = a_tensor[1, ch2, :].clone(), a_tensor[0, ch2, :].clone() | |
| return result_tensor | |
| # Define a sample tensor 'a_tensor' | |
| a_tensor = torch.tensor([[[0, 1], [2, 3], [4, 5]], [[6, 7], [8, 9], [10, 11]]], dtype=torch.float32) | |
| # Define channels to swap | |
| swap_channels = (1, 2) # Channels to swap between batches | |
| # Swap the channels between batches | |
| swapped_tensor = swap_channels_between_batches(a_tensor, swap_channels) | |
| # Print the original tensor and the tensor after swapping channels between batches | |
| print("Original Tensor 'a_tensor':") | |
| print(a_tensor) | |
| print("\nTensor after swapping channels between batches:") | |
| print(swapped_tensor) | |
| #------------------------------------------------- | |
| import torch | |
| from einops import rearrange | |
| def shift(arr, num, fill_value=np.nan): | |
| result = np.empty_like(arr) | |
| if num > 0: | |
| result[:num] = fill_value | |
| result[num:] = arr[:-num] | |
| elif num < 0: | |
| result[num:] = fill_value | |
| result[:num] = arr[-num:] | |
| else: | |
| result[:] = arr | |
| return result | |
| def create_batch_swap_matrix(batch_size, channels, swap_channels): | |
| swap_mat = np.eye(batch_size * channels) | |
| for c in swap_channels: | |
| idx1 = c # 첫 λ²μ§Έ λ°°μΉμ κ΅νν μ±λ μΈλ±μ€ | |
| idx2 = c + channels # λ λ²μ§Έ λ°°μΉμ κ΅νν μ±λ μΈλ±μ€ | |
| swap_mat[idx1, idx1], swap_mat[idx2, idx2] = 0, 0 # λκ°μ κ°μ 0μΌλ‘ μ€μ | |
| swap_mat[idx1, idx2], swap_mat[idx2, idx1] = 1, 1 # ν΄λΉ μ±λμ κ΅ν | |
| return swap_mat | |
| def create_batch_swap_matrix(batch_size, channels, swap_channels): | |
| swap_mat = np.eye(batch_size * channels) | |
| # λͺ¨λ μ±λμ λν΄ κ΅ν μν | |
| for c in swap_channels: | |
| idx1 = np.arange(c, batch_size * channels, channels) # νμ¬ μ±λμ λͺ¨λ λ°°μΉ μΈλ±μ€ | |
| idx2 = (idx1 + channels) % (batch_size * channels) # μνμ μν΄ modulo μ¬μ© | |
| swap_mat[idx1, idx1] = 0 | |
| swap_mat[idx2, idx2] = 0 | |
| swap_mat[idx1, idx2] = 1 | |
| swap_mat[idx2, idx1] = 1 | |
| return swap_mat | |
| def swap_channels_between_batches(input_tensor, swap_matrix): | |
| reshaped_tensor = rearrange(input_tensor, 'b c d -> (b c) d') | |
| swapped_tensor = swap_matrix @ reshaped_tensor | |
| return rearrange(swapped_tensor, '(b c) d -> b c d', b=input_tensor.shape[0]) | |
| # μμ νλΌλ―Έν° | |
| batch_size = 2 | |
| channels = 3 | |
| # swap_info = { | |
| # : [1, 2] # batch_index: [channel_indices] | |
| # } | |
| swap_channels = [1, 2] # κ΅νν μ±λ | |
| # μμ ν μ μμ± | |
| input_tensor = torch.tensor([[[0, 1], [2, 3], [4, 5]], [[6, 7], [8, 9], [10, 11]]], dtype=torch.float32) | |
| # swap matrix μμ± | |
| swap_matrix = create_batch_swap_matrix(batch_size, channels, swap_channels) | |
| swap_matrix = torch.Tensor(swap_matrix) | |
| # μ±λ κ΅ν μν | |
| swapped_tensor = swap_channels_between_batches(input_tensor, swap_matrix) | |
| # κ²°κ³Ό μΆλ ₯ | |
| print("Original Tensor:") | |
| print(input_tensor) | |
| print("\nSwapped Tensor:") | |
| print(swapped_tensor) | |