Numpy

NumPy记录

2019-02-08  本文已影响37人  yumiii_

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,也可以产生一组随机数,用这组随机数进行索引。我用过的产生随机数的方法:

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的应该怎么送到网络中。

上一篇下一篇

猜你喜欢

热点阅读