Skip to content

Commit 2da91ec

Browse files
author
Ronan Collobert
committed
corrected a bug in ClassMSECriterion, added AbsCriterion and measurers.
git-archimport-id: collober@idiap.ch--2004-torch/torch--devel--1.0--patch-73
1 parent 52954d7 commit 2da91ec

9 files changed

Lines changed: 470 additions & 1 deletion

‎gradients/T4AbsCriterion.h‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#import "T4Criterion.h"
2+
3+
@interface T4AbsCriterion : T4Criterion
4+
{
5+
BOOL averageWithNumberOfRows;
6+
BOOL averageWithNumberOfColumns;
7+
}
8+
9+
-initWithNumberOfInputs: (int)aNumInputs;
10+
11+
-setAveragesWithNumberOfRows: (BOOL)aFlag;
12+
-setAveragesWithNumberOfColumns: (BOOL)aFlag;
13+
14+
@end

‎gradients/T4AbsCriterion.m‎

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#import "T4AbsCriterion.h"
2+
3+
@implementation T4AbsCriterion
4+
5+
-initWithNumberOfInputs: (int)aNumInputs
6+
{
7+
if( (self = [super initWithNumberOfInputs: aNumInputs]) )
8+
{
9+
[self setAveragesWithNumberOfRows: YES];
10+
[self setAveragesWithNumberOfColumns: YES];
11+
}
12+
13+
return self;
14+
}
15+
16+
-(real)forwardExampleAtIndex: (int)anIndex inputs: (T4Matrix*)someInputs
17+
{
18+
T4Matrix *targets = [[dataset objectAtIndex: anIndex] objectAtIndex: 1];
19+
int numColumns = [someInputs numberOfColumns];
20+
int c, r;
21+
22+
output = 0;
23+
for(c = 0; c < numColumns; c++)
24+
{
25+
real *targetColumn = [targets columnAtIndex: c];
26+
real *inputColumn = [someInputs columnAtIndex: c];
27+
28+
for(r = 0; r < numInputs; r++)
29+
output += fabs(targetColumn[r] - inputColumn[r]);
30+
}
31+
32+
if(averageWithNumberOfRows)
33+
output /= (real)numInputs;
34+
35+
if(averageWithNumberOfColumns)
36+
output /= (real)numColumns;
37+
38+
return output;
39+
}
40+
41+
-(T4Matrix*)backwardExampleAtIndex: (int)anIndex inputs: (T4Matrix*)someInputs
42+
{
43+
T4Matrix *targets = [[dataset objectAtIndex: anIndex] objectAtIndex: 1];
44+
int numColumns = [someInputs numberOfColumns];
45+
real norm = 1.;
46+
int c, r;
47+
48+
[gradInputs resizeWithNumberOfColumns: numColumns];
49+
50+
if(averageWithNumberOfRows)
51+
norm /= (real)numInputs;
52+
53+
if(averageWithNumberOfColumns)
54+
norm /= (real)numColumns;
55+
56+
for(c = 0; c < numColumns; c++)
57+
{
58+
real *targetColumn = [targets columnAtIndex: c];
59+
real *inputColumn = [someInputs columnAtIndex: c];
60+
real *gradInputColumn = [gradInputs columnAtIndex: c];
61+
62+
for(r = 0; r < numInputs; r++)
63+
{
64+
real z = targetColumn[r] - inputColumn[r];
65+
if(z > 0)
66+
gradInputColumn[r] = -norm;
67+
else
68+
gradInputColumn[r] = norm;
69+
}
70+
}
71+
72+
return gradInputs;
73+
}
74+
75+
-setAveragesWithNumberOfRows: (BOOL)aFlag
76+
{
77+
averageWithNumberOfRows = aFlag;
78+
return self;
79+
}
80+
81+
-setAveragesWithNumberOfColumns: (BOOL)aFlag
82+
{
83+
averageWithNumberOfColumns = aFlag;
84+
return self;
85+
}
86+
87+
-initWithCoder: (NSCoder*)aCoder
88+
{
89+
self = [super initWithCoder: aCoder];
90+
[aCoder decodeValueOfObjCType: @encode(BOOL) at: &averageWithNumberOfRows];
91+
[aCoder decodeValueOfObjCType: @encode(BOOL) at: &averageWithNumberOfColumns];
92+
return self;
93+
}
94+
95+
-(void)encodeWithCoder: (NSCoder*)aCoder
96+
{
97+
[super encodeWithCoder: aCoder];
98+
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &averageWithNumberOfRows];
99+
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &averageWithNumberOfColumns];
100+
}
101+
102+
@end

‎gradients/T4ClassAbsCriterion.h‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#import "T4Criterion.h"
2+
#import "T4ClassFormat.h"
3+
4+
@interface T4ClassAbsCriterion : T4Criterion
5+
{
6+
T4ClassFormat *datasetClassFormat;
7+
T4ClassFormat *inputClassFormat;
8+
BOOL averageWithNumberOfRows;
9+
BOOL averageWithNumberOfColumns;
10+
}
11+
12+
-initWithDatasetClassFormat: (T4ClassFormat*)aClassFormat inputClassFormat: (T4ClassFormat*)anotherClassFormat;
13+
14+
-setAveragesWithNumberOfRows: (BOOL)aFlag;
15+
-setAveragesWithNumberOfColumns: (BOOL)aFlag;
16+
17+
@end

