2017-11-24 11 views
6

平面カーブのネットワークを訓練したいと思います。これは形状が数字の配列として表されます。(L,2)。 数字2はx、y座標を表し、Lはデータセット内で変化するポイントの数です。私はx、yを2つの異なる "チャンネル"として扱います。Tensorflowでサイズを変更して入力を入力する方法

次のバッチを形状(batch_size,)の1D numpy配列として提供し、形状が2次元配列の(L,2)である要素を含む関数next_batch(batch_size)を実装しました。これらは私の曲線です。前述したように、要素間でLが異なります。 (私はカーブの固定点数に限定したくなかった)。

私の質問:

どのように私は、私はTensorflowチュートリアルに表示される内容と同様のスキームを使用して、入力カーブとのネットワークを養うことができますnext_batch()からの出力を操作することができますhttps://www.tensorflow.org/get_started/mnist/pros

すなわち、feed_dictメカニズムを使用します。

train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) 

batch[0]は、固定された形状を有している:(50,784)(50 =#サンプル、784 = #pixels)

私は私を変換することができない入力サイズはチュートリアルのコード行で、固定したturorial所与において 配列はすべての次元で固定サイズでなければならないので、形状がnumpyの配列に入力してください。(batch_size,L,2) どうすればいいですか?

私はすでにプレースホルダ(それは未知の大きさを持つことができます)に定義:

#first dimension is the sample dim, second is curve length, third:x,y coordinates  
x = tf.placeholder(tf.float32, [None, None,2]) 

のが、どのように私はそれを正しく養うことができますか?

ありがとうございました

+0

入力に埋め込み可能な解決策はありますか? –

+0

残念ながら、私の問題では、 –

+0

@Day_Dreamerバッチ処理を使用するには、それを埋める必要があります。長さのプレースホルダを作成するのはどうですか? – Maxim

答えて

1

短い答え:あなたは、パディングなしでかな長さでサンプルをグループ化することはできません。

ビットを具体的に説明すると、テンソルフローでは、バッチ全体にわたって次元を固定する必要があり、ギザギザの配列はネイティブにサポートされません。
寸法は先験的未知であり(あなたがNoneにプレースホルダ寸法を設定している場合には)まだ、実行時にプレースホルダを持っていることのように ソリューションを推論している:それはだから

x = tf.placeholder(tf.float32, [None, None, 2]) 

は動作しませんでした意味的には、「定数はで、事前にバッチ内のカーブの長さを知りません。実行時にデータから推論します」と意味的に同じです。

これは、あなたのモデルが一般的に異なる寸法の入力を受け入れることができないと言うわけではありませんが、sess.run()を呼び出すたびに入力するデータは固定寸法でなければなりません。

あなたのオプションは、次のように、以下のとおりです。

  1. パッドは、あなたのバッチを第二の次元に沿って。

    In [1]: max_len = 6 
        ...: curve1 = np.random.rand(4, 2) 
        ...: curve2 = np.random.rand(5, 2) 
        ...: batch = [curve1, curve2] 
    
    In [2]: for b in batch: 
        ...:  dim_difference = max_len - b.shape[0] 
        ...:  print np.pad(b, [(0, dim_difference), (0,0)], 'constant') 
        ...:  
    [[ 0.92870128 0.12910409] 
    [ 0.41894655 0.59203704] 
    [ 0.3007023 0.52024492] 
    [ 0.47086336 0.72839691] 
    [ 0.   0.  ] 
    [ 0.   0.  ]] 
    [[ 0.71349902 0.0967278 ] 
    [ 0.5429274 0.19889411] 
    [ 0.69114597 0.28624011] 
    [ 0.43886002 0.54228625] 
    [ 0.46894651 0.92786989] 
    [ 0.   0.  ]] 
    
  2. がでグループ化された曲線のごnext_batch()関数の戻り値のバッチを持っている:
    あなたは次のように6、あなたがnp.padを使用することができますされ、データセット内のシェイプ(4, 2)(5, 2)の2つのカーブを持っていて、最大のカーブの長さを知っていると言います長さ

これは、ギザギザの配列を扱う際の標準的な方法です。

別の可能性として、あなたのタスクで許容される場合は、テンソルの形状がすべて(None, 2)で連結し、バッチでサンプルであるかのようにシングルポイントで動作するようにモデルを変更します。元のサンプル長を別の配列に保存すると、モデル出力を正しくスライスして復元できます。これは非常に非効率的で、あなたの問題に関するあらゆる種類の前提を必要としますが、それは可能です。

乾杯!

5

TFでさまざまなサイズの入力を使用できます。リストされたチュートリアルと同じ方法でデータをフィードするだけですが、プレースホルダ内の変化するディメンションを[なし]として定義してください。ここで

は異なる形状でプレースホルダを供給する簡単な例です:あなたはおそらく探している

import tensorflow as tf 
import numpy as np 


array1 = np.arange(9).reshape((3,3)) 
array2 = np.arange(16).reshape((4,4)) 
array3 = np.arange(25).reshape((5,5)) 

model_input = tf.placeholder(dtype='float32', shape=[None, None]) 
sqrt_result = tf.sqrt(model_input) 
with tf.Session() as sess: 
    print sess.run(sqrt_result, feed_dict={model_input:array1}) 
    print sess.run(sqrt_result, feed_dict={model_input:array2}) 
    print sess.run(sqrt_result, feed_dict={model_input:array3}) 
0

Tensorflow Foldはあなたにとって興味深いかもしれません。 Tensorflowつ折りREADMEから

TensorFlowのフォールドは、計算グラフの構造は、入力data.Foldの構造に依存する、構造化されたデータを消費TensorFlowモデルを作成するためのライブラリであり、動的バッチを実装します。任意形状の計算グラフのバッチを変形して静的計算グラフを生成する。このグラフは、どの入力を受け取っても同じ構造を持ち、TensorFlowによって効率的に実行できます。任意L値を受け入れるように任意の構造化入力を読み込むことができるように

グラフ構造は、再帰的ニューラルネットなどのアーキテクチャを構築するとき、これは特に便利です。設定することができます。全体的な構造は、あなたが慣れ親しんでいるものと非常に似ています(dictsなどを送ります)。アプリケーションに動的な計算グラフが必要なので、これは長期的には良い動きかもしれません。

1

varの先頭に[None、...、None]というプレースホルダを使用できます。各「なし」は、そのディメンションに入力されたフィードデータがコンパイラにあることを意味します。たとえば、[None、None]は、入力できる行と列の長さを持つ行列を意味します。ただし、使用するNNの種類には注意が必要です。なぜなら、CNNを扱うとき、畳み込みレイヤーとプールレイヤーでは、 'テンソル'の特定のサイズを特定する必要があるからです。

関連する問題