⚙️ Konfigurace
🔗 CNN → MLP Pipeline
Nakresli vzor, pak ho posuň tlačítky → ↓ a sleduj, zda ho síť stále rozpozná.
📈 Výstup (Pravděpodobnosti)
💡 Kernel nejprve extrahuje rysy, MLP pak klasifikuje.
OpenTechLab Jablonec nad Nisou · Science Micro Elementary School
Řešení problému pozice – kernel jako sdílený detektor rysů. Přechod z MLP Grayscale na konvoluční síť.
V MLP Grayscale měl každý pixel svou vlastní váhu. Posun vzoru o jeden pixel = úplně jiný vstup = síť nerozpozná. Konvoluční síť řeší tento problém: 4 malé kernely (3×3) se posouvají přes celý obrázek a hledají různé rysy kdekoli – hrany, rohy, textury.
Nakresli vzor, pak ho posuň tlačítky → ↓ a sleduj, zda ho síť stále rozpozná.
💡 Kernel nejprve extrahuje rysy, MLP pak klasifikuje.
Konvoluce je matematická operace, která "posouvá" malý filtr (kernel) přes vstupní obrázek a v každé pozici počítá skalární součin mezi kernelem a odpovídající oblastí vstupu.
Klíčový insight: Stejný kernel se aplikuje na všechny pozice vstupu. To znamená, že síť hledá stejný rys (např. hranu) kdekoli v obrázku. Toto se nazývá sdílení vah (weight sharing).
Vstup se obalí nulami (zero padding), takže výstup má stejnou velikost jako vstup.
Kernel se aplikuje pouze tam, kde se celý vejde. Výstup je menší.
Proč same padding? Zachovává prostorovou informaci na okrajích a umožňuje hlubší sítě bez rychlého zmenšování feature map.
Jeden kernel detekuje jeden typ rysu (např. horizontální hranu). Pro rozpoznání složitých vzorů potřebujeme více kernelů, každý hledající jiný rys.
Flatten je klíčový krok mezi konvoluční a plně propojenou (Dense) vrstvou. Převádí 2D mapy rysů na 1D vektor, který může zpracovat MLP.
💡 Klíčový insight: Těch 100 hodnot je přesně to samé, jako kdyby MLP v mlp-builder měl vstupní vrstvu o 100 neuronech. Flatten jen "rozbalí" 2D mapy do 1D řady.
Konvoluce je náročnější než jednoduché násobení matic v MLP. Pro každou pozici feature mapy počítáme 9 násobení (3×3 kernel). V této malé síti to v prohlížeči běží rychle, ale ve větších sítích (např. s obrázky 224×224) se používají GPU pro paralelní výpočty.
Kernely se učí pomocí backpropagation. Gradient pro každou váhu kernelu se počítá jako součet gradientů ze všech pozic, kde byl kernel aplikován.
Důležité: Protože kernel je sdílený přes všechny pozice, jeho gradient je součtem gradientů ze všech těchto pozic.
Nuluje záporné hodnoty. Rychlá, efektivní, standard v CNN.
Výstup v rozmezí (0, 1). Používáno pro pravděpodobnosti.
function convolve(input, kernel, padding) {
const padded = zeroPad(input, padding); // Obal vstup nulami
const output = [];
for (let y = 0; y < outputHeight; y++) {
for (let x = 0; x < outputWidth; x++) {
let sum = 0;
for (let ky = 0; ky < 3; ky++) {
for (let kx = 0; kx < 3; kx++) {
sum += padded[y+ky][x+kx] * kernel[ky*3 + kx];
}
}
output.push(relu(sum + bias)); // Aktivace
}
}
return output;
}
function backpropKernel(featureGradients, paddedInput) {
const kernelGradients = new Array(9).fill(0);
for (let y = 0; y < featureHeight; y++) {
for (let x = 0; x < featureWidth; x++) {
const delta = featureGradients[y * width + x];
for (let ky = 0; ky < 3; ky++) {
for (let kx = 0; kx < 3; kx++) {
kernelGradients[ky*3 + kx] += delta * paddedInput[y+ky][x+kx];
}
}
}
}
// Aktualizace vah
for (let i = 0; i < 9; i++) {
kernel[i] -= learningRate * kernelGradients[i];
}
}
// 4 kernely × 5×5 feature map = 100 hodnot
const flattenedInput = [];
for (let k = 0; k < numKernels; k++) {
for (let i = 0; i < featureMapSize; i++) {
flattenedInput.push(featureMaps[k][i]);
}
}
// flattenedInput má nyní 100 prvků → vstup do MLP