2017-07-29 6 views
2

私は、通常のNumPyを使用して構築されたかなり単純なデータの読み取りとフィードパイプラインを持つTensorFlowの深い学習ワークフローを持っています。 TensorFlowには、データをロードしてデータパイプラインを構築するための多数の関数が用意されています。私はこれらの目標がどのようなシナリオであるのだろうと思います。非常に大規模な実世界のデータセット、およびhigh-level TensorFlow API付きで構築された さまざまなTensorFlowデータ読み込みイディオムが適用されるシナリオは何ですか?

  • ネットワークを必要とする

    1. 学習:2つがあるようです。

    things like input functionsのドキュメントの多くは、後者で独占的にターゲットに思えますが"reading" as opposed to "feeding"(例えば、このようなtf.train.shuffle_batchなどの機能が、tf.one_hotようにも簡単なヘルパー)を使用する利点は、元には適用されているようです。

    標準のPythonを使って簡単に読み込めるファイルを扱っていて、一度にメモリに効率的にロードできるファイルは、np.arrayを使って簡単にうまく動作します。 (私がそれらを疲れている程度にはかなり遅いパイプラインを読む)か、不適切なAPI(私が主に "低レベル" APIを使用するということを考えると、 "高レベル"のAPI)。

    私はすでにTensorFlow(低レベルの学習APIではない)を使用しており、NumPy配列を供給することが私のニーズを満たしているとすれば、どちらの代替アプローチも気にする必要はありません。これらのアプローチの意図された目標が私のものと異なると言うのは公正でしょうか?

    また、さまざまなTensorFlowデータ読み込み慣用句やそれらを適用するシナリオをより良い要因とする別の分類法がありますか?

  • 答えて

    1

    numpy配列としてのデータの入力は、正式なAPIの一部ですので、それに頼ることが適切です。公式の畳み込みMNIST exampleは、データを低次元の配列として供給し、キューへの移動には速度の利点はありません。これがTensorFlowに追加された最初のデータロードイディオムです。

    PythonランタイムにはGILなどの機能があり、マルチコア環境でパフォーマンスが低下し、大量のデータを取り込みながらボトルネックになります。これは、Pythonビット(すなわち、ファイルを開く)をネイティブのTensorFlowオペレーションに移動することで解決されるため、これらのオペレーションはPythonランタイムではなく、並列のTensorFlowランタイムによってディスパッチできます。

    このパイプライン手法では、すべての操作がTensorFlow操作に移行し、「キュー」ステージで分離され、Pythonスレッドを使用してsession.runコールを発行してキューを満たします。これは、TensorFlowに追加された2番目のデータロードイディオムです。/StageOp(

    Pythonのビットの多くを除去するが、高性能用途のために、残りのPython部品ので、これらの問題を解決するためにOPSの次世代を導入し、さらにボトルネック(すなわち、実施例herehere)でしたDataset)、余分なPythonスレッドが不要になりました。これは最新のデータ読み込みイディオムです。

    具体的な例として、ImageNet上の64個のGPUで正式な60倍のスピードアップを再現するには、最新世代の入力ローディングを使用する必要がありますが、それほど集中力のないタスクでは、第2世代または第1世代のイディオム。

    +0

    非常に役に立ちます。さまざまなアプローチにリンクできますか?たとえば、 "StageOp/Dataset"オペレーションが実際のAPIの点で "キュー"とどのように違うのか分かりません。また、私はすでに "本物の" TensorFlowを使用している場合、 "高レベル"のAPIアプローチは実際には関連していないと考えています。 – orome

    +0

    私がキューに書いたチュートリアルの[スライド](https://github.com/yaroslavvb/stuff/blob/master/queues_talk/slides.pdf)ですが、他にもいくつかあります。データセットはhttps://github.com/tensorflow/tensorflow/blob/master/tensorflow/docs_src/programmers_guide/datasets.mdで紹介されています。 StageOpは公式のAPI /ソースコメントに記載されています –

    +1

    私は既存のフィードベースのコードをデータセットにマップする方法について、[フォローアップの質問を投稿しました](https://stackoverflow.com/q/45399907/656912)です。このフォームをどのようにして行うのかは明らかではありません。特に、私が行っているロギングと分析のためです。 – orome

    2

    ヤロスラフはすでにfeedingqueuesについて語り、データセットに触れました。私自身の考えのほんの一部:

    • あなただけのTFを学ぶかfeed_dictはあなたにこれを実行する簡単な方法を提供し、すばやく様々なモデルを試してみたいしたい場合。パフォーマンスの欠点があり、キューがある理由です。
    • キューでは、python - > native_TF - > python loopとGILをバイパスするTF操作を指定できます。キューの大きな問題は、使用するのが難しいということです(データを正しく使用するには、ずっと苦労していました)。他の多くの人が苦労してあなたには、いくつかのexamples of problems here

    を見ることができる新たな問題の多くを解決する(何らかの理由で、おそらくTF 1.3で追加される予定の公式サイトからのリンクは、ありません)Datasetsを導入しました。それらは非常に使いやすく(ページの最後の例を見てください)、コードは非常にシンプルで短いです。ここに例があります:

    def parser(record): 
        # parse the record with tf.parse_single_example 
    
    iterator = tf.contrib.data.TFRecordDataset(
        glob.glob("data/tfrecords/training_shard_*.tfrecord") 
    ).map(parser).batch(batch_size).shuffle(shuffle_num).repeat(repeat_num).make_initializable_iterator() 
    next_element = iterator.get_next() 
    
    ... 
    with tf.Session() as sess: 
        sess.run(iterator.initializer) 
    
        for i in xrange(100000): 
         sess.run(next_element) 
    

    これらの数行は、X4行をキューに置き換えることができました。また、それを動作させることはキューより簡単です(feed_dictと同じくらい簡単です)。だから私の意見は、キューのための場所がもうないということです。 feed_dictまたはデータセットを使用してください。

    +0

    中程度のサイズのデータ​​セットを使用してデータセットを使用するとパフォーマンスが損なわれますか(おそらく最大100kの小さな画像がありますか?たとえば、 – orome

    +1

    [投稿の質問を投稿しました](https://stackoverflow.com/q/45399907/656912)、既存のフィードベースのコードをデータセットにマップする方法については、こちらのフォームを使用して、特に私が行っているロギングと分析の方法を明確にしていません。 – orome

    +0

    @raxacoricofallapatorius私がデータセットに切り替えたモデルは何億もの例があります)。しかし、なぜスピードが失われるのかはわかりません。 –

    関連する問題