Beim Umgang mit einer großen Anzahl von Bilddateien in einer maschinellen Lernaufgabe ist es üblich, die Dateinamen aufzulisten und die Bilder während des Trainingsprozesses nacheinander zu lesen. Aufgrund der Beziehung zwischen der Anzahl der vorbereiteten Proben und der Mini-Batch-Größe im Lernprozess werden in der zweiten Hälfte des Lernens unvermeidlich Brüche erzeugt, und die Handhabung ist tendenziell kompliziert.
Zum Beispiel, wenn die Anzahl der Datenproben num = 100 und die Mini-Batch-Größe batch_size = 30 ist
Die Methode von ist denkbar. Wenn die Anzahl der Proben groß ist, ist die obige Option 1 in Ordnung. Wenn Sie die Trainingsdaten jedoch sorgfältig verwenden möchten, sollten Sie die Optionen 2 und 3 auswählen.
Hier werden wir die Methode von Option 3 mit deque implementieren.
Die Erklärung wird aus dem einleitenden Python3 zitiert.
deque (ausgesprochenes Deck) ist an beiden Enden ein Cue und hat die Funktionen von Stack und Cue. Dies ist nützlich, wenn Sie Elemente an beiden Enden der Sequenz hinzufügen oder entfernen möchten.
Diese Erklärung ist unten dargestellt.
Dieses Mal wurde die Funktion von deque.rotate () für die "Wiederverwendung der Datenprobe" verwendet. (Der Vorgang "Drehen, wenn Daten verwendet werden, Drehen, wenn Daten verwendet werden, ..." wird ausgeführt.)
Stellen Sie sich den Fall vor, in dem die Datendatei wie folgt erweitert wird.
$ ls deque_ex/*.jpg
deque_ex/img_0.jpg deque_ex/img_3.jpg deque_ex/img_6.jpg deque_ex/img_9.jpg
deque_ex/img_1.jpg deque_ex/img_4.jpg deque_ex/img_7.jpg
deque_ex/img_2.jpg deque_ex/img_5.jpg deque_ex/img_8.jpg
Erstellen Sie zunächst eine Liste (Deck) der zu behandelnden Dateinamen.
import glob
from collections import deque
import numpy as np
def mk_list():
fname_list = glob.glob('*.jpg')
sorted_fn = sorted(fname_list)
deq_fname = deque()
deq_fname.extend(sorted_fn) # 'extend' is right,
# 'append' is not good.
return deq_fname
Der Punkt ist, deque.extend () anstelle von deque.append () zu verwenden, wenn Sie dem Deck eine Liste hinzufügen.
>>>
deque(['img_0.jpg',
'img_1.jpg',
'img_2.jpg',
'img_3.jpg',
'img_4.jpg',
'img_5.jpg',
'img_6.jpg',
'img_7.jpg',
'img_8.jpg',
'img_9.jpg'])
Die Funktion, die Daten aus der Datenliste (um genau zu sein die Deque-Klasse) und die Anzahl der Anforderungen zurückgibt, lautet wie folgt. (Verwenden Sie List Slices und deque.rotate ().)
def feed_fn_ver0(dq, num):
feed = list(dq)[-num:]
dq.rotate(num)
return feed
Die Situation, in der 3 Datenproben 5 Mal damit entnommen wurden, ist wie folgt.
0: ['img_7.jpg', 'img_8.jpg', 'img_9.jpg']
1: ['img_4.jpg', 'img_5.jpg', 'img_6.jpg']
2: ['img_1.jpg', 'img_2.jpg', 'img_3.jpg']
3: ['img_8.jpg', 'img_9.jpg', 'img_0.jpg']
4: ['img_5.jpg', 'img_6.jpg', 'img_7.jpg']
Wir konnten 3 Proben vom Ende des Datendecks abrufen. Es ist kein Problem, es in einem maschinellen Lernprozess zu verwenden, der sich nicht um die Reihenfolge kümmert, aber da "von Ende" etwas unangenehm ist, habe ich es auf "von Anfang an" korrigiert und als nächstes die erforderliche Datenlänge überprüft. Code.
def feed_fn_ver1(dq, num):
'''
dq : data source (deque)
num : request size (int)
'''
# check length
assert num <= len(dq)
feed = list(dq)[:num]
dq.rotate(-num)
return feed
my_list = mk_list()
for i in range(5):
print(' Feed [', i, ']: ', feed_fn_ver1(my_list, 3))
>>>
Feed [ 0 ]: ['img_0.jpg', 'img_1.jpg', 'img_2.jpg']
Feed [ 1 ]: ['img_3.jpg', 'img_4.jpg', 'img_5.jpg']
Feed [ 2 ]: ['img_6.jpg', 'img_7.jpg', 'img_8.jpg']
Feed [ 3 ]: ['img_9.jpg', 'img_0.jpg', 'img_1.jpg']
Feed [ 4 ]: ['img_2.jpg', 'img_3.jpg', 'img_4.jpg']
Es hat gut funktioniert. Die zufällig gemischten Daten sind wie folgt.
def mk_list_shuffle():
fname_list = glob.glob('*.jpg')
np_list_fn = np.array(fname_list)
np.random.shuffle(np_list_fn)
deq_fname = deque()
deq_fname.extend(list(np_list_fn))
return deq_fname
my_list = mk_list_shuffle()
for i in range(5):
print(' Feed [', i, ']: ', feed_fn_ver1(my_list, 3))
>>>
Feed [ 0 ]: ['img_9.jpg', 'img_7.jpg', 'img_6.jpg']
Feed [ 1 ]: ['img_1.jpg', 'img_8.jpg', 'img_3.jpg']
Feed [ 2 ]: ['img_4.jpg', 'img_0.jpg', 'img_2.jpg']
Feed [ 3 ]: ['img_5.jpg', 'img_9.jpg', 'img_7.jpg']
Feed [ 4 ]: ['img_6.jpg', 'img_1.jpg', 'img_8.jpg']
Es ist ein wenig schwer zu verstehen, aber wenn Sie blinzeln, können Sie sehen, dass die Daten durch ordnungsgemäße Zirkulation geliefert werden können. Mit dieser Funktion (feed_fn_ver1 ()) sollte der Trainingsprozess für maschinelles Lernen einfach sein.
(Der obige Code wurde in der Umgebung von Python 2.7.11 und Python 3.5.1 bestätigt.)
Recommended Posts