Zoeken…


Tel voorbeelden in CSV-bestand

import tensorflow as tf
filename_queue = tf.train.string_input_producer(["file.csv"], num_epochs=1)
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
col1, col2 = tf.decode_csv(value, record_defaults=[[0], [0]])

with tf.Session() as sess:
  sess.run(tf.initialize_local_variables())
  tf.train.start_queue_runners()
  num_examples = 0
  try:
    while True:
      c1, c2 = sess.run([col1, col2])
      num_examples += 1
  except tf.errors.OutOfRangeError:
    print "There are", num_examples, "examples"

num_epochs=1 zorgt ervoor dat string_input_producer wachtrij wordt geplaatst na verwerking van elk bestand op de lijst eenmaal. Het leidt tot het verhogen van OutOfRangeError die wordt gevangen in try: Standaard produceert string_input_producer de bestandsnamen oneindig.

tf.initialize_local_variables() is een tensorflow Op die, wanneer uitgevoerd, initialiseert num_epoch lokale variabele binnen string_input_producer .

tf.train.start_queue_runners() start extra tf.train.start_queue_runners() die het asynchroon toevoegen van gegevens aan de wachtrijen afhandelen.

TFRecord-bestand lezen en ontleden

TFRecord-bestanden is het native binaire tensorflow-formaat voor het opslaan van gegevens (tensoren). Om het bestand te lezen, kunt u een code gebruiken die lijkt op het CSV-voorbeeld:

import tensorflow as tf
filename_queue = tf.train.string_input_producer(["file.tfrecord"], num_epochs=1)
reader = tf.TFRecordReader()
key, serialized_example = reader.read(filename_queue)

Vervolgens moet u de voorbeelden ontleden uit serialized_example Queue. U kunt dit doen met behulp van tf.parse_example , waarvoor eerdere batching nodig is, maar sneller is of tf.parse_single_example :

batch = tf.train.batch([serialized_example], batch_size=100)
parsed_batch = tf.parse_example(batch, features={
  "feature_name_1": tf.FixedLenFeature(shape=[1], tf.int64),
  "feature_name_2": tf.FixedLenFeature(shape=[1], tf.float32)
})

tf.train.batch voegt opeenvolgende waarden van gegeven tensoren van vorm [x, y, z] met tensoren van vorm [batch_size, x, y, z] . features dict wijst namen van de features toe aan tensorflow's definities van features . U gebruikt parse_single_example op een vergelijkbare manier:

parsed_example = tf.parse_single_example(serialized_example, {
  "feature_name_1": tf.FixedLenFeature(shape=[1], tf.int64),
  "feature_name_2": tf.FixedLenFeature(shape=[1], tf.float32)
})

tf.parse_example en tf.parse_single_example retourneren een functie voor het toewijzen van woordenboekwoorden aan de tensor met de waarden.

Om parse_single_example uit parse_single_example , moet u de tensoren uit het dict halen en tf.train.batch zoals eerder:

