Skip to content

Commit 97b21d5

Browse files
Coded #77.
1 parent 9664efc commit 97b21d5

File tree

5 files changed

+581
-0
lines changed

5 files changed

+581
-0
lines changed

examples/ResNet/CaiResNet20.lpi

+174
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<CONFIG>
3+
<ProjectOptions>
4+
<Version Value="11"/>
5+
<PathDelim Value="\"/>
6+
<General>
7+
<Flags>
8+
<MainUnitHasCreateFormStatements Value="False"/>
9+
</Flags>
10+
<SessionStorage Value="InProjectDir"/>
11+
<MainUnit Value="0"/>
12+
<Title Value="CIFAR-10 Classification Example"/>
13+
<UseAppBundle Value="False"/>
14+
<ResourceType Value="res"/>
15+
</General>
16+
<i18n>
17+
<EnableI18N LFM="False"/>
18+
</i18n>
19+
<BuildModes Count="3">
20+
<Item1 Name="Default" Default="True"/>
21+
<Item2 Name="Debug">
22+
<CompilerOptions>
23+
<Version Value="11"/>
24+
<PathDelim Value="\"/>
25+
<Target>
26+
<Filename Value="..\..\bin\$(TargetCPU)-$(TargetOS)\bin\CaiResNet20"/>
27+
</Target>
28+
<SearchPaths>
29+
<IncludeFiles Value="..\..\neural;$(ProjOutDir)"/>
30+
<OtherUnitFiles Value="..\..\neural;$(LazarusDir)\lcl\units\$(TargetCPU)-$(TargetOS);$(LazarusDir)\components\lazutils\lib\$(TargetCPU)-$(TargetOS)"/>
31+
<UnitOutputDirectory Value="..\..\bin\$(TargetCPU)-$(TargetOS)\units"/>
32+
</SearchPaths>
33+
<Parsing>
34+
<SyntaxOptions>
35+
<IncludeAssertionCode Value="True"/>
36+
</SyntaxOptions>
37+
</Parsing>
38+
<CodeGeneration>
39+
<Checks>
40+
<IOChecks Value="True"/>
41+
<RangeChecks Value="True"/>
42+
<OverflowChecks Value="True"/>
43+
<StackChecks Value="True"/>
44+
</Checks>
45+
<VerifyObjMethodCallValidity Value="True"/>
46+
</CodeGeneration>
47+
<Linking>
48+
<Debugging>
49+
<DebugInfoType Value="dsDwarf2Set"/>
50+
<UseValgrind Value="True"/>
51+
<UseExternalDbgSyms Value="True"/>
52+
</Debugging>
53+
</Linking>
54+
<Other>
55+
<CustomOptions Value="-dDebug
56+
-dAVX"/>
57+
<OtherDefines Count="3">
58+
<Define0 Value="Debug"/>
59+
<Define1 Value="AVX"/>
60+
<Define2 Value="MakeQuick"/>
61+
</OtherDefines>
62+
</Other>
63+
</CompilerOptions>
64+
</Item2>
65+
<Item3 Name="Release">
66+
<CompilerOptions>
67+
<Version Value="11"/>
68+
<PathDelim Value="\"/>
69+
<Target>
70+
<Filename Value="..\..\bin\$(TargetCPU)-$(TargetOS)\bin\CaiResNet20"/>
71+
</Target>
72+
<SearchPaths>
73+
<IncludeFiles Value="..\..\neural;$(ProjOutDir)"/>
74+
<OtherUnitFiles Value="..\..\neural;$(LazarusDir)\lcl\units\$(TargetCPU)-$(TargetOS);$(LazarusDir)\components\lazutils\lib\$(TargetCPU)-$(TargetOS)"/>
75+
<UnitOutputDirectory Value="..\..\bin\$(TargetCPU)-$(TargetOS)\units"/>
76+
</SearchPaths>
77+
<CodeGeneration>
78+
<SmartLinkUnit Value="True"/>
79+
<Optimizations>
80+
<OptimizationLevel Value="3"/>
81+
</Optimizations>
82+
</CodeGeneration>
83+
<Linking>
84+
<Debugging>
85+
<GenerateDebugInfo Value="False"/>
86+
</Debugging>
87+
<LinkSmart Value="True"/>
88+
</Linking>
89+
<Other>
90+
<CustomOptions Value="-dRelease
91+
-dAVX"/>
92+
<OtherDefines Count="5">
93+
<Define0 Value="Release"/>
94+
<Define1 Value="Debug"/>
95+
<Define2 Value="CheckRange"/>
96+
<Define3 Value="AVX2"/>
97+
<Define4 Value="AVX"/>
98+
</OtherDefines>
99+
</Other>
100+
</CompilerOptions>
101+
</Item3>
102+
</BuildModes>
103+
<PublishOptions>
104+
<Version Value="2"/>
105+
</PublishOptions>
106+
<RunParams>
107+
<local>
108+
<CommandLineParams Value="-a 3"/>
109+
</local>
110+
<FormatVersion Value="2"/>
111+
<Modes Count="1">
112+
<Mode0 Name="default">
113+
<local>
114+
<CommandLineParams Value="-a 3"/>
115+
</local>
116+
</Mode0>
117+
</Modes>
118+
</RunParams>
119+
<RequiredPackages Count="1">
120+
<Item1>
121+
<PackageName Value="multithreadprocslaz"/>
122+
</Item1>
123+
</RequiredPackages>
124+
<Units Count="1">
125+
<Unit0>
126+
<Filename Value="CaiResNet20.lpr"/>
127+
<IsPartOfProject Value="True"/>
128+
</Unit0>
129+
</Units>
130+
</ProjectOptions>
131+
<CompilerOptions>
132+
<Version Value="11"/>
133+
<PathDelim Value="\"/>
134+
<Target>
135+
<Filename Value="..\..\bin\$(TargetCPU)-$(TargetOS)\bin\CaiResNet20"/>
136+
</Target>
137+
<SearchPaths>
138+
<IncludeFiles Value="..\..\neural;$(ProjOutDir)"/>
139+
<OtherUnitFiles Value="..\..\neural;$(LazarusDir)\lcl\units\$(TargetCPU)-$(TargetOS);$(LazarusDir)\components\lazutils\lib\$(TargetCPU)-$(TargetOS)"/>
140+
<UnitOutputDirectory Value="..\..\bin\$(TargetCPU)-$(TargetOS)\units"/>
141+
</SearchPaths>
142+
<CodeGeneration>
143+
<Optimizations>
144+
<OptimizationLevel Value="3"/>
145+
</Optimizations>
146+
</CodeGeneration>
147+
<Linking>
148+
<Debugging>
149+
<GenerateDebugInfo Value="False"/>
150+
</Debugging>
151+
</Linking>
152+
<Other>
153+
<CustomOptions Value="-dAVX
154+
-dRelease"/>
155+
<OtherDefines Count="2">
156+
<Define0 Value="AVX"/>
157+
<Define1 Value="Release"/>
158+
</OtherDefines>
159+
</Other>
160+
</CompilerOptions>
161+
<Debugging>
162+
<Exceptions Count="3">
163+
<Item1>
164+
<Name Value="EAbort"/>
165+
</Item1>
166+
<Item2>
167+
<Name Value="ECodetoolError"/>
168+
</Item2>
169+
<Item3>
170+
<Name Value="EFOpenError"/>
171+
</Item3>
172+
</Exceptions>
173+
</Debugging>
174+
</CONFIG>

