在深度学习的数据训练过程中,虽然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