parsed_batch = dict(zip(parsed_example.keys(),
    tf.train.batch(parsed_example.values(), batch_size=100)

Je leest de gegevens als eerder en geeft de lijst van alle te evalueren tensoren door aan sess.run :

with tf.Session() as sess:
  sess.run(tf.initialize_local_variables())
  tf.train.start_queue_runners()
  try:
    while True:
      data_batch = sess.run(parsed_batch.values())
      # process data
  except tf.errors.OutOfRangeError:
    pass

Willekeurig schudden van de voorbeelden

Om de voorbeelden willekeurig te schudden, kunt u de functie tf.train.shuffle_batch gebruiken in plaats van tf.train.batch , als volgt:

parsed_batch = tf.train.shuffle_batch([serialized_example],
    batch_size=100, capacity=1000,
    min_after_dequeue=200)

tf.train.shuffle_batch (evenals tf.train.batch ) maakt een tf.Queue en voegt er steeds serialized_examples aan toe.

capacity meet hoeveel elementen in één keer in wachtrij kunnen worden opgeslagen. Grotere capaciteit leidt tot groter geheugengebruik, maar lagere latentie veroorzaakt door threads die wachten om het vol te maken.

min_after_dequeue is het minimum aantal elementen dat in de wachtrij aanwezig is nadat elementen min_after_dequeue zijn min_after_dequeue . De wachtrij shuffle_batch elementen niet perfect uniform - het is ontworpen met enorme gegevens, niet geschikt voor geheugen, in het achterhoofd. In plaats daarvan leest het tussen min_after_dequeue en capacity , slaat u ze op in het geheugen en kiest u er willekeurig een batch van. Daarna vraagt het om wat meer elementen, om zijn aantal tussen min_after_dequeue en capacity . Dus, hoe groter de waarde van min_after_dequeue , des te meer willekeurige elementen zijn - de keuze van batch_size elementen wordt gegarandeerd genomen uit ten minste min_after_dequeue opeenvolgende elementen, maar de grotere capacity moet zijn en hoe langer het duurt om de wachtrij aanvankelijk te vullen.

Gegevens lezen voor n tijdvakken met batching

Stel dat uw gegevensvoorbeelden al zijn gelezen in de variabele van een python en u wilt deze n keer lezen, in batches van een gegeven grootte:

import numpy as np
import tensorflow as tf
data = np.array([1, 2, 3, 4, 5])
n = 4

Om gegevens in batches samen te voegen, mogelijk met willekeurige shuffling, kunt u tf.train.batch of tf.train.batch_shuffle , maar u moet de tensor doorgeven die n keer volledige gegevens zou produceren:

limited_tensor = tf.train.limit_epochs(data, n)
batch = tf.train.shuffle_batch([limited_tensor], batch_size=3, enqueue_many=True, capacity=4)

De limit_epochs converteert de numpy array naar tensor onder de kap en retourneert een tensor die het n keer produceert en daarna een OutOfRangeError gooit. Het argument enqueue_many=True doorgegeven aan shuffle_batch geeft aan dat elke tensor in de shuffle_batch [limited_tensor] moet worden geïnterpreteerd als een aantal voorbeelden. Merk op dat de capaciteit van de batchwachtrij kleiner kan zijn dan het aantal voorbeelden in de tensor.

Men kan de gegevens zoals gewoonlijk verwerken:

with tf.Session() as sess:
  sess.run(tf.initialize_local_variables())
  tf.train.start_queue_runners()
  try:
    while True:
      data_batch = sess.run(batch)
      # process data
  except tf.errors.OutOfRangeError:
    pass

Afbeeldingen en labels laden vanuit een TXT-bestand

In de Tensorflow-documentatie is niet uitgelegd hoe afbeeldingen en labels rechtstreeks vanuit een TXT-bestand kunnen worden geladen. De onderstaande code illustreert hoe ik het heb bereikt. Dit betekent echter niet dat dit de beste manier is om dit te doen en dat het op deze manier helpt bij verdere stappen.

Ik laad bijvoorbeeld de labels in één geheel getal {0,1} terwijl de documentatie een één-hete vector [0,1] gebruikt.

# Learning how to import images and labels from a TXT file
#
# TXT file format
#
# path/to/imagefile_1 label_1
# path/to/imagefile_2 label_2
# ...                 ...
#
# where label_X is either {0,1}

#Importing Libraries
import os
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.python.framework import ops
from tensorflow.python.framework import dtypes

#File containing the path to images and the labels [path/to/images label]
filename = '/path/to/List.txt'

#Lists where to store the paths and labels
filenames = []
labels = []

#Reading file and extracting paths and labels
with open(filename, 'r') as File:
    infoFile = File.readlines() #Reading all the lines from File
    for line in infoFile: #Reading line-by-line
        words = line.split() #Splitting lines in words using space character as separator
        filenames.append(words[0])
        labels.append(int(words[1]))

NumFiles = len(filenames)

#Converting filenames and labels into tensors
tfilenames = ops.convert_to_tensor(filenames, dtype=dtypes.string)
tlabels = ops.convert_to_tensor(labels, dtype=dtypes.int32)

#Creating a queue which contains the list of files to read and the value of the labels
filename_queue = tf.train.slice_input_producer([tfilenames, tlabels], num_epochs=10, shuffle=True, capacity=NumFiles)

#Reading the image files and decoding them
rawIm= tf.read_file(filename_queue[0])
decodedIm = tf.image.decode_png(rawIm) # png or jpg decoder

#Extracting the labels queue
label_queue = filename_queue[1]

#Initializing Global and Local Variables so we avoid warnings and errors
init_op = tf.group(tf.local_variables_initializer() ,tf.global_variables_initializer())

#Creating an InteractiveSession so we can run in iPython
sess = tf.InteractiveSession()

with sess.as_default():
    sess.run(init_op)
    
    # Start populating the filename queue.
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)

    for i in range(NumFiles): #length of your filenames list
        nm, image, lb = sess.run([filename_queue[0], decodedIm, label_queue])
        
        print image.shape
        print nm
        print lb
        
        #Showing the current image
        plt.imshow(image)
        plt.show()

    coord.request_stop()
    coord.join(threads)


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow