Χρησιμοποιώντας tensorflow σύνολο δεδομένων με στρωματοποιημένη δειγματοληψία

ψήφοι
0

Λαμβάνοντας υπόψη ένα σύνολο δεδομένων tensorflow

Train_dataset = tf.data.Dataset.from_tensor_slices((Train_Image_Filenames,Train_Image_Labels))
Train_dataset = Train_dataset.map(Parse_JPEG_Augmented)
...

Θα ήθελα να διαστρωμάτωση παρτίδες μου να ασχοληθεί με την κατηγορία ανισορροπία. Βρήκα tf.contrib.training.stratified_sample και σκέφτηκα ότι θα μπορούσε να το χρησιμοποιήσει με τον ακόλουθο τρόπο:

Train_dataset_iter = Train_dataset.make_one_shot_iterator()
Train_dataset_Image_Batch,Train_dataset_Label_Batch = Train_dataset_iter.get_next()
Train_Stratified_Images,Train_Stratified_Labels = tf.contrib.training.stratified_sample(Train_dataset_Image_Batch,Train_dataset_Label_Batch,[1/Classes]*Classes,Batch_Size)

Αλλά δίνει το ακόλουθο μήνυμα λάθους και δεν είμαι σίγουρος ότι αυτό θα μου επιτρέψετε να κρατήσει τα οφέλη των επιδόσεων των tensorflow σύνολο δεδομένων, όπως μπορεί να είχα τότε πρέπει να περάσουν Train_Stratified_Imagesκαι Train_Stratified_Labelsμέσω feed_dict;

File /xxx/xxx/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/training/python/training/sampling_ops.py, line 192, in stratified_sample
with ops.name_scope(name, 'stratified_sample', list(tensors) + [labels]):
File /xxx/xxx/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py, line 459, in __iter__
Tensor objects are only iterable when eager execution is 
TypeError: Tensor objects are only iterable when eager execution is enabled. To iterate over this tensor use tf.map_fn.

Ποια θα ήταν η «καλύτερη πρακτική» τρόπο, χρησιμοποιώντας το σύνολο δεδομένων με στρωματοποιημένη παρτίδες;

Δημοσιεύθηκε 27/11/2018 στις 17:34
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
0

Εδώ είναι κάτω από ένα απλό παράδειγμα για να καταδείξει τη χρήση των sample_from_datasets (χάρη @Agade για την ιδέα).

import math
import tensorflow as tf


def print_dataset(name, dataset):
    elems = list(v.numpy() for v in dataset)
    print("Dataset {} contains {} elements :".format(name, len(elems)))
    print(elems)


N, M = 3, 10
even = tf.data.Dataset.range(0, 2*N, 2).repeat(count=int(math.ceil(M/N)))  # we repeat the smaller dataset so that the 2 datasets are about the same size
odd = tf.data.Dataset.range(1, 2*M, 2)
even_odd = tf.data.experimental.sample_from_datasets([even, odd])  # takes an element from dataset even with proba 0.5 or from odd with proba 0.5

print_dataset("even", even)
print_dataset("odd", odd)
print_dataset("even_odd_2xM", even_odd.take(2*M))  # use take to keep only the 2*M first elements
print_dataset("even_odd_all", even_odd)

Έξοδος:

Dataset even contains 12 elements :  
[0, 2, 4, 0, 2, 4, 0, 2, 4, 0, 2, 4]  
Dataset odd contains 10 elements :  
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]  
Dataset even_odd_2xM contains 20 elements :  
[1, 0, 3, 2, 5, 7, 4, 9, 0, 2, 11, 4, 0, 13, 15, 17, 19, 2, 4, 0]  
Dataset even_odd_all contains 22 elements :  
[1, 0, 3, 2, 5, 7, 4, 9, 0, 2, 11, 4, 0, 13, 15, 17, 19, 2, 4, 0, 2, 4]  
Απαντήθηκε 23/09/2019 στις 02:01
πηγή χρήστη

ψήφοι
0

Ψάχνω σε ένα παρόμοιο θέμα και βρήκα αυτό . Δεν το έχω δοκιμάσει σε αγωγό μου όμως. Ίσως αυτό θα λειτουργήσει για το σκοπό σας;

Απαντήθηκε 06/12/2018 στις 23:47
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more