大小不等的Tensorflow TFrecord文件

时间:2019-04-01 16:37:17

标签: tensorflow deep-learning tensorflow-datasets

我目前将数据分成几个TFrecord文件,然后通过混排和交织读取数据。我的代码如下:

//get array of names and ids for inputs
$array = explode("\n", file_get_contents('array.txt'));

//trim post variables
$trimmed_array=array_map('trim',$array);

//loop through the array

    echo '<form method="POST" action="insert.php">';
    foreach($trimmed_array as $input) {//pass the trimmed version of name variables
        echo '<label>'.$input.'</label>'
           . '<input type="text" id="'.$input.'" name="'.$input.'" required="required" class="form-control" placeholder="'.$input.'">';  
        echo '<br>';
    }
    echo '<input type="submit" value="Submit">';
    echo '</form>';

我有2个问题:

1)我的鳕鱼确实按照我的意愿去做。即,它是否从每个TFrecord文件中随机抽取样本

2)如果TFrecord文件包含的样本量相差很大(例如1个样本将包含50个样本,另外500个样本)会发生什么情况。这会根本影响随机性吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

Q1:不完全是。首先,该行不需要显式改组,public class Race implements Serializable { private String name; private String imageName; //name of file within drawable 已具有此参数。可以通过种子值来控制。

list_files

没有重复功能,当迭代器耗尽所有文件时,您将收到序列结束错误。所以应该是这样。将tf_dataset = tf.data.Dataset.list_files(path, shuffle=True, seed=1). 作为值传递时,它将无限期地进行迭代,或者您可以设置确切的时期数。

None

Q2:如果文件大小不同,可以。唯一的结果是大文件的内容将有更高的机会被迭代器选择。但这不会影响随机性。这行将完成工作,对交错的数据集进行混洗。唯一要记住的是,混洗缓冲区控制着加载到内存中的大量数据。通常建议将其设置为数据集中的示例数量(所有文件中所有示例的数量),但是在某些情况下,它可能会成为相当大的开销,甚至会导致OOM。

tf_dataset = tf.data.Dataset.list_files(path, shuffle=True, seed).repeat()

答案 1 :(得分:0)

因此,我进行了一个模拟测试,如下所示:我用以下命令保存了3个文件:     文件1:〜1000个数字1的样本     文件2:〜2000个2号样本     文件3:〜3000个3号样本

然后,我将上面的代码加载到迭代器中,并抽样采样,直到迭代器用完为止。以下是我的结果。

enter image description here

从图中可以看出,TF从TFrecord文件中随机取样时,不会按文件大小对它们进行加权。而是,它以相等的概率从每个不等大小的文件中随机采样,直到其中一个用完为止。然后,它以相等的概率从其余每个文件继续。

带回家:要进行真正的随机抽样,请确保您的TFrecord文件大小相等或标签均匀分布在它们之间