2017-10-28 9 views
0

Tensorflowを使用して構造化されたニューラルネットワークモデルを作成しようとしました。しかし、tfrecordのデータをグラフにフィードすることに問題がありました。コードは次のとおりですが、次の関数でハングアップしますが、どうすれば動作させることができますか?Tensorflow、グラフのないtfrecordを読み取る

画像、ラベル= network.load_tfrecord_data(1)

この機能は、私のデータ・ファイルから.tfrecordsをフィーチャー(画像)とラベルを取得することはできませんか?

ご了承ください。

from __future__ import division 
from __future__ import print_function 

import datetime 
import numpy as np 
import tensorflow as tf 
layers = tf.contrib.layers 
losses = tf.contrib.losses 
metrics = tf.contrib.metrics 

LABELS = 10 
WIDTH = 28 
HEIGHT = 28 
HIDDEN = 100 


def read_and_decode_single_example(filename): 
    filename_queue = tf.train.string_input_producer([filename], num_epochs=None) 
    reader = tf.TFRecordReader() 
    _, serialized_example = reader.read(filename_queue) 
    features = tf.parse_single_example(
    serialized_example, 
    features={ 
     'label': tf.FixedLenFeature([], tf.int64), 
     'image': tf.FixedLenFeature([50176], tf.int64) 
    }) 
    label = features['label'] 
    image = features['image'] 
    image = tf.reshape(image, [-1, 224, 224, 1]) 
    label = tf.one_hot(label - 1, 11, dtype=tf.int64) 
    return label, image 

class Network: 
    def __init__(self, logdir, experiment, threads): 
     # Construct the graph 
     with tf.name_scope("inputs"): 
      self.images = tf.placeholder(tf.float32, [None, WIDTH, HEIGHT, 1], name="images") 
      self.labels = tf.placeholder(tf.int64, [None], name="labels") 
     # self.keep_prob = keep_prob 
      self.keep_prob = tf.placeholder(tf.float32, name="keep_prob") 
      flattened_images = layers.flatten(self.images) 
     hidden_layer = layers.fully_connected(flattened_images, num_outputs=HIDDEN, activation_fn=tf.nn.relu, scope="hidden_layer") 
     output_layer = layers.fully_connected(hidden_layer, num_outputs=LABELS, activation_fn=None, scope="output_layer") 

     loss = losses.sparse_softmax_cross_entropy(labels=self.labels, logits=output_layer, scope="loss") 
     self.training = layers.optimize_loss(loss, None, None, tf.train.AdamOptimizer(), summaries=['loss', 'gradients', 'gradient_norm'], name='training') 

     with tf.name_scope("accuracy"): 
      predictions = tf.argmax(output_layer, 1, name="predictions") 
      accuracy = metrics.accuracy(predictions, self.labels) 
      tf.summary.scalar("training/accuracy", accuracy) 
     self.accuracy = metrics.accuracy(predictions, self.labels) 

     with tf.name_scope("confusion_matrix"): 
      confusion_matrix = metrics.confusion_matrix(predictions, self.labels, weights=tf.not_equal(predictions, self.labels), dtype=tf.float32) 
      confusion_image = tf.reshape(confusion_matrix, [1, LABELS, LABELS, 1]) 

     # Summaries 
     self.summaries = {'training': tf.summary.merge_all() } 
     for dataset in ["dev", "test"]: 
      self.summaries[dataset] = tf.summary.scalar(dataset + "/loss", loss) 
      self.summaries[dataset] = tf.summary.scalar(dataset + "/accuracy", accuracy) 
      self.summaries[dataset] = tf.summary.image(dataset + "/confusion_matrix", confusion_image) 

     # Create the session 
     self.session = tf.Session(config=tf.ConfigProto(inter_op_parallelism_threads=threads, 
                intra_op_parallelism_threads=threads)) 

     self.session.run(tf.global_variables_initializer()) 
     timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H%M%S") 
     self.summary_writer = tf.summary.FileWriter("{}/{}-{}".format(logdir, timestamp, experiment), graph=self.session.graph, flush_secs=10) 
     self.steps = 0 

    def train(self, images, labels, keep_prob): 
     self.steps += 1 
     feed_dict = {self.images: self.session.run(images), self.labels: self.session.run(labels), self.keep_prob: keep_prob} 

     if self.steps == 1: 
      metadata = tf.RunMetadata() 
      self.session.run(self.training, feed_dict, options=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE), run_metadata=metadata) 
      self.summary_writer.add_run_metadata(metadata, 'step1') 
     elif self.steps % 100 == 0: 
      _, summary = self.session.run([self.training, self.summaries['training']], feed_dict) 
      self.summary_writer.add_summary(summary, self.steps) 
     else: 
      self.session.run(self.training, feed_dict) 

    def evaluate(self, dataset, images, labels): 
     feed_dict ={self.images: images, self.labels: labels, self.keep_prob: 1} 
     summary = self.summaries[dataset].eval({self.images: images, self.labels: labels, self.keep_prob: 1}, self.session) 
     self.summary_writer.add_summary(summary, self.steps) 

    def load_tfrecord_data(self, training): 
     training = training 
     if training: 
      label, image = read_and_decode_single_example("mhad_Op_train.tfrecords") 
      # print(self.session.run(image)) 
     else: 
      label, image = read_and_decode_single_example("mhad_Op_test.tfrecords") 

     # image = tf.cast(image, tf.float32)/255. 

     images_batch, labels_batch = tf.train.shuffle_batch(
      [image, label], batch_size=50, num_threads=2, 
      capacity=80, 
      min_after_dequeue=30) 

     return images_batch, labels_batch 


if __name__ == '__main__': 
    # Fix random seed 
    np.random.seed(42) 
    tf.set_random_seed(42) 

    # Parse arguments 
    import argparse 
    parser = argparse.ArgumentParser() 
    parser.add_argument('--batch_size', default=256, type=int, help='Batch size.') 
    parser.add_argument('--epochs', default=50, type=int, help='Number of epochs.') 
    parser.add_argument('--logdir', default="logs", type=str, help='Logdir name.') 
    parser.add_argument('--exp', default="mnist-final-confusion_matrix_customized_loss", type=str, help='Experiment name.') 
    parser.add_argument('--threads', default=1, type=int, help='Maximum number of threads to use.') 
    args = parser.parse_args() 

    # Load the data 
    keep_prob = 1 

    # Construct the network 
    network = Network(logdir=args.logdir, experiment=args.exp, threads=args.threads) 

    # Train 
    for i in range(args.epochs): 
     images, labels = network.load_tfrecord_data(1) 
     network.train(images, labels, keep_prob) 
     print('current epoch', i) 

答えて

0

あなたのモデルにimages, labelsを使用する前に、キューを起動する必要があります。フル例えば

with tf.Session() as sess: 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 
    images, labels = network.load_tfrecord_data(1) 
    ... 
    coord.request_stop() 
    coord.join(threads) 

チェックthis tutorial

関連する問題