‎gradients/T4ClassAbsCriterion.m‎

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
#import "T4ClassAbsCriterion.h"
2+
3+
@implementation T4ClassAbsCriterion
4+
5+
-initWithDatasetClassFormat: (T4ClassFormat*)aClassFormat inputClassFormat: (T4ClassFormat*)anotherClassFormat
6+
{
7+
if( (self = [super initWithNumberOfInputs: [anotherClassFormat encodingSize]]) )
8+
{
9+
datasetClassFormat = [aClassFormat retainAndKeepWithAllocator: allocator];
10+
inputClassFormat = [anotherClassFormat retainAndKeepWithAllocator: allocator];
11+
[self setAveragesWithNumberOfRows: YES];
12+
[self setAveragesWithNumberOfColumns: YES];
13+
}
14+
15+
return self;
16+
}
17+
18+
-(real)forwardExampleAtIndex: (int)anIndex inputs: (T4Matrix*)someInputs
19+
{
20+
T4Matrix *targets = [[dataset objectAtIndex: anIndex] objectAtIndex: 1];
21+
int numColumns = [someInputs numberOfColumns];
22+
int c, r;
23+
24+
output = 0;
25+
for(c = 0; c < numColumns; c++)
26+
{
27+
real *targetColumn = [inputClassFormat encodingForClass: [datasetClassFormat classFromRealArray: [targets columnAtIndex: c]]];
28+
real *inputColumn = [someInputs columnAtIndex: c];
29+
30+
for(r = 0; r < numInputs; r++)
31+
output += fabs(targetColumn[r] - inputColumn[r]);
32+
}
33+
34+
if(averageWithNumberOfRows)
35+
output /= (real)numInputs;
36+
37+
if(averageWithNumberOfColumns)
38+
output /= (real)numColumns;
39+
40+
return output;
41+
}
42+
43+
-(T4Matrix*)backwardExampleAtIndex: (int)anIndex inputs: (T4Matrix*)someInputs
44+
{
45+
T4Matrix *targets = [[dataset objectAtIndex: anIndex] objectAtIndex: 1];
46+
int numColumns = [someInputs numberOfColumns];
47+
real norm = 1.;
48+
int c, r;
49+
50+
[gradInputs resizeWithNumberOfColumns: numColumns];
51+
52+
if(averageWithNumberOfRows)
53+
norm /= (real)numInputs;
54+
55+
if(averageWithNumberOfColumns)
56+
norm /= (real)numColumns;
57+
58+
for(c = 0; c < numColumns; c++)
59+
{
60+
real *targetColumn = [inputClassFormat encodingForClass: [datasetClassFormat classFromRealArray: [targets firstColumn]]];
61+
real *inputColumn = [someInputs columnAtIndex: c];
62+
real *gradInputColumn = [gradInputs columnAtIndex: c];
63+
64+
for(r = 0; r < numInputs; r++)
65+
{
66+
real z = targetColumn[r] - inputColumn[r];
67+
if(z > 0)
68+
gradInputColumn[r] = -norm;
69+
else
70+
gradInputColumn[r] = norm;
71+
}
72+
}
73+
74+
return gradInputs;
75+
}
76+
77+
-setAveragesWithNumberOfRows: (BOOL)aFlag
78+
{
79+
averageWithNumberOfRows = aFlag;
80+
return self;
81+
}
82+
83+
-setAveragesWithNumberOfColumns: (BOOL)aFlag
84+
{
85+
averageWithNumberOfColumns = aFlag;
86+
return self;
87+
}
88+
89+
-initWithCoder: (NSCoder*)aCoder
90+
{
91+
self = [super initWithCoder: aCoder];
92+
93+
datasetClassFormat = [[aCoder decodeObject] retainAndKeepWithAllocator: allocator];
94+
inputClassFormat = [[aCoder decodeObject] retainAndKeepWithAllocator: allocator];
95+
[aCoder decodeValueOfObjCType: @encode(BOOL) at: &averageWithNumberOfRows];
96+
[aCoder decodeValueOfObjCType: @encode(BOOL) at: &averageWithNumberOfColumns];
97+
98+
return self;
99+
}
100+
101+
-(void)encodeWithCoder: (NSCoder*)aCoder
102+
{
103+
[super encodeWithCoder: aCoder];
104+
105+
[aCoder encodeObject: datasetClassFormat];
106+
[aCoder encodeObject: inputClassFormat];
107+
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &averageWithNumberOfRows];
108+
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &averageWithNumberOfColumns];
109+
}
110+
111+
@end

‎gradients/T4ClassMSECriterion.m‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ @implementation T4ClassMSECriterion
44

