2017-11-07 4 views
-1

tf.datasetが本当にgreateしていて、2倍の速度で学習することができました。しかし、私はまだパフォーマンスの問題がある、GPUの利用は低いです(tf.dataset複数の労働者との使用にもかかわらず)。 私のユースケースは以下の通りです:訓練例のTF Apiデータセット:初期化

  1. 〜400を、それぞれが10個の入力チャネルを持っている(〜5ギガバイトを取る)
  2. タスクがResNet50を使用してセグメンテーションです。前方 - 後方は約0.15秒かかる。バッチサイズ= 32

  3. データの読み込みは高速で、約0.06秒かかります。

しかし、1つのエポック(32分の400〜= 13反復)の後に、データのロードが〜3.5秒、ローダーの同じような初期化を取るには、(それがすべてのエポックを処理する以上のものです)。これは学習を非常に遅くします。

私の質問です:各エポック後に初期化を排除し、データを連続してフィードするだけのオプションはありますか?

私はdataset.repeat(10)を設定しようとしていましたが、役に立たないです。

ロードコードと列車はここにある:https://gist.github.com/melgor/0e681a4fe8f125d25573aa30d8ace5f3

モデルは、画像分割のためのEcnoderデコーダアイデアに変換だけResNetです。コードの大部分はhttps://github.com/argman/EASTから取得されていますが、ここでは読み込みが非常に遅いため、TfRecordsに変換したいと思います。

+0

それはソースを見ずに、このような質問に答えるのは難しいです。私は最近、データセットを使って遊んでいて、dataset.repeat()は毎回イテレータを再初期化するのではなく、移動する方法です。しかし、あなたはパイプラインのどこにrepeat()をしているのか注意する必要があります。 –

+0

答えをありがとう。デバッグに便利なコードを追加しました。現在、この問題を解決する方法があるかどうかはわかりません。 – melgor89

+1

batch()の前にrepeat()を移動し、repeat()を使用してトレーニングのエポック数を制御するので、初期化可能なイテレータの代わりに1回のイテレータを使用できます。 –

答えて

0

私は長い初期化で私の問題を部分的に解決します。私はちょうどtfrecordファイルを小さくする。 私の基本的な実装では、生の文字列を画像として使用しました(numpy配列の文字列です)。新しい 'tfrecord'には、jpegまたはpngを使った圧縮画像が含まれています。そのおかげで、ファイルを50倍小さくして初期化をはるかに高速化します。しかし、そこにはまた、あなたの画像はuini8(jpeg)またはuint16(png)である必要があります。フロートの場合、uint16を使用できますが、情報が失われます。

にnumpyの配列をコードするためにあなたがTensorflow自体を使用することができ刺す圧縮:

encoded_jpeg = tf.image.encode_jpeg(tf.constant(img),format='rgb').eval(session=sess) 
encoded_png = tf.image.encode_png(tf.constant(png_image)).eval(session=sess)