2017-12-05 17 views
0

私は自分の画像をいくつかのテンソルフローコードでフィードして、コードがMNISTセットの代わりに自分のイメージにどのように反応するかを調べることを試みてきました。私はテンソルフローに画像をインポートすることができましたが、画像データとラベルデータを取得する2つのプレースホルダがあります。私は残りのコードで自分のデータを使用できるようにするためにfeed_dictを使用しようとしましたが、フィードを受け取るデータは受け入れられません。私はそれがTensorと、明らかにバッチではないことを知っているが、私がこの仕事をするために考えることができる唯一の方法は、それをリストにすることである。私はfeed_dictがnumpy配列を使用することができますが、どのようにnumpy配列にデータを変換するべきかわからないimを見た。Feed_dictは自分のデータを受け入れません

私はTensorFlowとPythonの新作ですので、私が作った間違いを許してください。私はまだすべての仕組みを学んでいます。私は自分のコードを貼り付けるとき

with tf.name_scope('Image_Data_Input'): 
    def read_labeled_image_list(image_list_file): 
    print('read_labeled_image_list function opened') 
    f = open(image_list_file, 'r') 
    print('image_list_file opened') 
    filenames = [] 
    labels = [] 
    print('Arrays formed') 
    for line in f: 
     filename, label = line[:-1].split(' ') 
     filenames.append(filename) 
     labels.append(label) 
    print('Lines deconstructed') 
    return filenames, labels 

def read_image(input_queue): 
    label = input_queue[1] 
    file_contents = tf.read_file(input_queue[0]) 
    decoded_image = tf.image.decode_jpeg(file_contents, channels=3) 
    print('Image decoded to JPEG') 
    decoded_image.set_shape([2560, 1440, 3]) 
    decoded_image = tf.image.resize_images(decoded_image, [128, 128]) 
    return decoded_image, label 

image_list, label_list = read_labeled_image_list(image_list_file) 
images = tf.convert_to_tensor(image_list, dtype=tf.string) 
labels = tf.convert_to_tensor(label_list, dtype=tf.string) 

input_queue = tf.train.slice_input_producer([images, labels], num_epochs=None, shuffle=True) 

image, label = read_image(input_queue) 

インデントはので、私はすべてが適切に配置されてわからないんだけど少し奇妙に振る舞っ。

まあ、今私は、これらのプレースホルダがあります。

with tf.name_scope('input'): 
    x = tf.placeholder(tf.float32, shape=[None, 784]) 
    y_ = tf.placeholder(tf.float32, shape=[None, 10]) 

をそして私は、これらのプレースホルダには、この方法でデータをルーティングコードを見てきました:

batch_x, batch_y = tf.train.batch([image, label], batchsize) 
#_, summary = sess.run([train_writer, summary_op], feed_dict={x: batch_x, y_: batch_y}) 

をしかし、私はこの仕事をするように見えることはできません。

どのように私はこの仕事をすることができましたか考えている人はいますか?

もう一度ご迷惑をおかけして申し訳ありません。

+0

あなたが取得しているエラーを投稿することができますか? – Zoe

+0

TypeError:フィードの値をtf.Tensorオブジェクトにすることはできません。受け入れ可能なフィードの値には、Pythonのスカラ、文字列、リスト、numpy ndarrayまたはtensorhandlesが含まれます –

+0

どこで 'IMAGES'と' LABELS'を定義しますか? – GPhilo

答えて

1

エラーが示すように、テンソルをプレースホルダに供給することはできません。 batch_xおよびbatch_yはテンソルです。新しいtf.Dataset APIは、データをモデルに入力するための好ましい方法です(ガイドhere)。私はDataset.from_tensor_slicesが最小限の書き換えを必要とすると思う。それでは、グラフを作成して、直接使っているモデルにbatch_xbatch_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_writertf.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 Ablog post)、TFRecordsは私がデータセットを最適にする方法を知っている方法です。たとえあなたがTFRecordsルートに行っていなくても、mapのデータセットのための機能、例えば私がlabelからconvert...までどのように渡したのかは気にしないでください。データセット(特にTFRecordsから)を作るのはコード行ですが、Datasetは入力パイプラインを構築するのに適した方法で、使用している古いqueueメソッドを置き換えるように設計されています。

queue戦略の目的は、メモリから直接プレースホルダなしでデータをメモリから読み込むことでした。プレースホルダはキュー戦略と比較して遅く、メモリ集約的ですが、データセットは正しく実装されるとさらに優れています。

プレースホルダネームスコープがグラフに接続されていることを確認してください。データセットの方法では、グラフにいくつかのデータセットノードが表示されます。私がコメントしたものでそれらをスコープするならば、すべてが正しく繋がっていることが明らかです。実際には、このキューとプリプロセス構造を実際にグラフに追加しています。プレースホルダーに画像を渡す場合は、画像を伸ばす必要があるため、データが正しく流れているかどうかはわかりません。

元の投稿に記載されているように、batch_xbatch_yをモデルに渡すだけで、placeholderとデータセットは完全に忘れてしまいます。キューが正しく実装されていれば、前処理段階からすべてのものが表示されます。それでも、イメージを大きくする前にイメージが大きくなります。それらを読むことは集中的な仕事になるでしょう。私はDatasetsTFRecordsを使用するように学習するという厳しい道を行くことをお勧めします。

これは、コードにデータセットを実装するのに役立ちます。これがTensorBoardの稼働に役立つことを願っています。そして、私はあなたがそのルートに行くことを決めた場合、これがTFRコードを把握するのに役立つことを願っています。

PS:モデルが機能していることを検証するTensorBoardのトピックでは、model(...)の最初の行にtf.summary.image(img)を付けることができます。次に、イメージダッシュをチェックし、それがあなたが期待しているものかどうかを確認します。

EDIT 2example = tf.train.Example(features=tf.train.Features(feature={}))

+0

リンク先のデータセットガイドを調べておきます。事前に感謝します。プレースホルダを使用しているので、プレースホルダネームスコープ全体がグラフの残りの部分に接続されているかどうかを確認できるので、すべてが機能しているかどうかをすぐに確認できます。私は今のところ私の現在の問題のためにadd_summaryを見ていませんでした(実際には、グラフはすべて私の入力が正しく機能するかどうかを確認するために必要なすべての視覚化ですが)とにかく感謝します:) –

+0

Dataset.from_tensor_slicesはnumpy配列の使用です。私は.npyファイル形式でデータを持っていないので、どこにいてもそのようなファイルを作成する方法は見つけられません(Tensorflowのドキュメントでは、これが50%の時間がかかるようです)。それは何とか私のデータを何とかnumpy配列に変換しなければならないことを意味しますが、numpy配列のドキュメンテーションが実際にこのようなことを考慮していないので、どのようにアプローチするのか分かりません。要するに、私はデータセットの実装方法が全く失われています。私のコードのfrom_tensor_slices。 –

+0

@WilrickB編集をチェックしてください。 '.npy'についての良い点は、私はそれについて考えなかった。 (私の意見では、あなたはTensorFlowのドキュメントについても正しいです!) –

関連する問題