エラーが示すように、テンソルをプレースホルダに供給することはできません。 batch_x
およびbatch_y
はテンソルです。新しいtf.Dataset
APIは、データをモデルに入力するための好ましい方法です(ガイドhere)。私はDataset.from_tensor_slices
が最小限の書き換えを必要とすると思う。それでは、グラフを作成して、直接使っているモデルにbatch_x
とbatch_y
が流れ込むようにしてください。次に、プレースホルダを使用する必要はありません。
私はこれをお勧めしませんが、完全性のために別の方法を述べたいと思います。あなたは可能性:
numpy_batch_x, numpy_batch_y = sess.run([batch_x, batch_y])
_, summary = sess.run([train_writer, summary_op],
feed_dict={x: numpy_batch_x, y_: numpy_batch_y})
PS:train_writer
がtf.summary.FileWriter
であれば、私はあなたがしたいと思う:
summary = sess.run([summary_op], ...)
train_writer.add_summary(summary)
EDIT:データセットのAPI上の混乱を受けて、私は方法を示すつもりですこれをデータセットで処理します。私はTFRecordsを使用するつもりです。それは最も単純な解決策ではないかもしれませんが、それは一つの方法です。
import numpy as np
from scipy.misc import imread # There are others that would work here.
from cv2 import resize # Again, others to choose from.
def read_labeled_image_list(...)
# See question
return filenames, labels
def make_tfr(tfr_dir="/YOUR/PREFERRED/TFR/DIR")
def _int64_list_feature(a_list):
return tf.train.Feature(int64_list=tf.train.Int64List(value=a_list)
def _bytes_feature(value):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
writer = tf.python_io.TFRecordWriter(tfr_dir)
all_image_paths, all_labels = read_labeled_image_list(...)
for path, label in zip(all_image_paths, all_labels):
disk_im = imread(path)
resized_im = cv2.resize(disk_im, (128, 128))
raw_im = resized_im.tostring()
# Construct an example proto-obj,
example = tf.train.Example(
# which wants a Features proto-obj,
features=tf.train.Features(
# which wants a dict.
feature={
'image_raw': _bytes_feature(raw_im),
'label': _int64_list_feature(label)
})) # close your example object
serialized = example.SerializeToString()
writer.write(serialized)
make_tfr() # After you've done it successfully once, comment out.
def input_pipeline(batch_size, epochs, tfr_dir="/YOUR/PREFERRED/TFR/DIR"):
# with tf.name_scope("Input"): maybe you like to scope as much as I do?
dataset = tf.data.TFRecordDataset(tfr_dir)
def parse_protocol_buffer(example_proto):
features = {'image_raw': tf.FixedLenFeature((), tf.string),
'label': tf.FixedLenFeature((), tf.int64)}
parsed_features = tf.parse_single_example(
example_proto, features)
return parsed_features['image_raw'], parsed_features['label']
dataset = dataset.map(parse_protocol_buffer)
def convert_parsed_proto_to_input(image_string, label):
image_decoded = tf.decode_raw(image_string, tf.uint8)
image_resized = tf.reshape(image_decoded, (128, 128, 3))
image = tf.cast(image_resized, tf.float32)
# I usually put my image elements in [-1, 1]
return image * (2. /255) -1, label
dataset = dataset.map(converted_parsed_proto_to_input)
dataset = dataset.shuffle(buffer_size=1000)
dataset = dataset.repeat(batch_size * epochs)
return dataset
def model(image_tensor):
...
# However you want to do this.
return predictions
def loss(predictions, labels):
...
return some_loss
def train(some_loss):
...
return train_op
batch_size = 50
iterations = 10000
train_dataset = input_pipeline(batch_size, iterations)
train_iterator = train_dataset.make_initializable_iterator()
image, label = train_iterator.get_next()
predictions = model(image)
loss_op = loss(image, predictions)
train_op = train(loss_op)
summary_op = tf.summary.merge_all()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
train_writer = tf.summary.FileWriter("/YOUR/LOGDIR", sess.graph)
sess.run(train_iterator.initializer)
for epoch in range(iterations + 1):
_, summary = sess.run([train_op, summary_op])
train_writer.add_summary(summary, epoch)
あなたはTensorFlowを初めて使うと言います。私はこれがあなたを脅かさないことを願っています。私はずっと前からTensorFlowを初めて使っていましたが、良い入力パイプラインを作る方法を理解することは苦労でした。 TFRコードを学習することは不可能と思われました。 Pythonの初心者だと言うので、cv2
はインストールが難しいという評判があります。画像のサイズを変更する他の方法を調べることもできます(PILにはアドバイスしますが、これは最初はもっと混乱して難しいでしょう)。
基本的には、TFRecordsの記述に関するドキュメントが混乱しているため(Exhibit A対blog post)、TFRecordsは私がデータセットを最適にする方法を知っている方法です。たとえあなたがTFRecordsルートに行っていなくても、map
のデータセットのための機能、例えば私がlabel
からconvert...
までどのように渡したのかは気にしないでください。データセット(特にTFRecordsから)を作るのはコード行ですが、Dataset
は入力パイプラインを構築するのに適した方法で、使用している古いqueue
メソッドを置き換えるように設計されています。
queue
戦略の目的は、メモリから直接のプレースホルダなしでデータをメモリから読み込むことでした。プレースホルダはキュー戦略と比較して遅く、メモリ集約的ですが、データセットは正しく実装されるとさらに優れています。
プレースホルダネームスコープがグラフに接続されていることを確認してください。データセットの方法では、グラフにいくつかのデータセットノードが表示されます。私がコメントしたものでそれらをスコープするならば、すべてが正しく繋がっていることが明らかです。実際には、このキューとプリプロセス構造を実際にグラフに追加しています。プレースホルダーに画像を渡す場合は、画像を伸ばす必要があるため、データが正しく流れているかどうかはわかりません。
元の投稿に記載されているように、batch_x
とbatch_y
をモデルに渡すだけで、placeholder
とデータセットは完全に忘れてしまいます。キューが正しく実装されていれば、前処理段階からすべてのものが表示されます。それでも、イメージを大きくする前にイメージが大きくなります。それらを読むことは集中的な仕事になるでしょう。私はDatasets
とTFRecords
を使用するように学習するという厳しい道を行くことをお勧めします。
これは、コードにデータセットを実装するのに役立ちます。これがTensorBoardの稼働に役立つことを願っています。そして、私はあなたがそのルートに行くことを決めた場合、これがTFRコードを把握するのに役立つことを願っています。
PS:モデルが機能していることを検証するTensorBoardのトピックでは、model(...)
の最初の行にtf.summary.image(img)
を付けることができます。次に、イメージダッシュをチェックし、それがあなたが期待しているものかどうかを確認します。
EDIT 2:example = tf.train.Example(features=tf.train.Features(feature={}))
あなたが取得しているエラーを投稿することができますか? – Zoe
TypeError:フィードの値をtf.Tensorオブジェクトにすることはできません。受け入れ可能なフィードの値には、Pythonのスカラ、文字列、リスト、numpy ndarrayまたはtensorhandlesが含まれます –
どこで 'IMAGES'と' LABELS'を定義しますか? – GPhilo