Compare commits

..

7 Commits

Author SHA1 Message Date
Ninluc 6545d23e4f Revert "Fix reverb host"
linter / quality (push) Has been cancelled
tests / ci (8.3) (push) Has been cancelled
This reverts commit 24b2d29a41.
2026-10-04 17:07:20 +02:00
Ninluc 24b2d29a41 Fix reverb host
linter / quality (push) Has been cancelled
tests / ci (8.3) (push) Has been cancelled
2026-10-04 17:05:06 +02:00
Ninluc 151de1dcb8 Responsive
linter / quality (push) Successful in 4m3s
tests / ci (8.3) (push) Successful in 3m55s
2026-09-23 20:24:32 +02:00
Ninluc d3f914ba9a Footer links 2026-09-23 20:03:55 +02:00
Ninluc 5f4f751406 Fix spelling
linter / quality (push) Successful in 3m54s
tests / ci (8.3) (push) Successful in 3m31s
2026-09-22 10:26:34 +02:00
Ninluc d5409b11b7 Ajusted default error
linter / quality (push) Successful in 4m17s
tests / ci (8.3) (push) Successful in 3m36s
2026-09-22 10:13:37 +02:00
Ninluc 7cb528406c Optimize docker build
linter / quality (push) Successful in 3m58s
tests / ci (8.3) (push) Successful in 3m25s
2026-09-21 12:17:05 +02:00
9 changed files with 90 additions and 21 deletions
+8 -12
View File
@@ -23,10 +23,10 @@ jobs:
- name: Get version - name: Get version
id: get_version id: get_version
run: echo "::set-output name=version::$(cat VERSION)" run: echo "version=$(cat VERSION)" >> $GITHUB_OUTPUT
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub - name: Login to Docker Hub
uses: docker/login-action@v3 uses: docker/login-action@v3
@@ -35,26 +35,22 @@ jobs:
username: ninluc username: ninluc
password: ${{ secrets.REGISTRY_TOKEN }} password: ${{ secrets.REGISTRY_TOKEN }}
- name: Cache Docker layers (registry-backed)
uses: actions/cache@v4
with:
path: /tmp/.buildx-cache
key: buildx-cache-${{ github.sha }}
restore-keys: |
buildx-cache-
- name: Build and push - name: Build and push
uses: docker/build-push-action@v2 uses: docker/build-push-action@v6
with: with:
context: . context: .
file: Dockerfile file: Dockerfile
push: true push: true
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: | build-args: |
VITE_REVERB_APP_KEY=${{ secrets.REVERB_APP_KEY }} VITE_REVERB_APP_KEY=${{ secrets.REVERB_APP_KEY }}
VITE_REVERB_HOST=perceptron.matthiasg.dev VITE_REVERB_HOST=perceptron.matthiasg.dev
VITE_REVERB_PORT=443 VITE_REVERB_PORT=443
VITE_REVERB_SCHEME=https VITE_REVERB_SCHEME=https
tags: git.matthiasg.dev/ninluc/perceptron-viewer/perceptron-viewer:latest, git.matthiasg.dev/ninluc/perceptron-viewer/perceptron-viewer:${{ steps.get_version.outputs.version }} tags: |
git.matthiasg.dev/ninluc/perceptron-viewer/perceptron-viewer:latest
git.matthiasg.dev/ninluc/perceptron-viewer/perceptron-viewer:${{ steps.get_version.outputs.version }}
# notify: # notify:
# needs: build # needs: build
+10 -1
View File
@@ -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) {
+1 -1
View File
@@ -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: {
+64
View File
@@ -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>
+3 -3
View File
@@ -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"