2017-06-15 5 views
0

Je travaille actuellement sur la tâche de classification cats vs dogs sur kaggle en implémentant un convNet profond. Les lignes de code suivant est utilisé pour les données pré-traitement:Comment implémenter la fonction next_batch() pour les données personnalisées en python

def label_img(img): 
    word_label = img.split('.')[-3] 
    if word_label == 'cat': return [1,0] 
    elif word_label == 'dog': return [0,1] 

def create_train_data(): 
    training_data = [] 
    for img in tqdm(os.listdir(TRAIN_DIR)): 
     label = label_img(img) 
     path = os.path.join(TRAIN_DIR,img) 
     img = cv2.resize(cv2.imread(path,cv2.IMREAD_GRAYSCALE),IMG_SIZE,IMG_SIZE)) 
     training_data.append([np.array(img),np.array(label)]) 

    shuffle(training_data) 
    return training_data 

train_data = create_train_data() 

X_train = np.array([i[0] for i in train_data]).reshape(-1, IMG_SIZE,IMG_SIZE,1) 
Y_train =np.asarray([i[1] for i in train_data]) 

Je veux mettre en œuvre une fonction qui reproduit la fonction suivante fournie dans le tutoriel MNIST profond tensorflow

batch = mnist.train.next_batch(100) 

Répondre

0

Ce code est un bon exemple venir avec la fonction de générer des lots.

Pour expliquer brièvement, il vous suffit de venir avec deux tableaux pour x_train et y_train aimez:

batch_inputs = np.ndarray(shape=(batch_size), dtype=np.int32) 
    batch_labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32) 

et les données de la rame comme:

batch_inpouts[i] = ... 
    batch_labels[i, 0] = ... 

passer enfin l'ensemble des données à la session :

_, loss_val = session.run([optimizer, loss], feed_dict={train_inputs: batch_inputs, train_labels:batch_labels}) 
+0

Essayez-le. Merci pour votre temps. –

2

Outre la génération d'un lot, vous pouvez également réorganiser de manière aléatoire les données pour Chaque lot.

EPOCH = 100 
BATCH_SIZE = 128 
TRAIN_DATASIZE,_,_,_ = X_train.shape 
PERIOD = TRAIN_DATASIZE/BATCH_SIZE #Number of iterations for each epoch 

for e in range(EPOCH): 
    idxs = numpy.random.permutation(TRAIN_DATASIZE) #shuffled ordering 
    X_random = X_train[idxs] 
    Y_random = Y_train[idxs] 
    for i in range(PERIOD): 
     batch_X = X_random[i * BATCH_SIZE:(i+1) * BATCH_SIZE] 
     batch_Y = Y_random[i * BATCH_SIZE:(i+1) * BATCH_SIZE] 
     sess.run(train,feed_dict = {X: batch_X, Y:batch_Y}) 
+0

Merci beaucoup. Enfin, je peux former mon réseau correctement. –

+0

Pouvez-vous m'éclairer sur ce que le retour de tensorflow de next_batch()? S'agit-il d'une collecte aléatoire de données provenant de l'ensemble d'apprentissage de la taille de lot spécifiée? Si oui, assure-t-il la non-répétition? @Joshua Lim –

+0

next_batch() est une fonction spécifique au tutoriel MNIST fourni par tensorflow. Comment cela fonctionne est il randomise l'image de formation et les paires d'étiquettes au début, et sélectionne chaque 100 images suivantes chaque fois que la fonction est appelée. Une fois qu'il atteint la fin, les paires image-étiquette sont à nouveau randomisées, et le processus est répété. L'ensemble de données entier est seulement réorganisé et répété une fois que toutes les paires disponibles sont utilisées. –