2017-06-12 11 views
0

私はこれで一日中働いていますが、私は別のものが違いをもたらすとは思わない!はtf.train.shuffle_batch()が正常に動作しません

私はここに、私はラベル付きテンソルとして画像にホッピング使用したコード> 400のコピー[ I got to use images with different shapes, but for now I just want to get this starting ]

を作った、そこから.pngファイル、持っている:私は「何に基づいて

import tensorflow as tf 
import os 
import numpy 
batch_Size =20 
num_epochs = 100 
files = os.listdir("Test_PNG") 
files = ["Test_PNG/" + s for s in files] 
files = [os.path.abspath(s) for s in files ] 


def read_my_png_files(filename_queue): 
    reader = tf.WholeFileReader() 
    imgName,imgTensor = reader.read(filename_queue) 
    img = tf.image.decode_png(imgTensor,channels=0) 
    # Processing should be add 
    return img,imgName 

def inputPipeline(filenames, batch_Size, num_epochs= None): 
    filename_queue = tf.train.string_input_producer(filenames, num_epochs=num_epochs,shuffle =True) 
    img_file, label = read_my_png_files(filename_queue) 
    min_after_dequeue = 100 
    capacity = min_after_dequeue+3*batch_Size 
    img_batch,label_batch = tf.train.shuffle_batch([img_file,label],batch_size=batch_Size,enqueue_many=True, 
                allow_smaller_final_batch=True, capacity=capacity, 
                min_after_dequeue =min_after_dequeue, shapes=[w,h,d]) 
    return img_batch,label_batch 

images, Labels = inputPipeline(files,batch_Size,num_epochs) 

をテンソルとそのラベルとして20倍の画像を取得する必要があることを理解しています。 私は怒鳴るここにコードを実行し、私が取得した内容です:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-3-08857195e465> in <module>() 
    34  return img_batch,label_batch 
    35 
---> 36 images, Labels = inputPipeline(files,batch_Size,num_epochs) 

<ipython-input-3-08857195e465> in inputPipeline(filenames, batch_Size, num_epochs) 
    31  img_batch,label_batch = tf.train.shuffle_batch([img_file,label],batch_size=batch_Size,enqueue_many=True, 
    32              allow_smaller_final_batch=True, capacity=capacity, 
---> 33              min_after_dequeue =min_after_dequeue, shapes=[w,h,d]) 
    34  return img_batch,label_batch 
    35 

c:\users\engine\appdata\local\programs\python\python35\lib\site-packages\tensorflow\python\training\input.py in shuffle_batch(tensors, batch_size, capacity, min_after_dequeue, num_threads, seed, enqueue_many, shapes, allow_smaller_final_batch, shared_name, name) 
    1212  allow_smaller_final_batch=allow_smaller_final_batch, 
    1213  shared_name=shared_name, 
-> 1214  name=name) 
    1215 
    1216 

c:\users\engine\appdata\local\programs\python\python35\lib\site-packages\tensorflow\python\training\input.py in _shuffle_batch(tensors, batch_size, capacity, min_after_dequeue, keep_input, num_threads, seed, enqueue_many, shapes, allow_smaller_final_batch, shared_name, name) 
    767  queue = data_flow_ops.RandomShuffleQueue(
    768   capacity=capacity, min_after_dequeue=min_after_dequeue, seed=seed, 
--> 769   dtypes=types, shapes=shapes, shared_name=shared_name) 
    770  _enqueue(queue, tensor_list, num_threads, enqueue_many, keep_input) 
    771  full = (math_ops.cast(math_ops.maximum(0, queue.size() - min_after_dequeue), 

c:\users\engine\appdata\local\programs\python\python35\lib\site-packages\tensorflow\python\ops\data_flow_ops.py in __init__(self, capacity, min_after_dequeue, dtypes, shapes, names, seed, shared_name, name) 
    626   shared_name=shared_name, name=name) 
    627 
--> 628  super(RandomShuffleQueue, self).__init__(dtypes, shapes, names, queue_ref) 
    629 
    630 

c:\users\engine\appdata\local\programs\python\python35\lib\site-packages\tensorflow\python\ops\data_flow_ops.py in __init__(self, dtypes, shapes, names, queue_ref) 
    151  if shapes is not None: 
    152  if len(shapes) != len(dtypes): 
--> 153   raise ValueError("Queue shapes must have the same length as dtypes") 
    154  self._shapes = [tensor_shape.TensorShape(s) for s in shapes] 
    155  else: 

ValueError: Queue shapes must have the same length as dtypes 

を私はtf.train.shuffle_batch機能で使用するには以下の形状を宣言したが、私はまだ形状誤差を持っています!

どうすればこの問題を解決できますか?

答えて

1

あなたの問題は

  • enqueue_many=True引数、
  • labelディメンションがありませんでしたshapes引数の形状の両方からでした。

だから私はenqueue_many=Falseshapes=[[h, w, c], []])で試してみます。あなたはshuffle_batchドキュメントを見れば

実際、:、Falseある

enqueue_many場合tensorsは つの例を表すものと見なされます。 [x, y, z]の形状の入力テンソルは、形状が[batch_size, x, y, z]のテンソルとして と出力されます。 enqueue_manyTrueある

場合、tensorsは第一次元は、例えば、 によってインデックス付けされtensorsのすべてのメンバーが 最初の次元で同じサイズを有していなければならない例の バッチを表すものとします。入力テンソルの形状が[*, x, y, z]の場合、 の出力の形状は[batch_size, x, y, z]になります。

しかし、あなたのコードでは、あなたが唯一の1つのファイルデキューようです: img_file, label = read_my_png_files(filename_queue)を、あなたがまっすぐshuffle_batch関数に渡しますので*寸法が不足しているとTensorFlowはの最初の次元いることを期待している img_batch,label_batch = tf.train.shuffle_batch([img_file,label], ...) [img_file,label]は例の数です。

enqueue_manydequeue_manyは独立しています。すなわち、

  • *:あなたがキューにキューイング例の数は、
  • batch_sizeとは無関係です:新しいバッチサイズは、キューから引っ張りました。
+0

enqueue_manyのデフォルト値に返信してくれてありがとうございます。バッチはbatchSize時間pngシェイプのシェイプを持つため、Trueを設定しましたか?とにかくそれはどちらの方法でも動作しませんでした! – Engine

+0

あなたはそれを試しましたか?私はあなたが持っている任意のpngファイルを使用することができます! – Engine

+0

あなたの助けてくれてありがとう、それは今働いていますが、私はそれの背後にある仕組みを理解している問題を設定しました。 tf.train.shuffle_batch([img_file、label] ..)は、ファイルとそのラベルを取得するためにどのキューを使用すべきかをバッチ関数に伝え、パラメータbatchSizeはデキューする要素の数を関数に指示します。 – Engine

関連する問題