洗牌张量时发生错误

Something wrong happens when shuffle a tensor

我正在尝试打乱张量,但我发现在尝试使用 random.shuffle() 时出现问题,这是我的代码:

import numpy as np
import torch
import random

if __name__ == '__main__':

    label_0, label_1 = np.zeros([1, 1000])[0], np.ones([1, 1000])[0]
    test_label = np.hstack((label_0, label_1))

    num_0, num_1 = 0, 0

    for i in range(len(test_label)):
        if test_label[i] == 0:
            num_0 += 1
        elif test_label[i] == 1:
            num_1 += 1

    print('Num1:  ', num_1)
    print('Num0:  ', num_0)

    random.shuffle(test_label)

    num_0, num_1 = 0, 0
    for i in range(len(test_label)):
        if test_label[i] == 0:
            num_0 += 1
        elif test_label[i] == 1:
            num_1 += 1

    print('After Shuffle Num1:  ', num_1)
    print('After Shuffle Num0:  ', num_0)

如果test_label不是张量,它就完美地工作:

Num1:   1000
Num0:   1000
After Shuffle Num1:   1000
After Shuffle Num0:   1000

然而,当我尝试将 test_labelndarray 转换为 tensor 时,会发生错误:

import numpy as np
import torch
import random

if __name__ == '__main__':

    label_0, label_1 = np.zeros([1, 1000])[0], np.ones([1, 1000])[0]
    test_label = np.hstack((label_0, label_1))

    # now transform to tensor
    test_label = torch.tensor(test_label)


    num_0, num_1 = 0, 0

    for i in range(len(test_label)):
        if test_label[i] == 0:
            num_0 += 1
        elif test_label[i] == 1:
            num_1 += 1

    print('Num1:  ', num_1)
    print('Num0:  ', num_0)

    random.shuffle(test_label)

    num_0, num_1 = 0, 0
    for i in range(len(test_label)):
        if test_label[i] == 0:
            num_0 += 1
        elif test_label[i] == 1:
            num_1 += 1

    print('After Shuffle Num1:  ', num_1)
    print('After Shuffle Num0:  ', num_0)

结果好像有点不对:

Num1:   1000
Num0:   1000
After Shuffle Num1:   306
After Shuffle Num0:   1694

谁能告诉我为什么会出现这样的问题?

您可以使用 torch.randperm:

import numpy as np
import torch
import random

if __name__ == '__main__':

    label_0, label_1 = np.zeros([1, 1000])[0], np.ones([1, 1000])[0]
    test_label = np.hstack((label_0, label_1))

    # now transform to tensor
    test_label = torch.tensor(test_label)


    num_0, num_1 = 0, 0

    for i in range(len(test_label)):
        if test_label[i] == 0:
            num_0 += 1
        elif test_label[i] == 1:
            num_1 += 1

    print('Num1:  ', num_1)
    print('Num0:  ', num_0)

    p = torch.randperm(test_label.shape[0])
    test_label = test_label[p]

    num_0, num_1 = 0, 0
    for i in range(len(test_label)):
        if test_label[i] == 0:
            num_0 += 1
        elif test_label[i] == 1:
            num_1 += 1

    print('After Shuffle Num1:  ', num_1)
    print('After Shuffle Num0:  ', num_0)