1.对数据进行shuffle
直接shuffle数组:
1⃣️np.random.permutation
data = [1, 4, 9, 12, 15]
after_shuffle = np.random.permutation(data)
print(after_shuffle)
2⃣️np.random.shuffle
data = [1, 4, 9, 12, 15]
np.random.shuffle(data)
print(data)
并且由此可见两个方法的区别:shuffle直接在原来的数组上进行操作,改变原来数组的顺序,无返回值。而permutation不直接在原来的数组上进行操作,而是返回一个新的打乱顺序的数组,并不改变原来的数组。
通过索引来shuffle:
3⃣️这个是我比较常用的方法,因为这样label的值不会跟着打乱,不然的话本菜鸡就只能想到把train_x和train_lable的值zip了一块shuffle,后面再unzip....
可以将index值的数组进行shuffle,也可以产生一组随机数,用这组随机数进行索引。我用过的产生随机数的方法:
-
random_idx = random.sample(range(0,new_length),new_length)
随机地从指定列表中提取出N个不同的元素. -
np.random.choice
使用np.random.choice时,需要将replace设置为False,表示不放回取样!!
index = [0,1,2,3]
rand_index = np.random.choice(len(index),4,replace=False)
print(rand_index)
手动shuffle训练集的方法
首先,我们设置一个batch_size,一个epoch需要走几个iteration,用 num_batch = int((data_len - 1)/batch_size) + 1
来计算
def batch_iter(x, y, batch_size = 2):
data_len = len(x)
num_batch = int((data_len - 1)/batch_size) + 1
indices = np.random.permutation(np.arange(data_len))
x_shuff = np.array(x)[indices]
y_shuff = np.array(y)[indices]
for i in range(num_batch):
start_id = i * batch_size
end_id = min((i+1) * batch_size, data_len)
yield x_shuff[start_id:end_id], y_shuff[start_id:end_id]
x = [[1,2,3,4],[2,3,4,5],[32,2,2,2],[1,1,1,1],[2,2,2,2],[3,3,3,3]]
y = [1,0,0,1,0,1]
# print(batch_iter(x,y))
data = batch_iter(x,y)
for x,y in data:
print(x)
print(y)
使用dataloader shuffle训练集的方法
x_tensor = torch.tensor(x)
y_tensor = torch.tensor(y)
def get_batch(batch,x,y):
torch_dataset = Data.TensorDataset(x, y)
loader = Data.DataLoader(dataset=torch_dataset,batch_size=batch,shuffle=True)
return loader
data = get_batch(2,x_tensor,y_tensor)
for train_x,train_y in data:
print(train_x)
print(train_y)
然而我发现这两个都必须shuffle padding完的数组呀。。还是不晓得针对每个Batch进行padding的应该怎么送到网络中。