*****************
***************正式训练的代码
dev_open_window(0, 0, 800, 600, 'black', WindowHandle)
set_font(WindowHandle, 'default-16')
TrainingErrors := []
ValidationErrors := []
LearningRates := []
Epochs := []
LossByIteration := []
MinValidationError := 1
NumBatchesInEpoch := int(floor(|TrainingImages| / real(BatchSize)))
PlottedIterations := round([NumBatchesInEpoch * [0:1:NumEpochs - 1], (NumBatchesInEpoch * NumEpochs) - 1])
select_percentage_dl_classifier_data (TrainingImages, TrainingLabels, 20, TrainingImagesSelected, TrainingLabelsSelected)
tuple_gen_sequence (0, |TrainingImages| - 1, 1, TrainSequence)
for Epoch := 0 to NumEpochs - 1 by 1
tuple_shuffle (TrainSequence, TrainSequence)
for Iteration := 0 to NumBatchesInEpoch - 1 by 1
* Select a shuffled batch every epoch
BatchStart := Iteration * BatchSize
BatchEnd := BatchStart + (BatchSize - 1)
BatchIndices := TrainSequence[BatchStart:BatchEnd]
BatchImageFiles := TrainingImages[BatchIndices]
BatchLabels := TrainingLabels[BatchIndices]
read_image (BatchImages, BatchImageFiles)
GenParamName := 'mirror'
GenParamValue := 'rc'
augment_images (BatchImages, BatchImages, GenParamName, GenParamValue)
train_dl_classifier_batch (BatchImages, DLModelHandle, BatchLabels, DLClassifierTrainResultHandle)
get_dl_classifier_train_result (DLClassifierTrainResultHandle, 'loss', Loss)
LossByIteration := [LossByIteration,Loss]
CurrentIteration := int(Iteration + (NumBatchesInEpoch * Epoch))
if (sum(CurrentIteration [==] PlottedIterations))
apply_dl_classifier_batchwise (TrainingImagesSelected, DLModelHandle, TrainingDLClassifierResultIDs, TrainingPredictedLabels, TrainingConfidences)
apply_dl_classifier_batchwise (ValidationImages, DLModelHandle, ValidationDLClassifierResultIDs, ValidationPredictedLabels, ValidationConfidences)
evaluate_dl_classifier (TrainingLabelsSelected, DLModelHandle, TrainingDLClassifierResultIDs, 'top1_error', 'global', TrainingTop1Error)
evaluate_dl_classifier (ValidationLabels, DLModelHandle, ValidationDLClassifierResultIDs, 'top1_error', 'global', ValidationTop1Error)
get_dl_classifier_param (DLModelHandle, 'learning_rate', LearningRate)
TrainingErrors := [TrainingErrors,TrainingTop1Error]
ValidationErrors := [ValidationErrors,ValidationTop1Error]
LearningRates := [LearningRates,LearningRate]
Epochs := [Epochs,PlottedIterations[|Epochs|] / real(NumBatchesInEpoch)]
plot_dl_classifier_training_progress (TrainingErrors, ValidationErrors, LearningRates, Epochs, NumEpochs, WindowHandle)
if (ValidationTop1Error <= MinValidationError)
write_dl_classifier (DLModelHandle, 'model_best.hdl')
MinValidationError := ValidationTop1Error
endif
endif
endfor
* Reduce the learning rate every nth epoch.
if ((Epoch + 1) % LearningRateStepEveryNthEpoch == 0)
* get_dl_classifier_param (DLModelHandle, 'learning_rate', LearningRate)
set_dl_classifier_param (DLModelHandle, 'learning_rate', LearningRate * LearningRateStepRatio)
get_dl_classifier_param (DLModelHandle, 'learning_rate', LearningRate)
endif
endfor
dump_window(WindowHandle, 'png', 'train')
PS:正常来说应该用的 损失函数来表示 什么训练结束,但是这个例子当中 是其他的
诡异
|