gpt4 book ai didi

python - 用于训练/验证/测试集拆分的 SHA 哈希

转载 作者:太空狗 更新时间:2023-10-29 21:57:59 26 4
gpt4 key购买 nike

以下是 full code 的一小段

我试图理解这种拆分方法的逻辑过程。

  • SHA1 编码是 40 个十六进制字符。表达式中计算了什么样的概率?
  • (MAX_NUM_IMAGES_PER_CLASS + 1) 的原因是什么?为什么加 1?
  • 为 MAX_NUM_IMAGES_PER_CLASS 设置不同的值是否会影响拆分质量?
  • 我们从中得到的拆分质量有多好?这是拆分数据集的推荐方法吗?

    # We want to ignore anything after '_nohash_' in the file name when
    # deciding which set to put an image in, the data set creator has a way of
    # grouping photos that are close variations of each other. For example
    # this is used in the plant disease data set to group multiple pictures of
    # the same leaf.
    hash_name = re.sub(r'_nohash_.*$', '', file_name)
    # This looks a bit magical, but we need to decide whether this file should
    # go into the training, testing, or validation sets, and we want to keep
    # existing files in the same set even if more files are subsequently
    # added.
    # To do that, we need a stable way of deciding based on just the file name
    # itself, so we do a hash of that and then use that to generate a
    # probability value that we use to assign it.
    hash_name_hashed = hashlib.sha1(compat.as_bytes(hash_name)).hexdigest()
    percentage_hash = ((int(hash_name_hashed, 16) %
    (MAX_NUM_IMAGES_PER_CLASS + 1)) *
    (100.0 / MAX_NUM_IMAGES_PER_CLASS))
    if percentage_hash < validation_percentage:
    validation_images.append(base_name)
    elif percentage_hash < (testing_percentage + validation_percentage):
    testing_images.append(base_name)
    else:
    training_images.append(base_name)

    result[label_name] = {
    'dir': dir_name,
    'training': training_images,
    'testing': testing_images,
    'validation': validation_images,
    }

最佳答案

此代码只是将文件名“随机”(但可重复地)分布在多个 bin 上,然后将这些 bin 分组为三个类别。哈希中的位数无关紧要(只要它“足够”即可,对于此类工作而言可能约为 35)。

减少模 n+1 产生 [0,n] 上的值,并将其乘以 100/n 显然产生一个值在 [0,100] 上,它被解释为百分比。 nMAX_NUM_IMAGES_PER_CLASS 是为了控制解释中的舍入误差不超过“一个图像”。

这个策略是合理的,但看起来比实际情况要复杂一些(因为仍在进行舍入,余数会引入偏差——​​尽管如此大的数字是完全无法观察到的)。您可以通过简单地为每个类预先计算 2^160 哈希的整个空间的范围并仅根据两个边界检查哈希来使其更简单和更准确。这在概念上仍然涉及舍入,但对于 160 位来说,这只是表示小数的固有方式,例如 float 中的 31%。

关于python - 用于训练/验证/测试集拆分的 SHA 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41954906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com