2017-11-03 14 views
0

TFでは、新しい入力パイプラインフレームワークの使い方を理解しようとしています。私が使っているおもちゃモデルは、ピクセル座標を入力として、RGB値をラベルとして訓練することによって画像を暗記しようとしています。現時点で私が持っているコードは、このテンソルでのデータセットの使用

W=442 
H=500 

image = tf.read_file('kitteh.png') 
image = tf.image.decode_png(image, channels=3) 
# normalize to 0-1 range 
image = (image - tf.reduce_min(image))/(tf.reduce_max(image) - tf.reduce_min(image)) 

# features and labels 
coordinates = tf.constant([(x, y) for x in range(W) for y in range(H)], dtype=tf.float32) 
rgb = tf.reshape(image, [-1, 3]) 

# dataset and input pipeline 
features = tf.data.Dataset.from_tensors(coordinates) 
labels = tf.data.Dataset.from_tensors(rgb) 
data = tf.data.Dataset.zip((features, labels)) 

batched = data.batch(100) 
iterator = batched.make_one_shot_iterator() 
inputs, labels = iterator.get_next() 


def net(inputs, reuse=False): 
    l1 = tf.layers.dense(inputs, 20, activation=tf.nn.relu, name='l1', reuse=reuse) 
    l2 = tf.layers.dense(l1, 20, activation=tf.nn.relu, name='l2', reuse=reuse) 
    l3 = tf.layers.dense(l2, 20, activation=tf.nn.relu, name='l3', reuse=reuse) 
    l4 = tf.layers.dense(l3, 20, activation=tf.nn.relu, name='l4', reuse=reuse) 
    l5 = tf.layers.dense(l4, 20, activation=tf.nn.relu, name='l5', reuse=reuse) 
    l6 = tf.layers.dense(l5, 20, activation=tf.nn.relu, name='l6', reuse=reuse) 
    l7 = tf.layers.dense(l6, 20, activation=tf.nn.relu, name='l7', reuse=reuse) 
    return tf.layers.dense(l7, 3, activation=tf.nn.sigmoid, name='out', reuse=reuse) 

model = net(inputs) 
loss = tf.losses.mean_squared_error(labels, model) 

step = tf.train.get_global_step() 
train = tf.train.AdamOptimizer().minimize(loss, global_step=step) 

test = net(coordinates, reuse=True) 

with tf.Session() as session: 
    session.run((tf.global_variables_initializer(), tf.local_variables_initializer())) 
    orig = session.run(image) 
    for i in range(50000): 
     f, l = session.run([inputs, labels]) 
     print(f.shape, l.shape) 

そして、ここのようなものだ質問です:このコードは動作しません

  1. 。何らかの理由で、batch()関数が正しく機能しません。私のラベルを印刷して形状を入力しようとすると、(100, 2)(100, 3)が得られますが、(1, 221000, 2),(1, 221000, 3)OutOfRangeErrorとなります。私は "データのインポート"チュートリアルに従っているようですが、私は期待した結果を得られません。

  2. データセットから完全なデータセットを取得するにはどうすればよいですか?すべてのN番目のステップで完全な画像を生成したいのですが、データセットからすべての座標を取得できますか?

  3. 画像の幅と高さがハードコードされていますが、デコードされたデータから画像を取得するのが良いでしょう。私はW = image.get_shape()[0]をしようとしましたが、Wがまだ定義されていないため、私のparser()関数が失敗しました。解決策はありますか?

編集#1:コードを最新の試みに更新し、私が得ている最新の問題を反映するように質問を更新しました。

編集#3:以前の編集で間違いをしたようです。問題はzip()ではなくbatch()であるようです。データとバッチデータセットの出力図形を印刷すると、次のような結果が得られます。

(TensorShape([Dimension(221000), Dimension(2)]), 
TensorShape([Dimension(221000), Dimension(3)])) 
(TensorShape([Dimension(None), Dimension(221000), Dimension(2)]), 
TensorShape([Dimension(None), Dimension(221000), Dimension(3)])) 

答えて

0

最初の主な問題を解決しました。 Dataset.from_tensor()と 'Dataset.from_tensor_slices()'には微妙な違いがあるようです。両者とも引数としてテンソルを取るが、従来の方法ではテンソル全体を単一の訓練サンプルとして扱い、後で最初の軸をサンプルとして扱い、残りをデータとして扱い、テンソルを第1軸に沿ってサンプルに分割する。後の機能を使って私が持っていた問題を解決しました。

質問2と3については、私はまだ答えを聞いているのが大好きですが、現在私が望むようにする方法がないように思われるので、ハードコードされた画像の寸法を使用して終了しました。一定のテンソルで完全な画像を描く。

関連する問題