class_weight,字典,下采样,list, idx, 训练的数据格式

  1. 对于:
    torch.arange(0,10).reshape(2,-1)==torch.arange(0,10).reshape(-1,5)
    没有区别。
  2. 读字典:
dict.values()
dict.keys()
dict['key1']
list(dict)  # keys
  1. list的拆分:
a,b = [['a','b','c'],[1,2,3]]
print(a,'\n',b)
"""
output:
['a', 'b', 'c'] 
 [1, 2, 3]
"""
  1. random.sample()
# eg1
a = ['a','b','c','d','e','f','g']
random.sample(a,4)
"""
output:
['a', 'd', 'f', 'c']
"""
#eg2
b = {'a':1,'b':2,'c':3,'d':4,'e':5}
random.sample(b,2)
"""
output:
TypeError: Population must be a sequence or set. For dicts, use list(d).
故改为:
"""
{each_key:b[each_key] for each_key in random.sample(list(b),2)}
"""
{'b': 2, 'e': 5}
"""

下采样代码:

# 创建数据字典
c = {'a':[i for i in range(10)],'b':[i for i in range(100,110,1)]}

# 展平字典的values
value_flatten = [i for each in list(c.values()) for i in each]
# sum(c.values(),[])

# 采样
sampled_value = random.sample(value_flatten,10)

#寻位还原字典形式
zeros = {}
for each_value in sampled_value:
    for each_keys in c:
        if each_value in c[each_keys]:
            if each_keys not in list(zeros):
                zeros[each_keys] = []
            zeros[each_keys].append(each_value)    
"""
各个对象采样加起来一共10个。
采样前:
{'a': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
 'b': [100, 101, 102, 103, 104, 105, 106, 107, 108, 109]}
采样后:
{'a': [6, 5, 3, 0, 4], 'b': [108, 100, 104, 105, 109]}
"""
  1. class_weight
# 创建数据
zeros = {str(key):random.sample(range(10),random.randint(5,8)) for key in range(300,310)}
ones = {str(key):random.sample(range(10),random.randint(5,8)) for key in range(400,415)}
"""
zeros:
{'300': [4, 1, 8, 5, 0],
  '301': [9, 6, 2, 1, 3, 5],
  ...
  '309': [6, 3, 7, 4, 8, 0, 5]},
ones:
 {'400': [6, 2, 1, 5, 9, 7],
  '401': [0, 3, 6, 7, 8, 9, 4],
  '402': [1, 4, 5, 8, 3],
  ...
  '414': [9, 0, 6, 2, 3, 4, 5, 7]}
"""

(1) class weight

instance_of_zero = sum(len(i) for i in zeros.values())  # 64
instance_of_one = sum(len(i) for i in ones.values())    # 88
min_class = min(len(zeros), len(ones))  # 10
max_class = max(len(zeros), len(ones))  # 15
class_weight = min_class / max_class    # 0.667
index_to_alter = [len(zeros), len(ones)].index(max_class)   # 1。读出哪一类的subject更多
weights = [1, 1]    
weights[index_to_alter] = class_weight  # [1,0.667]

# 以字典存储每个sample的weight
weights_dict = {}
for i in zeros:
    weights_dict[i] = weights[0]
for i in ones:
    weights_dict[i] = weights[1]
"""
weights_dict:
{'300': 1,
 '301': 1,
 '302': 1,
 ....
 '400': 0.6666666666666666,
 '401': 0.6666666666666666,
 '402': 0.6666666666666666,
 ...}
"""

(2) micro weight

WEIGHT_TYPE = 'micro'
min_zeros = min(len(i) for i in zeros.values()) # 5
min_ones = min(len(i) for i in ones.values())   # 5
micro_weights = {}
for i in zeros:
    tmp = min_zeros / len(zeros[i])
    micro_weights[i] = tmp
for i in ones:
    tmp = min_ones / len(ones[i])
    micro_weights[i] = tmp
weights_dict = micro_weights

(3) combine(1)&(2)

# 以上两种结合
WEIGHT_TYPE = 'both'
min_zeros = min(len(i) for i in zeros.values()) # 5
min_ones = min(len(i) for i in ones.values())   # 5
micro_weights = {}
for i in zeros:
    tmp = min_zeros / len(zeros[i])
    if WEIGHT_TYPE == 'both':
        tmp = tmp * weights[0]
    micro_weights[i] = tmp
for i in ones:
    tmp = min_ones / len(ones[i])
    if WEIGHT_TYPE == 'both':
        tmp = tmp * weights[1]
    micro_weights[i] = tmp
weights_dict = micro_weights

(4) class weight (segment_based)

WEIGHT_TYPE = 'instance'
if WEIGHT_TYPE == 'instance':
    min_tmp = min(instance_of_zero, instance_of_one)
    max_tmp = max(instance_of_zero, instance_of_one)

    tmp_weight = min_tmp / max_tmp
    index_to_alter = [instance_of_zero, instance_of_one].index(max_tmp)

    weights = [1, 1]
    weights[index_to_alter] = tmp_weight

    instance_weights = {}
    for i in zeros:
        instance_weights[i] = weights[0]
    for i in ones:
        instance_weights[i] = weights[1]
    weights_dict = instance_weights
  1. indx
import numpy as np
a = np.array([i for i in range(10)])
idx = [5,6,7]
a[idx]
# output: array([5, 6, 7])
  1. 训练的数据格式
    • float->torch.Tensor(x)
    • int->torch.LongTensor(x)
def create_tensor_data(x, cuda):
    """
    Converts the data from numpy arrays to torch tensors

    Inputs
        x: The input data
        cuda: Bool - Set to true if using the GPU

    Output
        x: Data converted to a tensor
    """
    if 'float' in str(x.dtype):
        x = torch.Tensor(x)
    elif 'int' in str(x.dtype):
        x = torch.LongTensor(x)
    else:
        raise Exception("Error!")

    if cuda:
        x = x.cuda()

    return x
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容