Let's wrap up the overall discussion by watching the performance of our model. The following code is an overall glimpse:
package Yelp.Classifier
import Yelp.Preprocessor.CSVImageMetadataReader._
import Yelp.Preprocessor.featureAndDataAligner
import Yelp.Preprocessor.imageFeatureExtractor._
import Yelp.Evaluator.ResultFileGenerator._
import Yelp.Preprocessor.makeND4jDataSets._
import Yelp.Evaluator.ModelEvaluation._
import Yelp.Trainer.CNNEpochs._
import Yelp.Trainer.NeuralNetwork._
object YelpImageClassifier {
def main(args: Array[String]): Unit = {
// image processing on training data
val labelMap = readBusinessLabels("data/labels/train.csv")
val businessMap = readBusinessToImageLabels("data/labels/train_photo_to_biz_ids.csv")
val imgs = getImageIds("data/images/train/", businessMap,
businessMap.map(_._2).toSet.toList).slice(0,20000) // 20000 images
println("Image ID retreival done!")
val dataMap = processImages(imgs, resizeImgDim = 256)
println("Image processing done!")
val alignedData =
new featureAndDataAligner(dataMap, businessMap, Option(labelMap))()
println("Feature extraction done!")
// training one model for one class at a time. Many hyperparamters hardcoded within
val cnn0 = trainModelEpochs(alignedData, businessClass = 0, saveNN = "models/model0")
val cnn1 = trainModelEpochs(alignedData, businessClass = 1, saveNN = "models/model1")
val cnn2 = trainModelEpochs(alignedData, businessClass = 2, saveNN = "models/model2")
val cnn3 = trainModelEpochs(alignedData, businessClass = 3, saveNN = "models/model3")
val cnn4 = trainModelEpochs(alignedData, businessClass = 4, saveNN = "models/model4")
val cnn5 = trainModelEpochs(alignedData, businessClass = 5, saveNN = "models/model5")
val cnn6 = trainModelEpochs(alignedData, businessClass = 6, saveNN = "models/model6")
val cnn7 = trainModelEpochs(alignedData, businessClass = 7, saveNN = "models/model7")
val cnn8 = trainModelEpochs(alignedData, businessClass = 8, saveNN = "models/model8")
// processing test data for scoring
val businessMapTE = readBusinessToImageLabels("data/labels/test_photo_to_biz.csv")
val imgsTE = getImageIds("data/images/test//", businessMapTE,
businessMapTE.map(_._2).toSet.toList)
val dataMapTE = processImages(imgsTE, resizeImgDim = 128) // make them 256x256
val alignedDataTE = new featureAndDataAligner(dataMapTE, businessMapTE, None)()
// creating csv file to submit to kaggle (scores all models)
val Results = SubmitObj(alignedDataTE, "results/ModelsV0/")
val SubmitResults = writeSubmissionFile("kaggleSubmitFile.csv", Results, thresh = 0.9)
}
}
>>>
==========================Scores======================================
Accuracy: 0.6833
Precision: 0.53
Recall: 0.5222
F1 Score: 0.5261
======================================================================
So, what's your impression? It's true that we haven't received outstanding classification accuracy. But we can still try with tuned hyperparameters. The next section provides some insight.