Gradient descent training + Added all dataset + graphs improvements
This commit is contained in:
@@ -2,14 +2,14 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\SimplePerceptron;
|
||||
use App\Models\SimplePerceptronTraining;
|
||||
use App\Events\PerceptronInitialization;
|
||||
use App\Models\GradientDescentPerceptronTraining;
|
||||
use App\Models\SimpleBinaryPerceptronTraining;
|
||||
use App\Services\DataSetReader;
|
||||
use App\Services\ISynapticWeightsProvider;
|
||||
use App\Services\PerceptronIterationEventBuffer;
|
||||
use App\Services\ZeroSynapticWeights;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class PerceptronController extends Controller
|
||||
{
|
||||
@@ -18,29 +18,32 @@ class PerceptronController extends Controller
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$perceptronType = $request->query('type', 'simple');
|
||||
$perceptronType = $request->query('type');
|
||||
|
||||
$learningRate = 0.1;
|
||||
$maxIterations = 100;
|
||||
$learningRate = 0.01;
|
||||
$maxIterations = 200;
|
||||
$minError = 0.6;
|
||||
|
||||
switch ($perceptronType) {
|
||||
case 'simple':
|
||||
$learningRate = 0.015;
|
||||
$maxIterations = 100;
|
||||
$maxIterations = 150;
|
||||
break;
|
||||
case 'gradientdescent':
|
||||
$learningRate = 0.00003;
|
||||
}
|
||||
|
||||
return inertia('PerceptronViewer', [
|
||||
'type' => $perceptronType,
|
||||
'sessionId' => session()->getId(),
|
||||
'datasets' => $this->getDatasets(),
|
||||
'minError' => 0.01,
|
||||
'datasets' => $this->getDatasets($perceptronType),
|
||||
'minError' => $minError,
|
||||
'learningRate' => $learningRate,
|
||||
'maxIterations' => $maxIterations,
|
||||
]);
|
||||
}
|
||||
|
||||
private function getDatasets(): array
|
||||
private function getDatasets(string $perceptronType): array
|
||||
{
|
||||
$dataSetsDirectory = public_path('data_sets');
|
||||
$files = scandir($dataSetsDirectory);
|
||||
@@ -51,17 +54,44 @@ class PerceptronController extends Controller
|
||||
$dataset['label'] = str_replace('.csv', '', $file);
|
||||
$dataSetReader = new DataSetReader($dataSetsDirectory . '/' . $file);
|
||||
$dataset['data'] = [];
|
||||
foreach ($dataSetReader->lines as $line) {
|
||||
$dataset['data'][] = [
|
||||
'x' => $line[0],
|
||||
'y' => $line[1],
|
||||
'label' => $line[2],
|
||||
];
|
||||
switch (count($dataSetReader->lines[0])) {
|
||||
case 3:
|
||||
foreach ($dataSetReader->lines as $line) {
|
||||
$dataset['data'][] = [
|
||||
'x' => $line[0],
|
||||
'y' => $line[1],
|
||||
'label' => $line[2],
|
||||
];
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
foreach ($dataSetReader->lines as $line) {
|
||||
$dataset['data'][] = [
|
||||
'x' => $line[0],
|
||||
'y' => $line[1],
|
||||
'label' => 1,
|
||||
];
|
||||
}
|
||||
break;
|
||||
default:
|
||||
$dataset['data'] = null; // Not supported for viewing
|
||||
break;
|
||||
}
|
||||
|
||||
switch ($dataset['label']) {
|
||||
case '2.9':
|
||||
$dataset['defaultLearningRate'] = 0.015;
|
||||
case 'logic_and_gradient':
|
||||
switch ($perceptronType) {
|
||||
case 'gradientdescent':
|
||||
$dataset['defaultLearningRate'] = 0.3;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'table_2_9':
|
||||
switch ($perceptronType) {
|
||||
case 'simple':
|
||||
$dataset['defaultLearningRate'] = 0.015;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
$datasets[] = $dataset;
|
||||
@@ -78,7 +108,7 @@ class PerceptronController extends Controller
|
||||
|
||||
public function run(Request $request, ISynapticWeightsProvider $synapticWeightsProvider)
|
||||
{
|
||||
$perceptronType = $request->input('type', 'simple');
|
||||
$perceptronType = $request->input('type');
|
||||
$minError = $request->input('min_error', 0.01);
|
||||
$weightInitMethod = $request->input('weight_init_method', 'random');
|
||||
$dataSet = $request->input('dataset');
|
||||
@@ -96,11 +126,12 @@ class PerceptronController extends Controller
|
||||
$iterationEventBuffer = new PerceptronIterationEventBuffer($sessionId, $trainingId);
|
||||
|
||||
$networkTraining = match ($perceptronType) {
|
||||
'simple' => new SimplePerceptronTraining($dataSetReader, $learningRate, $maxIterations, $synapticWeightsProvider, $iterationEventBuffer, $sessionId, $trainingId),
|
||||
'simple' => new SimpleBinaryPerceptronTraining($dataSetReader, $learningRate, $maxIterations, $synapticWeightsProvider, $iterationEventBuffer, $sessionId, $trainingId),
|
||||
'gradientdescent' => new GradientDescentPerceptronTraining($dataSetReader, $learningRate, $maxIterations, $synapticWeightsProvider, $iterationEventBuffer, $sessionId, $trainingId, $minError),
|
||||
default => null,
|
||||
};
|
||||
|
||||
event(new \App\Events\PerceptronInitialization($dataSetReader->lines, $networkTraining->activationFunction, $sessionId, $trainingId));
|
||||
event(new PerceptronInitialization($dataSetReader->lines, $networkTraining->activationFunction, $sessionId, $trainingId));
|
||||
|
||||
$networkTraining->start();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user