Compare commits
9 Commits
3efc323d28
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 6545d23e4f | |||
| 24b2d29a41 | |||
| 151de1dcb8 | |||
| d3f914ba9a | |||
| 5f4f751406 | |||
| d5409b11b7 | |||
| 7cb528406c | |||
| e10b2f8d1f | |||
| 646e4841bb |
@@ -25,10 +25,6 @@ jobs:
|
|||||||
id: get_version
|
id: get_version
|
||||||
run: echo "version=$(cat VERSION)" >> $GITHUB_OUTPUT
|
run: echo "version=$(cat VERSION)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
# Required for cross-compiling ARM64 images on x86_64 runners
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v3
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
@@ -39,12 +35,11 @@ jobs:
|
|||||||
username: ninluc
|
username: ninluc
|
||||||
password: ${{ secrets.REGISTRY_TOKEN }}
|
password: ${{ secrets.REGISTRY_TOKEN }}
|
||||||
|
|
||||||
- name: Build and push multi-arch image
|
- name: Build and push
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: Dockerfile
|
file: Dockerfile
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
push: true
|
push: true
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
cache-to: type=gha,mode=max
|
cache-to: type=gha,mode=max
|
||||||
|
|||||||
@@ -52,6 +52,9 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
php-version: '8.4'
|
php-version: '8.4'
|
||||||
coverage: none
|
coverage: none
|
||||||
|
tools: composer:v2
|
||||||
|
env:
|
||||||
|
phpexts: none
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
|
|||||||
@@ -150,7 +150,6 @@ class PerceptronController extends Controller
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'Classification_-_Oblique_(linéairement_séparable)':
|
case 'Classification_-_Oblique_(linéairement_séparable)':
|
||||||
case 'Classification_-_Oblique_modifié_(non_linéairement_séparable)':
|
|
||||||
switch ($perceptronType) {
|
switch ($perceptronType) {
|
||||||
case 'simple':
|
case 'simple':
|
||||||
$dataset['defaultLearningRate'] = 0.015;
|
$dataset['defaultLearningRate'] = 0.015;
|
||||||
@@ -163,6 +162,16 @@ class PerceptronController extends Controller
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'Classification_-_Oblique_modifié_(non_linéairement_séparable)':
|
||||||
|
switch ($perceptronType) {
|
||||||
|
case 'gradientdescent':
|
||||||
|
case 'adaline':
|
||||||
|
$dataset['defaultLearningRate'] = 0.001;
|
||||||
|
$dataset['defaultMinError'] = 0.3;
|
||||||
|
$dataset['defaultMaxIterations'] = 2000;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'Régression_-_Oblique':
|
case 'Régression_-_Oblique':
|
||||||
$dataset['defaultMinError'] = 0.02;
|
$dataset['defaultMinError'] = 0.02;
|
||||||
switch ($perceptronType) {
|
switch ($perceptronType) {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Cet outil vous permet d'expérimenter avec les réseaux de neurones et les perce
|
|||||||
|
|
||||||
## Contexte
|
## Contexte
|
||||||
|
|
||||||
Ce projet a été d'abord créé pour un cours de réseaux de neurones artificiels que j'ai suivi durant mon master en Architecture des Systèmes Informatiques à la Haute École de la Province de Liège. Il s'agit ici d'une version plus conviviale, documentée et optimisée. Cependant le projet n'est pas très mobile friendly et je conseille l'utilisation d'un écran horizontal. 📵
|
Ce projet a été d'abord créé pour un cours de réseaux de neurones artificiels que j'ai suivi durant mon master en Architecture des Systèmes Informatiques à la Haute École de la Province de Liège. Il s'agit ici d'une version plus conviviale, documentée et optimisée.
|
||||||
|
|
||||||
Je conseille de finir de lire les prochains chapitres qui traitent des bases des réseaux de neurones et qui présentent l'interface. Je conseille ensuite d'utiliser les onglets au-dessus de la page dans l'ordre indiqué. Chaque onglet présente une évolution des réseaux de neurones dans l'ordre chronologique des découvertes et des améliorations faites.
|
Je conseille de finir de lire les prochains chapitres qui traitent des bases des réseaux de neurones et qui présentent l'interface. Je conseille ensuite d'utiliser les onglets au-dessus de la page dans l'ordre indiqué. Chaque onglet présente une évolution des réseaux de neurones dans l'ordre chronologique des découvertes et des améliorations faites.
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
@@ -332,7 +332,7 @@ function getPerceptronDecisionBoundaryDataset(
|
|||||||
<template>
|
<template>
|
||||||
<Chart
|
<Chart
|
||||||
v-if="props.cleanedDataset.length > 0 || props.iterations.length > 0"
|
v-if="props.cleanedDataset.length > 0 || props.iterations.length > 0"
|
||||||
class="flex bg-primary dark:bg-transparent!"
|
class="w-full flex bg-primary dark:bg-transparent!"
|
||||||
type="scatter"
|
type="scatter"
|
||||||
:options="{
|
:options="{
|
||||||
responsive: true,
|
responsive: true,
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ const datasets = computed<ErrorDataset[]>(() => {
|
|||||||
<template>
|
<template>
|
||||||
<Chart
|
<Chart
|
||||||
type="bar"
|
type="bar"
|
||||||
class="bg-primary dark:bg-transparent!"
|
class="w-full bg-primary dark:bg-transparent!"
|
||||||
:options="{
|
:options="{
|
||||||
responsive: true,
|
responsive: true,
|
||||||
maintainAspectRatio: true,
|
maintainAspectRatio: true,
|
||||||
@@ -100,8 +100,8 @@ const datasets = computed<ErrorDataset[]>(() => {
|
|||||||
title: {
|
title: {
|
||||||
display: true,
|
display: true,
|
||||||
text: props.isRegression
|
text: props.isRegression
|
||||||
? 'Erreur de prédiction par epoch'
|
? 'Erreur de prédiction par époque'
|
||||||
: 'Nombre d\'erreurs par epoch',
|
: 'Nombre d\'erreurs par époque',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
animation: {
|
animation: {
|
||||||
|
|||||||
@@ -1,17 +1,81 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { Head } from '@inertiajs/vue3';
|
import { Head } from '@inertiajs/vue3';
|
||||||
|
import { onMounted, ref } from 'vue';
|
||||||
import HelpText from '@/components/HelpText.vue';
|
import HelpText from '@/components/HelpText.vue';
|
||||||
import LinkHeader from '@/components/LinkHeader.vue';
|
import LinkHeader from '@/components/LinkHeader.vue';
|
||||||
|
|
||||||
|
const icons = {
|
||||||
|
'matthiasgdev.png': {
|
||||||
|
href: 'https://abcd.matthiasg.dev/q/portfolio',
|
||||||
|
alt: 'Portfolio',
|
||||||
|
},
|
||||||
|
'gitea.png': {
|
||||||
|
href: 'https://git.matthiasg.dev/Ninluc/perceptron-viewer',
|
||||||
|
alt: 'Dépôt Git',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const iconsFolder: string = '/img/footerIcons/';
|
||||||
|
const iconHtml = ref<Record<string, string>>({});
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
try {
|
||||||
|
const svgEntries = await Promise.all(
|
||||||
|
Object.keys(icons)
|
||||||
|
.filter((icon) => icon.endsWith('.svg'))
|
||||||
|
.map(async (icon) => {
|
||||||
|
const response = await fetch(`${iconsFolder}${icon}`);
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`Failed to load ${icon}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [icon, await response.text()] as const;
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
iconHtml.value = Object.fromEntries(svgEntries);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Could not load footer icons:', error);
|
||||||
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Head title="Perceptron Viewer"></Head>
|
<Head title="Perceptron Viewer"></Head>
|
||||||
<main class="flex min-h-dvh flex-col gap-6 pb-6">
|
<main class="flex min-h-dvh flex-col gap-6 pb-6">
|
||||||
<LinkHeader class="w-full my-0! py-6 sticky top-0 z-10 bg-background" />
|
<LinkHeader class="w-full my-0! py-6 sticky top-0 z-10 bg-background" />
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class="flex flex-col items-center gap-6 rounded-lg p-6 shadow sm:p-8"
|
class="flex flex-col items-center gap-6 rounded-lg p-6 shadow sm:p-8"
|
||||||
>
|
>
|
||||||
<HelpText markdownFileName="intro" class="max-w-[90ch]" />
|
<HelpText markdownFileName="intro" class="max-w-[90ch]" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
<footer class="p-10 flex flex-col gap-6">
|
||||||
|
<p class="text-center text-muted-foreground">
|
||||||
|
Autres liens :
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap justify-center align-center gap-10">
|
||||||
|
<a
|
||||||
|
v-for="(iconData, icon) in icons"
|
||||||
|
:key="icon"
|
||||||
|
:href="iconData.href"
|
||||||
|
:aria-label="iconData.alt"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
class="min-h-full flex flex-col justify-between items-center gap-2 transition hover:scale-110"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
:src="iconsFolder + icon"
|
||||||
|
:alt="iconData.alt"
|
||||||
|
class="contain-size w-20 transition brightness-200 hover:brightness-100 hover:saturate-100 hover:opacity-70"
|
||||||
|
/>
|
||||||
|
<p>{{ iconData.alt }}</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
</main>
|
</main>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -256,10 +256,10 @@ watch([iterations, trainingEnded], async () => {
|
|||||||
@update:training-id="setTrainingId"
|
@update:training-id="setTrainingId"
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
class="align-items-start justify-content-center grid max-w-dvw grid-cols-2"
|
class="align-items-start justify-content-center grid min-w-0 max-w-dvw grid-cols-1 md:grid-cols-[repeat(auto-fit,minmax(36rem,1fr))]"
|
||||||
v-if="selectedDatasetName || iterations.length > 0"
|
v-if="selectedDatasetName || iterations.length > 0"
|
||||||
>
|
>
|
||||||
<div class="pt-3 h-dvh max-h-dvh min-h-0 w-full min-w-0">
|
<div class="order-2 pt-3 xl:h-dvh h-[50dvh] max-h-dvh min-h-0 w-full min-w-0 xl:order-0">
|
||||||
<ScrollArea ref="iterationScrollArea" :keep-bottom="true" type="scroll" class="relative h-full max-h-full min-h-0 w-full">
|
<ScrollArea ref="iterationScrollArea" :keep-bottom="true" type="scroll" class="relative h-full max-h-full min-h-0 w-full">
|
||||||
<IterationTable
|
<IterationTable
|
||||||
:iterations="iterations"
|
:iterations="iterations"
|
||||||
@@ -305,7 +305,7 @@ watch([iterations, trainingEnded], async () => {
|
|||||||
</template>
|
</template>
|
||||||
</ScrollArea>
|
</ScrollArea>
|
||||||
</div>
|
</div>
|
||||||
<div class="h-full w-full min-w-0 space-y-6">
|
<div class="order-1 h-full w-full min-w-0 space-y-6 md:order-0">
|
||||||
<div>
|
<div>
|
||||||
<PerceptronDecisionGraph
|
<PerceptronDecisionGraph
|
||||||
:cleanedDataset="cleanedDataset"
|
:cleanedDataset="cleanedDataset"
|
||||||
|
|||||||
Reference in New Issue
Block a user