![]() |
1
5
那是因为你在拿苹果和香蕉作比较。
一方面,当使用占位符时,您将按原样提供一个整体张量。另一方面,当使用
等效于提供一个单声道占位符张量
如果要比较更复杂的管道,请使用
|
![]() |
2
7
我想测试数据集API,它似乎非常方便处理数据。我用CPU、GPU和multi-GPU的方式对这个API进行了大量的测试,测试了不同类型数据的大小NN。 首先,在我看来你的代码是好的。但我需要指出的是,你的神经网络只是一个简单的层。 现在,DataSet API不适合于你的NN类型,但是对于更复杂的NN来说。为什么?我在下面解释了几个原因(建立在我理解数据集API的过程中)。 首先,一方面数据集API 每批处理数据 另一方面 数据经过预处理 . 因此,如果它适合您的RAM,您可以通过预处理数据来节省时间。这里你的数据只是为了“简单”。如果你想测试我说的话,试着找到一个真正的大数据集来处理。不过,可以使用 prefetching 数据。你可以看看这个 tutorial 这很好地解释了为什么用预取处理数据是好的。 其次,在我对用于多GPU训练的数据集API的探索中,我发现据我所知 对于小型神经网络,旧的预处理方法比数据集API快 . 您可以通过创建一个简单的可堆叠RNN来验证这一点,该RNN接受输入中的序列。你可以尝试不同大小的堆栈(我已经测试了1、2、10和20)。您将看到,使用dataset API,在1-GPU或4-GPU上,对于小的RNN堆栈(1、2和5),时间没有区别。 总而言之, 数据集API适用于具有无法预处理的数据的神经网络 . 根据您的任务,预处理数据可能更方便,例如,如果您想调整NN以改进它。我同意dataset API对于批处理、填充和大量数据的洗牌都很酷,但它也不适合多GPU训练。 |
![]() |
3
6
第一: 您正在不必要地重新创建数据集。
在循环之前创建数据集并更改
第二: 这里的问题是,大小为50甚至500的小批量太小,无法补偿td.数据构建延迟的成本。你应该增加小批量的大小。有趣的是,你用了一小批10万号的,但是可能太大了(我不确定,我想需要更多的测试)。 有几件事你可以试试: 1)将小批量大小增加到10000左右,看看是否有改进 2)将管道更改为使用迭代器,例如:
|
![]() |
4
5
一个可能缺少的是预取。在数据管道的末尾添加1的预取,如下所示:
在数据集管道的末尾添加1的预取意味着在进行培训时尝试获取1批数据。这样你就不会在批处理准备好的时候等待,它应该在每一个序列迭代完成后就准备好了。 |