diff --git a/examples/SimpleImageClassifier/SimpleImageClassifierPaddingCroppingSwish.lpi b/examples/SimpleImageClassifier/SimpleImageClassifierPaddingCroppingSwish.lpi new file mode 100644 index 00000000..55bf4754 --- /dev/null +++ b/examples/SimpleImageClassifier/SimpleImageClassifierPaddingCroppingSwish.lpi @@ -0,0 +1,174 @@ + + + + + + + + + + + + + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <i18n> + <EnableI18N LFM="False"/> + </i18n> + <BuildModes Count="3"> + <Item1 Name="Default" Default="True"/> + <Item2 Name="Debug"> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="..\..\bin\$(TargetCPU)-$(TargetOS)\bin\SimpleImageClassifierPaddingCroppingSwish"/> + </Target> + <SearchPaths> + <IncludeFiles Value="..\..\neural;$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\neural;$(LazarusDir)\lcl\units\$(TargetCPU)-$(TargetOS);$(LazarusDir)\components\lazutils\lib\$(TargetCPU)-$(TargetOS)"/> + <UnitOutputDirectory Value="..\..\bin\$(TargetCPU)-$(TargetOS)\units"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <IncludeAssertionCode Value="True"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <Checks> + <IOChecks Value="True"/> + <RangeChecks Value="True"/> + <OverflowChecks Value="True"/> + <StackChecks Value="True"/> + </Checks> + <VerifyObjMethodCallValidity Value="True"/> + </CodeGeneration> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf2Set"/> + <UseValgrind Value="True"/> + <UseExternalDbgSyms Value="True"/> + </Debugging> + </Linking> + <Other> + <CustomOptions Value="-dDebug +-dAVX"/> + <OtherDefines Count="3"> + <Define0 Value="Debug"/> + <Define1 Value="AVX"/> + <Define2 Value="MakeQuick"/> + </OtherDefines> + </Other> + </CompilerOptions> + </Item2> + <Item3 Name="Release"> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="..\..\bin\$(TargetCPU)-$(TargetOS)\bin\SimpleImageClassifierPaddingCroppingSwish"/> + </Target> + <SearchPaths> + <IncludeFiles Value="..\..\neural;$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\neural;$(LazarusDir)\lcl\units\$(TargetCPU)-$(TargetOS);$(LazarusDir)\components\lazutils\lib\$(TargetCPU)-$(TargetOS)"/> + <UnitOutputDirectory Value="..\..\bin\$(TargetCPU)-$(TargetOS)\units"/> + </SearchPaths> + <CodeGeneration> + <SmartLinkUnit Value="True"/> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + </Debugging> + <LinkSmart Value="True"/> + </Linking> + <Other> + <CustomOptions Value="-dRelease +-dAVX"/> + <OtherDefines Count="5"> + <Define0 Value="Release"/> + <Define1 Value="Debug"/> + <Define2 Value="CheckRange"/> + <Define3 Value="AVX2"/> + <Define4 Value="AVX"/> + </OtherDefines> + </Other> + </CompilerOptions> + </Item3> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + </PublishOptions> + <RunParams> + <local> + <CommandLineParams Value="-a 3"/> + </local> + <FormatVersion Value="2"/> + <Modes Count="1"> + <Mode0 Name="default"> + <local> + <CommandLineParams Value="-a 3"/> + </local> + </Mode0> + </Modes> + </RunParams> + <RequiredPackages Count="1"> + <Item1> + <PackageName Value="multithreadprocslaz"/> + </Item1> + </RequiredPackages> + <Units Count="1"> + <Unit0> + <Filename Value="SimpleImageClassifierPaddingCroppingSwish.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="..\..\bin\$(TargetCPU)-$(TargetOS)\bin\SimpleImageClassifierPaddingCroppingSwish"/> + </Target> + <SearchPaths> + <IncludeFiles Value="..\..\neural;$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\neural;$(LazarusDir)\lcl\units\$(TargetCPU)-$(TargetOS);$(LazarusDir)\components\lazutils\lib\$(TargetCPU)-$(TargetOS)"/> + <UnitOutputDirectory Value="..\..\bin\$(TargetCPU)-$(TargetOS)\units"/> + </SearchPaths> + <CodeGeneration> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + </Debugging> + </Linking> + <Other> + <CustomOptions Value="-dAVX +-dRelease"/> + <OtherDefines Count="2"> + <Define0 Value="AVX"/> + <Define1 Value="Release"/> + </OtherDefines> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/examples/SimpleImageClassifier/SimpleImageClassifierPaddingCroppingSwish.lpr b/examples/SimpleImageClassifier/SimpleImageClassifierPaddingCroppingSwish.lpr new file mode 100644 index 00000000..79f712ca --- /dev/null +++ b/examples/SimpleImageClassifier/SimpleImageClassifierPaddingCroppingSwish.lpr @@ -0,0 +1,106 @@ +program SimpleImageClassifierPaddingCroppingSwish; +(* + Coded by Joao Paulo Schwarz Schuler. + https://github.com/joaopauloschuler/neural-api +*) +{$mode objfpc}{$H+} + +uses {$IFDEF UNIX} {$IFDEF UseCThreads} + cthreads, {$ENDIF} {$ENDIF} + Classes, SysUtils, CustApp, neuralnetwork, neuralvolume, + Math, neuraldatasets, neuralfit, neuralthread; + +type + TTestCNNAlgo = class(TCustomApplication) + protected + procedure DoRun; override; + end; + +const + // Padding and cropping constants. + csPadding = 4; + csCropSize = csPadding * 2; + + procedure TTestCNNAlgo.DoRun; + var + NN: TNNet; + NeuralFit: TNeuralImageFit; + ImgTrainingVolumes, ImgValidationVolumes, ImgTestVolumes: TNNetVolumeList; + begin + if not CheckCIFARFile() then + begin + Terminate; + exit; + end; + WriteLn('Creating Neural Network...'); + NN := TNNet.Create(); + NN.AddLayer([ + TNNetInput.Create(32, 32, 3), + TNNetConvolutionLinear.Create({Features=}64, {FeatureSize=}5, {Padding=}2, {Stride=}1, {SuppressBias=}1), + TNNetMaxPool.Create(4), + TNNetMovingStdNormalization.Create(), + TNNetConvolutionLinear.Create({Features=}64, {FeatureSize=}3, {Padding=}1, {Stride=}1, {SuppressBias=}1), + TNNetSwish.Create(), + TNNetConvolutionLinear.Create({Features=}64, {FeatureSize=}3, {Padding=}1, {Stride=}1, {SuppressBias=}1), + TNNetSwish.Create(), + TNNetConvolutionLinear.Create({Features=}64, {FeatureSize=}3, {Padding=}1, {Stride=}1, {SuppressBias=}1), + TNNetSwish.Create(), + TNNetConvolutionLinear.Create({Features=}64, {FeatureSize=}3, {Padding=}1, {Stride=}1, {SuppressBias=}1), + TNNetSwish.Create(), + TNNetDropout.Create(0.5), + TNNetMaxPool.Create(2), + TNNetFullConnectLinear.Create(10), + TNNetSoftMax.Create() + ]); + NN.DebugStructure(); + CreateCifar10Volumes(ImgTrainingVolumes, ImgValidationVolumes, ImgTestVolumes); + + // Add padding to dataset + WriteLn + ( + 'Original image size: ', + ImgTrainingVolumes[0].SizeX,',', + ImgTrainingVolumes[0].SizeY,' px.' + ); + ImgTrainingVolumes.AddPadding(csPadding); + ImgValidationVolumes.AddPadding(csPadding); + ImgTestVolumes.AddPadding(csPadding); + WriteLn + ( + 'New image size after padding: ', + ImgTrainingVolumes[0].SizeX,',', + ImgTrainingVolumes[0].SizeY,' px.' + ); + + NeuralFit := TNeuralImageFit.Create; + + // Enable cropping while fitting. + NeuralFit.HasImgCrop := true; + NeuralFit.MaxCropSize := csCropSize; + + NeuralFit.FileNameBase := 'SimpleImageClassifierPaddingCroppingSwish-'+IntToStr(GetProcessId()); + NeuralFit.InitialLearningRate := 0.001; + NeuralFit.LearningRateDecay := 0.01; + NeuralFit.StaircaseEpochs := 10; + NeuralFit.Inertia := 0.9; + NeuralFit.L2Decay := 0.00001; + NeuralFit.MaxThreadNum := 1; + + NeuralFit.Fit(NN, ImgTrainingVolumes, ImgValidationVolumes, ImgTestVolumes, {NumClasses=}10, {batchsize=}64, {epochs=}50); + NeuralFit.Free; + + NN.Free; + ImgTestVolumes.Free; + ImgValidationVolumes.Free; + ImgTrainingVolumes.Free; + Terminate; + end; + +var + Application: TTestCNNAlgo; +begin + Application := TTestCNNAlgo.Create(nil); + Application.Title:='CIFAR-10 Classification Example'; + Application.Run; + Application.Free; +end.