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)
そして、ここのようなものだ質問です:このコードは動作しません
。何らかの理由で、
batch()
関数が正しく機能しません。私のラベルを印刷して形状を入力しようとすると、(100, 2)
と(100, 3)
が得られますが、(1, 221000, 2)
,(1, 221000, 3)
、OutOfRangeError
となります。私は "データのインポート"チュートリアルに従っているようですが、私は期待した結果を得られません。データセットから完全なデータセットを取得するにはどうすればよいですか?すべてのN番目のステップで完全な画像を生成したいのですが、データセットからすべての座標を取得できますか?
画像の幅と高さがハードコードされていますが、デコードされたデータから画像を取得するのが良いでしょう。私は
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)]))