TensorFlowの日本語まとめ

TensorFlowの公式サイトに書かれている英文を英語ど素人が翻訳(日本語訳/和訳)します。 間違いがありましたら、優しく教えていただけますと幸いです。 内容を理解したら、使ってみたい。

Custom Data Readers

前提条件:

私たちは2つの断片にファイルフォーマットをサポートするタスクを分割します:

  • ファイルフォーマット:私たちは、ファイルからレコード(任意の文字列を指定できます)を読み取るためにReader Opを使用しています。
  • レコードフォーマット私たちはTensorFlowで使用可能なテンソルに文字列レコードをオンにするデコーダや解析OPSを使用します

 

たとえばCSVファイル読み込むために、私たちは、 テキストの行からCSVデータを解析し、OP続いてテキストファイルのリーダーを使用します

f:id:TensorFlow:20160102173329j:plain

スポンサーリンク

 

ファイル形式のためのReaderを書きます

Reader、ファイルからレコードを読み取るものです。すでにTensorFlowに組み込まれたReader Opsのいくつかの例があります。

 

あなたは、これらはすべて同じインターフェイスを公開参照することができ唯一の違いは、そのコンストラクタです。最も重要な方法が読み込まれます。キューの引数を取り、それが1を必要とするたびにファイル名を取得します。(例えば、read op は最初に実行、または前回の読み出しは、ファイルから最後のレコードを読み込むとき)

 これは、2つのスカラーテンソルを生成します文字列キーとし、文字列値

SomeReaderと呼ばれる新しいリーダーを作成するには次のようにする必要があります

  1. C++ではtensorflow::ReaderBaseサブクラスはSomeReaderと呼ばれる定義します。
  2. C++では名前"SomeReader"新しいリーダーOPとカーネルを登録します。
  3. Pythonでは、tf.ReaderBase のサブクラスはSomeReaderと呼ばれる定義します。

あなたはtensorflow/core/user_ops/some_reader_op.cc内のファイルのすべてのC++のコードを置くことができますファイルを読み込むためのコードが tensorflow/core/kernels/reader_base.hに定義されているC++ ReaderBaseクラス子孫に存在します。あなたは、次のメソッドを実装する必要があります。

  • OnWorkStartedLocked: 次のファイルを開きます
  • ReadLocked:レコードやレポートEOF/読み込みエラー
  • OnWorkFinishedLocked:現在のファイルを閉じて、そして
  • ResetLocked: 後にcleanの状態を取得します。例えば、エラー

 これらのメソッドは、ReaderBaseがこれらの方法のいずれかを呼び出す前にmutexを取得することを確認しますので、あなたは、一般的にスレッドの安全性を心配する必要はありませんので、で終わる名前"Locked"を持っています(唯一のクラスのメンバーを保護し、グローバルでない状態)

 

OnWorkStartedLockedは、開くファイルの名前は、current_work()メソッドによって返される値です。ReadLockedは、このシグネチャがあります。

Status ReadLocked(string* key, string* value, bool* produced, bool* at_end)

ReadLockedが正常にファイルからレコードリードした場合は、記入する必要があります。

  • *key: レコードの識別子人間が使うことができることを再度このレコードを検索します。あなたはcurrent_work()からファイル名を含むおよびレコード番号または何追加することができます。
  • *value:レコードの内容と。
  • *produced: true設定します。

あなたはファイルの終わり(EOF)にヒットした場合、true*at_endを設定します。いずれの場合もStatus::OK()を返します。エラーがある場合、単純に任意の引数を変更することなく、tensorflow/core/lib/core/errors.hからのヘルパー関数の1つを使用して、それを返します。次は、実際のReader opを作成します。あなたは op how-toを追加することに精通している場合に役立ちます。主な手順は次のとおりです。

 

  • OPを登録します
  • OpKernelを定義し、登録します。

OPを登録するには、 tensorflow/core/framework/op.hに定義された REGISTER_OPコールを使用します。Reader opsは、任意の入力を取らず、常に型Ref(string)と単一の出力を持っていません。それらはいつもSetIsStateful()を呼び出し、文字列のcontainershared_nameのattrsをを持っている必要があります。あなたは、任意に設定するための追加のattrsにを定義したり、Docのドキュメントを含んでいてもよいです。例えば、tensorflow/core/ops/io_ops.ccを見てください。

