洗牌张量时发生错误
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_label
从 ndarray
转换为 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)
我正在尝试打乱张量,但我发现在尝试使用 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_label
从 ndarray
转换为 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)