Multilayer neuron network
This commit is contained in:
@@ -6,6 +6,7 @@ use App\Events\PerceptronInitialization;
|
||||
use App\Models\NetworksTraining\ADALINEPerceptronTraining;
|
||||
use App\Models\NetworksTraining\GradientDescentPerceptronTraining;
|
||||
use App\Models\NetworksTraining\MonoLayerPerceptronTraining;
|
||||
use App\Models\NetworksTraining\MultiLayerPerceptronTraining;
|
||||
use App\Models\NetworksTraining\SimpleBinaryPerceptronTraining;
|
||||
use App\Services\DatasetReader\IDataSetReader;
|
||||
use App\Services\DatasetReader\LinearOrderDataSetReader;
|
||||
@@ -13,12 +14,11 @@ use App\Services\DatasetReader\RandomOrderDataSetReader;
|
||||
use App\Services\IterationEventBuffer\PerceptronIterationEventBuffer;
|
||||
use App\Services\IterationEventBuffer\PerceptronLimitedEpochEventBuffer;
|
||||
use App\Services\SynapticWeightsProvider\ISynapticWeightsProvider;
|
||||
use App\Services\SynapticWeightsProvider\RandomSynapticWeights;
|
||||
use App\Services\SynapticWeightsProvider\ZeroSynapticWeights;
|
||||
use Illuminate\Contracts\Queue\Job;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Symfony\Contracts\EventDispatcher\Event;
|
||||
use Tests\Services\IterationEventBuffer\DullIterationEventBuffer;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
|
||||
class PerceptronController extends Controller
|
||||
{
|
||||
@@ -38,9 +38,16 @@ class PerceptronController extends Controller
|
||||
$learningRate = 0.015;
|
||||
$maxIterations = 150;
|
||||
break;
|
||||
case 'gradientdescent' || 'adaline':
|
||||
case 'gradientdescent':
|
||||
case 'adaline':
|
||||
$learningRate = 0.00003;
|
||||
break;
|
||||
case 'monolayer':
|
||||
$learningRate = 0.03;
|
||||
break;
|
||||
case 'multilayer':
|
||||
$learningRate = 0.8;
|
||||
break;
|
||||
}
|
||||
|
||||
return inertia('PerceptronViewer', [
|
||||
@@ -50,6 +57,7 @@ class PerceptronController extends Controller
|
||||
'minError' => $minError,
|
||||
'learningRate' => $learningRate,
|
||||
'maxIterations' => $maxIterations,
|
||||
'maxDisplayedWeights' => config('perceptron.max_displayed_weights'),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -106,7 +114,8 @@ class PerceptronController extends Controller
|
||||
case 'simple':
|
||||
$dataset['defaultLearningRate'] = 0.015;
|
||||
break;
|
||||
case 'gradientdescent' || 'adaline':
|
||||
case 'gradientdescent':
|
||||
case 'adaline':
|
||||
$dataset['defaultLearningRate'] = 0.001;
|
||||
break;
|
||||
}
|
||||
@@ -114,6 +123,15 @@ class PerceptronController extends Controller
|
||||
case 'table_2_11':
|
||||
$dataset['defaultMinError'] = 0.02;
|
||||
break;
|
||||
case 'table_4_12':
|
||||
switch ($perceptronType) {
|
||||
case 'multilayer':
|
||||
$dataset['defaultLearningRate'] = 0.8;
|
||||
$dataset['defaultMinError'] = 0.001;
|
||||
$dataset['defaultMaxIterations'] = 2000;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
$datasets[] = $dataset;
|
||||
}
|
||||
@@ -133,7 +151,19 @@ class PerceptronController extends Controller
|
||||
{
|
||||
$startTime = microtime(true);
|
||||
|
||||
// Verifications
|
||||
$validator = Validator::make($request->all(), config('perceptron.run_inputs_validation'));
|
||||
|
||||
if ($validator->fails()) {
|
||||
return response()->json([
|
||||
'message' => 'Invalid input parameters',
|
||||
'errors' => $validator->errors(),
|
||||
], 400);
|
||||
}
|
||||
|
||||
$perceptronType = $request->input('type');
|
||||
$hiddenLayers = $request->input('hidden_layers', 2);
|
||||
$hiddenLayersNeurons = $request->input('hidden_layers_neurons', 3);
|
||||
$minError = $request->input('min_error', 0.01);
|
||||
$weightInitMethod = $request->input('weight_init_method', 'random');
|
||||
$dataSet = $request->input('dataset');
|
||||
@@ -145,7 +175,11 @@ class PerceptronController extends Controller
|
||||
// Remove the jobs for the sessionId
|
||||
DB::table('jobs')->where('payload', 'like', '%s:9:\"sessionId\";s:40:\"'. $sessionId .'\";%')->delete();
|
||||
|
||||
if ($weightInitMethod === 'zeros') {
|
||||
// Zero initialization prevents hidden layers from receiving a gradient.
|
||||
if ($perceptronType === 'multilayer' && $weightInitMethod === 'zeros') {
|
||||
$synapticWeightsProvider = new RandomSynapticWeights;
|
||||
}
|
||||
else if ($weightInitMethod === 'zeros') {
|
||||
$synapticWeightsProvider = new ZeroSynapticWeights;
|
||||
}
|
||||
|
||||
@@ -162,6 +196,7 @@ class PerceptronController extends Controller
|
||||
'gradientdescent' => new GradientDescentPerceptronTraining($datasetReader, $learningRate, $maxEpochs, $synapticWeightsProvider, $iterationEventBuffer, $sessionId, $trainingId, $minError),
|
||||
'adaline' => new ADALINEPerceptronTraining($datasetReader, $learningRate, $maxEpochs, $synapticWeightsProvider, $iterationEventBuffer, $sessionId, $trainingId, $minError),
|
||||
'monolayer' => new MonoLayerPerceptronTraining($datasetReader, $learningRate, $maxEpochs, $synapticWeightsProvider, $iterationEventBuffer, $sessionId, $trainingId, $minError),
|
||||
'multilayer' => new MultiLayerPerceptronTraining($datasetReader, $learningRate, $maxEpochs, $hiddenLayers, $hiddenLayersNeurons, $synapticWeightsProvider, $iterationEventBuffer, $sessionId, $trainingId, $minError),
|
||||
default => null,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user