2016-07-14 11 views
0

Tensorflowで入力を取り込み(ファイルへの参照)、その入力に基づいて可変量の出力を生成するオペレーションを作成していますファイルの「チャンク」)。各チャンクのサイズは、グラフを構築するときに指定される(例えば、ファイル= 1チャンクから50個の「レコード」)が、グラフの構築時には入力の合計サイズ(ファイル内のレコード数)は不明である。入力ファイルが大きい(10GB)ため、これを先験的に指定することはできないため、私のアプリケーションではそれをスキャンするのは実現不可能です。TensorFlow:実行時にのみ知られている、入力あたりの出力の可変数

最初に失敗したのは、Computeコールごとにオペレーションが1つの「出力チャンク」を生成していたことです。しかし、これにより、与えられた入力に対するチャンクの残りの部分が残されていました。さらに検査すると、ランタイムがこのために設計されていないように見えます(間違っていると私に知らせてください!)。

私は、最初の次元だけでは不明なテンソルとしてopの出力を作成しようとしました。たとえば、単一のチャンクの出力がTensorShapeコンストラクタを使用してTensorShape([2])である場合、マルチチャンクバージョンの出力はTensorShape([None, 2])になります。しかし、これによりTensorflowの他の多くの機能(FIFOQueueなど、完全に定義された形状が必要)の使用が妨げられます。

次のいずれかが該当する場合、Tensorflowで作成できますか?

  • 入力あたりの出力数(私は5回OPにComputeを呼び出し、入力あたり5「チャンク」がある場合、OPは一つだけ入力を「消費」されます例えば、1)よりも大きくすることができます
  • 形状が完全に指定されていないが、私はまだTensorflowライブラリを使用することができます(たとえばキュー)

答えて

1

最終的にテンソルフローのキューを直接使用しました。 OP定義で

REGISTER_OP("MyOp") 
... 
.Input("output_queue_handle: resource") 
...; 

は、次にオペカーネル自体に:

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

class MyOpImpl : public OpKernel { 
... 
void Compute(OpKernelContext *ctx) override { 
if (!output_queue) { 
    OP_REQUIRES_OK(LookupResource(ctx, HandleFromInput(ctx, 1), &output_queue_)); 
} 

while (there_is_still_stuff_to_enqueue_from_input) { 
... // do actual computation here 
QueueInterface::Tuple tuple; 
// construct tuple here 
OP_REQUIRES_OK(output_queue_->ValidateTuple(tuple); 
Notification n; 
queue_->TryEnqueue(tuple, ctx, [&n]() { n.Notify(); }); 
n.WaitForNotification(); 
} 

return Status::OK(); 
} 

private: 
QueueInterface *output_queue_ = nullptr; 
}; 
-1

あなたはtensorflowキューを使用することができます。

テンソルフローキューを使用すると、あらかじめ指定しなくても、いくつかの項目をその中に送ることができます。キューが空になるまで、キューを読み取ることができます。

+0

この質問への答えを提供していません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューから](レビュー/低品質の投稿/ 15579895) – JiTHiN

+0

テンソルフローキューの説明が追加されました –