[ti-machine-learning/ti-machine-learning.git] / src / app / cnn / scene / appCNNSceneSupervisedTraining.c
diff --git a/src/app/cnn/scene/appCNNSceneSupervisedTraining.c b/src/app/cnn/scene/appCNNSceneSupervisedTraining.c
index 5c4a79fddd1d32b9f1e589be1297844421981628..8ed1e9c50f56116dd43077064545705936cfbdfc 100644 (file)
int i;
int j;
+ int index;
int err;
timlCNNLayer *bpStartLayer;
- int label;
+ int *label;
+ int labelTemp;
int iter;
int patchDim;
int *imageIdx;
@@ -69,10 +71,10 @@ int appCNNSceneSupervisedTraining(timlConvNeuralNetwork *cnn, appCNNSceneDataSet
int *colIdx;
float *patch;
int epoch;
- int batchSize;
+ int batchUpdate;
int batchNum;
- float *cost;
- float *batchCost;
+ float cost;
+ float batchCost;
int batchIndex;
// init
@@ -82,38 +84,33 @@ int appCNNSceneSupervisedTraining(timlConvNeuralNetwork *cnn, appCNNSceneDataSet
imageIdx = malloc(sizeof(int)*iter);
rowIdx = malloc(sizeof(int)*iter);
colIdx = malloc(sizeof(int)*iter);
- patch = malloc(sizeof(float)*patchDim);
+ patch = malloc(sizeof(float)*patchDim*cnn->params.batchUpdate);
+ label = malloc(sizeof(int)*cnn->params.batchUpdate);
epoch = cnn->params.epoch;
- batchSize = cnn->params.batchSize;
- batchNum = iter/batchSize;
- cost = malloc(sizeof(float)*batchSize);
- batchCost = malloc(sizeof(float)*batchNum*epoch);
+ batchUpdate = cnn->params.batchUpdate;
+ batchNum = iter/batchUpdate;
batchIndex = 0;
+ batchCost = 0;
+ index = 0;
// shuffle the training pixels
appCNNSceneShuffleIdx(imageIdx, rowIdx, colIdx, dataSet);
// training loop
- cnn->params.count = 0;
+
for (i = 0; i < epoch; i++) {
- cnn->params.count = 0;
for (j = 0; j < iter; j++) {
- label = appCNNSceneGetLabel(imageIdx[j], rowIdx[j], colIdx[j], dataSet);
- if (label != -1) {
- cnn->params.count += 1;
- appCNNSceneGetPatch(imageIdx[j], rowIdx[j], colIdx[j], dataSet, patch);
- err = timlCNNForwardPropagation(cnn, patch, patchDim);
- timlCNNCostWithLabel(cnn, label, cost + j%batchSize, &bpStartLayer);
- err = timlCNNBackPropagation(cnn, bpStartLayer);
- }
- else {
- cost[j%batchSize] = 0.0;
+ labelTemp = appCNNSceneGetLabel(imageIdx[j], rowIdx[j], colIdx[j], dataSet);
+ // make image and label batch
+ if (labelTemp != -1) {
+ label[index] = labelTemp;
+ appCNNSceneGetPatch(imageIdx[j], rowIdx[j], colIdx[j], dataSet, patch + index*patchDim);
+ index ++;
}
- if ((j + 1)%batchSize == 0) { // update parameters once each batch
- batchCost[batchIndex + i*batchNum] = timlUtilVectorSumFloat(cost, batchSize)/(double)cnn->params.count;
- timlCNNUpdateParams(cnn);
- printf("epoch = %d, batch = %d, cost = %f\n", i, batchIndex, batchCost[batchIndex + i*batchNum]);
- batchIndex += 1;
+ // call cnn training
+ if (index == cnn->params.batchUpdate) {
+ timlCNNSupervisedTrainingWithLabel(cnn, patch, dataSet->patchSize, dataSet->patchSize, dataSet->channel, label, 1, 1, cnn->params.batchUpdate);
+ index = 0;
}
}
}
@@ -121,8 +118,6 @@ int appCNNSceneSupervisedTraining(timlConvNeuralNetwork *cnn, appCNNSceneDataSet
free(imageIdx);
free(rowIdx);
free(colIdx);
- free(cost);
- free(batchCost);
return err;