2017-07-04 11 views
1

私は、画像の束を分類するためにconvNNを構築しています。まず、ネットワークで何が変更されたとしても、精度は本当に悪かったです(6%荒れていました)。だから問題は私が画像を読む方法だと思った。変更後のコードのこの部分は、私が説明できないという結果が得られます。 enter image description hereConvNN Tensorflowの奇妙な精度結果

私は私が使用しているコードは、そのために、である、私はバッチを使用する方法が問題だと思います。

def getImage(filename): 
    with tf.device('/cpu:0'): 
     # convert filenames to a queue for an input pipeline. 
     filenameQ = tf.train.string_input_producer([filename],num_epochs=None) 
    # object to read records 
    recordReader = tf.TFRecordReader() 

    # read the full set of features for a single example 
    key, fullExample = recordReader.read(filenameQ) 

    # parse the full example into its' component features. 
    features = tf.parse_single_example(
     fullExample, 
     features={ 
      'image/height': tf.FixedLenFeature([], tf.int64), 
      'image/width': tf.FixedLenFeature([], tf.int64), 
      'image/colorspace': tf.FixedLenFeature([], dtype=tf.string,default_value=''), 
      'image/channels': tf.FixedLenFeature([], tf.int64), 
      'image/class/label': tf.FixedLenFeature([],tf.int64), 
      'image/class/text': tf.FixedLenFeature([], dtype=tf.string,default_value=''), 
      'image/format': tf.FixedLenFeature([], dtype=tf.string,default_value=''), 
      'image/filename': tf.FixedLenFeature([], dtype=tf.string,default_value=''), 
      'image/encoded': tf.FixedLenFeature([], dtype=tf.string, default_value='') 
     }) 

    # now we are going to manipulate the label and image features 
    label = features['image/class/label'] 
    image_buffer = features['image/encoded'] 
    # Decode the jpeg 
    with tf.name_scope('decode_img',[image_buffer], None): 
     # decode 
     image = tf.image.decode_png(image_buffer, channels=1) 

     # and convert to single precision data type 
     image = tf.image.convert_image_dtype(image, dtype=tf.float32) 
    # cast image into a single array, where each element corresponds to the greyscale 
    # value of a single pixel. 
    # the "1-.." part inverts the image, so that the background is black. 
    image = tf.reshape(image,[img_height*img_width]) 
    # re-define label as a "one-hot" vector 
    # it will be [0,1] or [1,0] here. 
    # This approach can easily be extended to more classes. 
    label=tf.stack(tf.one_hot(label-1, numberOFclasses)) 
    return image, label 

with tf.device('/cpu:0'): 
    train_img,train_label = getImage(TF_Records+"/TrainRecords") 
    validation_img,validation_label=getImage(TF_Records+"/TestRecords") 
    # associate the "label_batch" and "image_batch" objects with a randomly selected batch--- 
    # of labels and images respectively 
    train_imageBatch, train_labelBatch = tf.train.shuffle_batch([train_img, train_label], batch_size=batchSize,capacity=50,min_after_dequeue=10) 

    # and similarly for the validation data 
    validation_imageBatch, validation_labelBatch = tf.train.shuffle_batch([validation_img, validation_label], 
                batch_size=batchSize,capacity=50,min_after_dequeue=10) 

    # feeding function 
    def feed_dict(train): 
     if True : 
      #img_batch, labels_batch= tf.train.shuffle_batch([train_label,train_img],batch_size=batchSize,capacity=500,min_after_dequeue=200) 
      img_batch , labels_batch = sess.run([ train_labelBatch ,train_imageBatch]) 
      dropoutValue = 0.7 
     else: 
      # img_batch,labels_batch = tf.train.shuffle_batch([validation_label,validation_img],batch_size=batchSize,capacity=500,min_after_dequeue=200) 
      img_batch,labels_batch = sess.run([ validation_labelBatch,validation_imageBatch]) 
      dropoutValue = 1 
     return {x:img_batch,y_:labels_batch,keep_prob:dropoutValue} 

    for i in range(max_numberofiteretion): 
     if i%10 == 0:#Run a Test 
      summary, acc = sess.run([merged,accuracy],feed_dict=feed_dict(False)) 
      test_writer.add_summary(summary,i)# Save to TensorBoard 
     else: # Training 
      if i % 100 == 99: # Record execution stats 
      run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) 
      run_metadata = tf.RunMetadata() 
      summary, _ = sess.run([merged, train_step], 
            feed_dict=feed_dict(True), 
            options=run_options, 
            run_metadata=run_metadata) 
      train_writer.add_run_metadata(run_metadata, 'step%03d' % i) 
      train_writer.add_summary(summary, i) 
      print('Adding run metadata for', i) 
      else: # Record a summary 
      summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True)) 
      train_writer.add_summary(summary, i) 
     # finalise 
     coord.request_stop() 
     coord.join(threads) 
     train_writer.close() 
     test_writer.close() 

何が問題なのですか?ありがとうございます。 PS:イメージは間違いなく私が拾ったことの一つがここにあるTensorboard

答えて

1

でそれらを見ることができますロードされている。

return label, image 

with tf.device('/cpu:0'): 
    train_img,train_label = getImage(TF_Records+"/TrainRecords") 
    validation_img,validation_label=getImage(TF_Records+"/TestRecords") 

は(関数GET_IMAGE中のように見える)あなたはreturn label, imageが、ときに関数を呼び出します割り当てを元に戻します。

+0

これはなぜですか? getImageはtraining/Testのバッチ、または最初の要素を返すべきで、tf.train.shufflebatchはバッチを生成できます! – Engine

+0

はい、画像を返す順序を見てから、関数を呼び出すと – pypypy

+0

が正しく機能しますが、実行機能でスワップしてくれました。 – Engine