मेरे पास 8000 फ्रेम का वीडियो है, और मैं प्रत्येक 200 फ्रेम के बैचों पर एक केरा मॉडल को प्रशिक्षित करना चाहता हूं। मेरे पास एक फ्रेम जनरेटर है जो वीडियो फ्रेम-दर-फ्रेम के माध्यम से loops और आकार (200, 3, 480, 640)
आकार (0 बैच आकार, आरजीबी, फ्रेम ऊंचाई, फ्रेम चौड़ाई) के एक numpy मैट्रिक्स X
में (3 x 480 x 640) फ्रेम जमा करता है - और पैदावार X
और Y
हर 200 वीं फ्रेम:केरास - fit_generator() में बैचों और युग का उपयोग कैसे किया जाता है?
import cv2
...
def _frameGenerator(videoPath, dataPath, batchSize):
"""
Yield X and Y data when the batch is filled.
"""
camera = cv2.VideoCapture(videoPath)
width = camera.get(3)
height = camera.get(4)
frameCount = int(camera.get(7)) # Number of frames in the video file.
truthData = _prepData(dataPath, frameCount)
X = np.zeros((batchSize, 3, height, width))
Y = np.zeros((batchSize, 1))
batch = 0
for frameIdx, truth in enumerate(truthData):
ret, frame = camera.read()
if ret is False: continue
batchIndex = frameIdx%batchSize
X[batchIndex] = frame
Y[batchIndex] = truth
if batchIndex == 0 and frameIdx != 0:
batch += 1
print "now yielding batch", batch
yield X, Y
यहाँ है कैसे fit_generator()
चलाएँ:
batchSize = 200
print "Starting training..."
model.fit_generator(
_frameGenerator(videoPath, dataPath, batchSize),
samples_per_epoch=8000,
nb_epoch=10,
verbose=args.verbosity
)
मेरे समझ एक युग खत्म जब samples_per_epoch
नमूने मॉडल के आधार पर देखा गया है है, और samples_per_epoch
= बैच का आकार * बैचों की संख्या = 200 * 40। तो फ्रेम 0-79 99 पर एक युग के लिए प्रशिक्षण के बाद, अगला युग फ्रेम 0 से फिर से प्रशिक्षण शुरू कर देगा। क्या यह सही है?
इस सेटअप के साथ मुझे जनरेटर से 40 बैचों (200 फ्रेम प्रत्येक) को fit_generator
पर प्रति युग की उम्मीद है; यह 8000 कुल फ्रेम प्रति युग होगा - यानी samples_per_epoch=8000
। फिर बाद के युगों के लिए, fit_generator
जेनरेटर को फिर से शुरू करेगा जैसे कि हम वीडियो की शुरुआत से फिर से प्रशिक्षण शुरू करते हैं। फिर भी यह मामला नहीं है। पहला युग पूरा होने के बाद (मॉडल लॉग 0-24 बैचों के बाद), जेनरेटर जहां इसे छोड़ दिया जाता है वहां उठाता है। क्या नया युग प्रशिक्षण डेटासेट की शुरुआत से फिर से शुरू नहीं होना चाहिए?
यदि fit_generator
की मेरी समझ में कुछ गड़बड़ है तो कृपया समझाएं। मैं प्रलेखन के माध्यम से चला गया है, यह example, और ये relatedissues। मैं टेन्सोरफ्लो बैकएंड के साथ केरास v1.0.7 का उपयोग कर रहा हूं। यह समस्या Keras repo में भी पोस्ट की गई है।
एक अस्थायी फिक्स के रूप में मैं मैन्युअल रूप से युगों पर पुन: प्रयास कर रहा हूं और 'model.fit()' को कॉल कर रहा हूं, जैसा कि यहां दिखाया गया है: https://github.com/fchollet/keras/issues/107 – BoltzmannBrain