examples/ResNet/CaiResNet20.lpr

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
program CaiResNet20;
2+
(*
3+
Coded by Joao Paulo Schwarz Schuler.
4+
https://github.com/joaopauloschuler/neural-api
5+
*)
6+
{$mode objfpc}{$H+}
7+
8+
uses {$IFDEF UNIX} {$IFDEF UseCThreads}
9+
cthreads, {$ENDIF} {$ENDIF}
10+
Classes, SysUtils, CustApp, neuralnetwork, neuralvolume,
11+
Math, neuraldatasets, neuralfit, neuralthread;
12+
13+
type
14+
TTestCNNAlgo = class(TCustomApplication)
15+
protected
16+
procedure DoRun; override;
17+
end;
18+
19+
const
20+
// Padding and cropping constants.
21+
csPadding = 4;
22+
csCropSize = csPadding * 2;
23+
24+
procedure CaiOptimizedResnetUnit(pNN: TNNet; pNeurons: integer);
25+
var
26+
PreviousLayer, ShortCut, LongPath: TNNetLayer;
27+
Stride: integer;
28+
begin
29+
PreviousLayer := pNN.GetLastLayer();
30+
if PreviousLayer.Output.Depth = pNeurons
31+
then Stride := 1
32+
else Stride := 2;
33+
LongPath := pNN.AddLayer([
34+
TNNetConvolutionLinear.Create(pNeurons, {featuresize}3, {padding}1, Stride),
35+
TNNetReLU.Create(),
36+
TNNetConvolutionLinear.Create(pNeurons, {featuresize}3, {padding}1, {stride}1),
37+
TNNetReLUL.Create(-3, 3, 0)
38+
]);
39+
if PreviousLayer.Output.Depth = pNeurons then
40+
begin
41+
pNN.AddLayer( TNNetSum.Create([PreviousLayer, LongPath]) );
42+
end
43+
else
44+
begin
45+
ShortCut := pNN.AddLayerAfter([
46+
TNNetConvolutionReLU.Create(pNeurons, {featuresize}3, {padding}1, Stride)
47+
], PreviousLayer);
48+
pNN.AddLayer( TNNetSum.Create([ShortCut, LongPath]) );
49+
end;
50+
end;
51+
52+
procedure TTestCNNAlgo.DoRun;
53+
var
54+
NN: THistoricalNets;
55+
NeuralFit: TNeuralImageFit;
56+
ImgTrainingVolumes, ImgValidationVolumes, ImgTestVolumes: TNNetVolumeList;
57+
ModuleCount, ModuleNumber: integer;
58+
begin
59+
ModuleNumber := 3;
60+
if not CheckCIFARFile() then
61+
begin
62+
Terminate;
63+
exit;
64+
end;
65+
WriteLn('Creating Neural Network...');
66+
NN := THistoricalNets.Create();
67+
NN.AddLayer(TNNetInput.Create(32, 32, 3));
68+
NN.AddLayer([
69+
TNNetConvolutionLinear.Create({neurons=}16, {featuresize}3, {padding}1, {stride}1),
70+
TNNetReLU6.Create()
71+
]);
72+
for ModuleCount := 1 to ModuleNumber do CaiOptimizedResnetUnit(NN, 16);
73+
for ModuleCount := 1 to ModuleNumber do CaiOptimizedResnetUnit(NN, 32);
74+
for ModuleCount := 1 to ModuleNumber do CaiOptimizedResnetUnit(NN, 64);
75+
76+
NN.AddLayer([
77+
TNNetAvgChannel.Create(),
78+
TNNetFullConnectLinear.Create(10), // The original implementation uses avg pooling.
79+
TNNetSoftMax.Create()
80+
]);
81+
82+
NN.DebugStructure();
83+
CreateCifar10Volumes(ImgTrainingVolumes, ImgValidationVolumes,
84+
ImgTestVolumes, csEncodeRGB, {ValidationSampleSize=}2000);
85+
86+
// Add padding to dataset
87+
WriteLn
88+
(
89+
'Original image size: ',
90+
ImgTrainingVolumes[0].SizeX,',',
91+
ImgTrainingVolumes[0].SizeY,' px.'
92+
);
93+
ImgTrainingVolumes.AddPadding(csPadding);
94+
ImgValidationVolumes.AddPadding(csPadding);
95+
ImgTestVolumes.AddPadding(csPadding);
96+
WriteLn
97+
(
98+
'New image size after padding: ',
99+
ImgTrainingVolumes[0].SizeX,',',
100+
ImgTrainingVolumes[0].SizeY,' px.'
101+
);
102+
103+
NeuralFit := TNeuralImageFit.Create;
104+
// Enable cropping while fitting.
105+
NeuralFit.HasImgCrop := true;
106+
NeuralFit.MaxCropSize := csCropSize;
107+
NeuralFit.FileNameBase := 'SimpleImageClassifier-'+IntToStr(GetProcessId());
108+
NeuralFit.InitialLearningRate := 0.001;
109+
NeuralFit.LearningRateDecay := 0.01;
110+
NeuralFit.StaircaseEpochs := 10;
111+
NeuralFit.Inertia := 0.9;
112+
NeuralFit.L2Decay := 0.00001;
113+
NeuralFit.Fit(NN, ImgTrainingVolumes, ImgValidationVolumes, ImgTestVolumes, {NumClasses=}10, {batchsize=}32, {epochs=}50);
114+
NeuralFit.Free;
115+
ReadLn();
116+
NN.Free;
117+
ImgTestVolumes.Free;
118+
ImgValidationVolumes.Free;
119+
ImgTrainingVolumes.Free;
120+
Terminate;
121+
end;
122+
123+
var
124+
Application: TTestCNNAlgo;
125+
begin
126+
Application := TTestCNNAlgo.Create(nil);
127+
Application.Title:='CIFAR-10 Classification Example';
128+
Application.Run;
129+
Application.Free;
130+
end.

0 commit comments

Comments
 (0)