#include "tensorflow/core/framework/op.h"

REGISTER_OP("TextLineReader")
    .Output("reader_handle: Ref(string)")
    .Attr("skip_header_lines: int = 0")
    .Attr("container: string = ''")
    .Attr("shared_name: string = ''")
    .SetIsStateful()
    .Doc(R"doc(
A Reader that outputs the lines of a file delimited by '\n'.
)doc");

OpKernelを定義するにはReadersは、tensorflow/core/framework/reader_op_kernel.hで定義されたReaderOpKernelから下降のショートカットを、使用することができます。そして、SetReaderFactoryを呼び出すコンストラクタを実装します。あなたのクラスを定義したら、REGISTER_KERNEL_BUILDER(...)を使用して登録する必要があります。attrsが無い例:

#include "tensorflow/core/framework/reader_op_kernel.h"

class TFRecordReaderOp : public ReaderOpKernel {
 public:
  explicit TFRecordReaderOp(OpKernelConstruction* context)
      : ReaderOpKernel(context) {
    Env* env = context->env();
    SetReaderFactory([this, env]() { return new TFRecordReader(name(), env); });
  }
};

REGISTER_KERNEL_BUILDER(Name("TFRecordReader").Device(DEVICE_CPU),
                        TFRecordReaderOp);

attrsがある例:

#include "tensorflow/core/framework/reader_op_kernel.h"

class TextLineReaderOp : public ReaderOpKernel {
 public:
  explicit TextLineReaderOp(OpKernelConstruction* context)
      : ReaderOpKernel(context) {
    int skip_header_lines = -1;
    OP_REQUIRES_OK(context,
                   context->GetAttr("skip_header_lines", &skip_header_lines));
    OP_REQUIRES(context, skip_header_lines >= 0,
                errors::InvalidArgument("skip_header_lines must be >= 0 not ",
                                        skip_header_lines));
    Env* env = context->env();
    SetReaderFactory([this, skip_header_lines, env]() {
      return new TextLineReader(name(), skip_header_lines, env);
    });
  }
};

REGISTER_KERNEL_BUILDER(Name("TextLineReader").Device(DEVICE_CPU),
                        TextLineReaderOp);


最後のステップは、Pythonラッパーを追加することです。あなたはtensorflow/python/user_ops/user_ops.pytensorflow.python.ops.io_opsインポートし、io_ops.ReaderBase子孫を追加します

from tensorflow.python.framework import ops
from tensorflow.python.ops import common_shapes
from tensorflow.python.ops import io_ops

class SomeReader(io_ops.ReaderBase):

    def __init__(self, name=None):
        rr = gen_user_ops.some_reader(name=name)
        super(SomeReader, self).__init__(rr)


ops.NoGradient("SomeReader")
ops.RegisterShape("SomeReader")(common_shapes.scalar_shape)

あなたはtensorflow/python/ops/io_ops.pyでのいくつかの例を見ることができます。

 

レコード形式のためのOpを書きます

一般に、これは入力としてスカラ文字列レコードを取り、そうOpを追加するための指示に従います。必要に応じて、入力としてスカラ文字列キーを取り、エラーメッセージに不適切な形式のデータを報告することを含んでいてもよいです。不正なデータユーザーがより簡単に追跡することができます。

 

デコードレコードのために有用なOPSの例


特定のレコード形式をデコードするために、複数のOps使用することが有用であり得ることに注意してください。たとえば、あなたはa tf.train.Exampleプロトコルバッファに文字列として保存された画像を有していてもよいです。その画像フォーマットに応じて、 tf.parse_single_exampleOPから対応する出力を取り、 tf.decode_jpegtf.decode_pngまたは tf.decode_raw.を呼ぶかもしれませんtf.decode_rawの出力を取得し、断片を抽出するためにtf.sliceおよびtf.reshapeを使用するのが一般的です。

 

 

(原文)

Custom Data Readers