在深度学习的数据训练过程中,虽然tensorflow和pytorch都会自带打乱数据进行训练的方法,但是当我们自己生成数据,或者某些情况下依然要自己手动打乱顺序。
这里介绍如何以相同规律打乱X,Y两组数据,多组数据相同道理。
第一种:(X,Y是list的格式,不是array)
产生相同的种子(seed)打乱顺序:
1
2
3
4
5
6
7
8
|
import random seed = 50 x_batch, y_batch,start_num = train_load_order_sharp_5_9(image_list, num, start_num,length) #加载我所有的数据,这里想x_batch,Y_batch是list的格式,要注意 random.seed(seed) random.shuffle(x_batch) random.seed(seed) #一定得重复在写一遍,和上面的seed要相同,不然y_batch和x_batch打乱顺序会不一样 random.shuffle(y_batch) |
第二种:zip的方式,更加高效:(同第一种,X,Y是list的格式,不是array)
1
2
3
4
5
6
|
from random import shuffle shuffle_data = True if shuffle_data: c = list ( zip (x_batch,y_batch)) shuffle(c) x_batch,y_batch = zip ( * c) |
举个例子:
1
2
3
4
5
6
7
8
9
10
|
>>> a = [ 1 , 2 , 3 , 4 ] >>> b = [ 11 , 22 , 33 , 44 ] >>> c = list ( zip (a,b)) >>> shuffle(c) >>> a,b = zip ( * c) >>> a ( 2 , 4 , 3 , 1 ) >>> b ( 22 , 44 , 33 , 11 ) #这里就让a,b以相同的规律被打乱 |
补充:python打乱列表的方法解决问题_Python 如何随机打乱列表(List)排序
现在有一个list:[1,2,3,4,5,6],我需要把这个list在输出的时候,是以一种随机打乱的形式输出。
专业点的术语:将一个容器中的数据每次随机逐个遍历一遍。
注意:不是生成一个随机的list集。
环境:
Python 3.6
解决方案:
方案一:
有人可能会通过Random内置函数,来间接实现想要的结果。但是这种方式,太原始,也不够优雅,而且有种重复造轮子的嫌疑。这里我就不贴我自己通过random实现的效果了。
方案二:
Random中有一个random.shuffle()方法提供了完美的解决方案。代码如下:
1
2
3
|
x = [ 1 , 2 , 3 , 4 , 5 , 6 ] random.shuffle(x) print (x) |
输出结果:
第一次输出内容:[6, 5, 1, 3, 2, 4]
第二次输出内容:[6, 1, 3, 5, 2, 4]
第三次输出内容:[5, 3, 1, 2, 4, 6]
从结果我们可以看出,输出是完全随机的,代码量就两行,不需要random,不需要for循环。
源码解读:
1
2
|
def shuffle( self , x, random = None ): """Shuffle list x in place, and return None . |
原位打乱列表,不生成新的列表。
Optional argument random is a 0-argument
function returning a random float in [0.0, 1.0);
if it is the default None,
the standard random.random will be used.
可选参数random是一个从0到参数的函数,返回[0.0,1.0)中的随机浮点;
如果random是缺省值None,则将使用标准的random.random()。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
""" if random is None : randbelow = self ._randbelow for i in reversed ( range ( 1 , len (x))): # pick an element in x[:i+1] with which to exchange x[i] j = randbelow(i + 1 ) x[i], x[j] = x[j], x[i] else : _int = int for i in reversed ( range ( 1 , len (x))): # pick an element in x[:i+1] with which to exchange x[i] j = _int(random() * (i + 1 )) x[i], x[j] = x[j], x[i] |
注意 :
从代码的注释,我们看到random.shuffle()是对原list做修改,如果需要保留原list,请注意这个细节。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/CV_YOU/article/details/82178844