55
-initWithDatasetClassFormat: (T4ClassFormat*)aClassFormat inputClassFormat: (T4ClassFormat*)anotherClassFormat
66
{
7-
if( (self = [super initWithNumberOfInputs: [inputClassFormat encodingSize]]) )
7+
if( (self = [super initWithNumberOfInputs: [anotherClassFormat encodingSize]]) )
88
{
99
datasetClassFormat = [aClassFormat retainAndKeepWithAllocator: allocator];
1010
inputClassFormat = [anotherClassFormat retainAndKeepWithAllocator: allocator];

‎measurers/T4AbsMeasurer.h‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#import "T4Measurer.h"
2+
#import "T4Matrix.h"
3+
4+
@interface T4AbsMeasurer : T4Measurer
5+
{
6+
T4Matrix *inputs;
7+
8+
BOOL averageWithNumberOfExamples;
9+
BOOL averageWithNumberOfRows;
10+
BOOL averageWithNumberOfColumns;
11+
real internalError;
12+
}
13+
14+
-initWithInputs: (T4Matrix*)someInputs dataset: (NSArray*)aDataset file: (T4File*)aFile;
15+
16+
-setAveragesWithNumberOfExamples: (BOOL)aFlag;
17+
-setAveragesWithNumberOfRows: (BOOL)aFlag;
18+
-setAveragesWithNumberOfColumns: (BOOL)aFlag;
19+
20+
@end

‎measurers/T4AbsMeasurer.m‎

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#import "T4AbsMeasurer.h"
2+
3+
@implementation T4AbsMeasurer
4+
5+
-initWithInputs: (T4Matrix*)someInputs dataset: (NSArray*)aDataset file: (T4File*)aFile
6+
{
7+
if( (self = [super initWithDataset: aDataset file: aFile]) )
8+
{
9+
inputs = someInputs;
10+
11+
[self setAveragesWithNumberOfExamples: YES];
12+
[self setAveragesWithNumberOfRows: YES];
13+
[self setAveragesWithNumberOfColumns: YES];
14+
[self reset];
15+
16+
[allocator retainAndKeepObject: inputs];
17+
}
18+
19+
return self;
20+
}
21+
22+
-measureExampleAtIndex: (int)anIndex
23+
{
24+
T4Matrix *targets = [[dataset objectAtIndex: anIndex] objectAtIndex: 1];
25+
int numColumns = [inputs numberOfColumns];
26+
int numRows = [inputs numberOfRows];
27+
int c, r;
28+
real currentError;
29+
30+
currentError = 0;
31+
for(c = 0; c < numColumns; c++)
32+
{
33+
real *targetColumn = [targets columnAtIndex: c];
34+
real *inputColumn = [inputs columnAtIndex: c];
35+
36+
for(r = 0; r < numRows; r++)
37+
currentError += fabs(targetColumn[r] - inputColumn[r]);
38+
}
39+
40+
if(averageWithNumberOfRows)
41+
currentError /= (real)numRows;
42+
43+
if(averageWithNumberOfColumns)
44+
currentError /= (real)numColumns;
45+
46+
internalError += currentError;
47+
48+
return self;
49+
}
50+
51+
-measureAtIteration: (int)anIteration
52+
{
53+
if(averageWithNumberOfExamples)
54+
internalError /= (real)[dataset count];
55+
56+
[file writeStringWithFormat: @"%g\n", internalError];
57+
[file synchronizeFile];
58+
59+
[self reset];
60+
61+
return self;
62+
}
63+
64+
-reset
65+
{
66+
internalError = 0;
67+
return self;
68+
}
69+
70+
-setAveragesWithNumberOfExamples: (BOOL)aFlag
71+
{
72+
averageWithNumberOfExamples = aFlag;
73+
return self;
74+
}
75+
76+
-setAveragesWithNumberOfRows: (BOOL)aFlag
77+
{
78+
averageWithNumberOfRows = aFlag;
79+
return self;
80+
}
81+
82+
-setAveragesWithNumberOfColumns: (BOOL)aFlag
83+
{
84+
averageWithNumberOfColumns = aFlag;
85+
return self;
86+
}
87+
88+
@end

‎measurers/T4ClassAbsMeasurer.h‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#import "T4Measurer.h"
2+
#import "T4Matrix.h"
3+
#import "T4ClassFormat.h"
4+
5+
@interface T4ClassAbsMeasurer : T4Measurer
6+
{
7+
T4Matrix *inputs;
8+
T4ClassFormat *inputClassFormat;
9+
T4ClassFormat *datasetClassFormat;
10+
11+
BOOL averageWithNumberOfExamples;
12+
BOOL averageWithNumberOfRows;
13+
BOOL averageWithNumberOfColumns;
14+
real internalError;
15+
}
16+
17+
-initWithInputs: (T4Matrix*)someInputs classFormat: (T4ClassFormat*)aClassFormat dataset: (NSArray*)aDataset classFormat: (T4ClassFormat*)anotherClassFormat file: (T4File*)aFile;
18+
19+
-setAveragesWithNumberOfExamples: (BOOL)aFlag;
20+
-setAveragesWithNumberOfRows: (BOOL)aFlag;
21+
-setAveragesWithNumberOfColumns: (BOOL)aFlag;
22+
23+
@end

0 commit comments

Comments
 (0)