Entwicklung & Code
Künstliche Neuronale Netze im Überblick 6: Convolutional Neural Networks
Neuronale Netze sind der Motor vieler Anwendungen in KI und GenAI. Diese Artikelserie gibt einen Einblick in die einzelnen Elemente. Der sechste Teil widmet sich den Convolutional Neural Networks (CNNs).
Prof. Dr. Michael Stal arbeitet seit 1991 bei Siemens Technology. Seine Forschungsschwerpunkte umfassen Softwarearchitekturen für große komplexe Systeme (Verteilte Systeme, Cloud Computing, IIoT), Eingebettte Systeme und Künstliche Intelligenz.
Er berät Geschäftsbereiche in Softwarearchitekturfragen und ist für die Architekturausbildung der Senior-Software-Architekten bei Siemens verantwortlich.
Convolutional Neural Networks, im Deutschen auch faltungsneuronale Netze genannt, sind für die Verarbeitung von Daten mit einer gitterartigen Topologie wie Bildern konzipiert. Anstatt jede Eingabe vollständig mit jeder Ausgabe zu verbinden, verknüpft ein Convolutional Layer jede Ausgabe mit einem lokalisierten Bereich der Eingabe. Diese lokalisierte Verbindung nutzt die räumliche Struktur der Daten, um die Anzahl der Parameter zu reduzieren und Muster zu erfassen, die auch bei einer Verschiebung über die Eingabe hinweg aussagekräftig bleiben.
Das Herzstück einer Faltungsschicht ist die diskrete zweidimensionale Faltungsoperation. Wenn wir das Eingangsbild mit I und einen lernfähigen Filter oder Kernel mit K bezeichnen, dann wird die Faltung an der räumlichen Position (i, j) durch die doppelte Summe definiert:
(I * K)[i, j] = Σ_{m=0}^{k_h−1} Σ_{n=0}^{k_w−1} K[m, n] · I[i + m, j + n]
Hier sind k_h und k_w die Höhe und Breite des Kernels. Das Ergebnis ist eine Merkmalskarte, die alle Stellen im Bild hervorhebt, an denen das vom Kernel kodierte Muster auftritt.
PyTorch stellt eine 2D-Faltungsschicht durch die Klasse torch.nn.Conv2d
bereit. Dieses Modul verwaltet einen Satz von Filtern mit der Form (out_channels, in_channels, k_h, k_w) und wendet sie auf einen gebündelten Eingabetensor der Form (batch_size, in_channels, height, width). Die Faltung verwendet außerdem einen Stride-Parameter, um Positionen zu überspringen, und einen Padding-Parameter, um einen Rand aus Nullen um die Eingabe herum einzufügen. Die Höhe und Breite der Ausgabe werden berechnet durch:
H_out = floor((H_in + 2·padding − dilation·(k_h − 1) − 1) / stride + 1)
W_out = floor((W_in + 2·padding − dilation·(k_w − 1) − 1) / stride + 1)
Nachfolgender Code erstellt eine Faltungsschicht und wendet sie auf einen Stapel von RGB-Bildern mit einer Größe von jeweils 32×32 Pixeln an.
import torch
import torch.nn as nn
# Erstellen Sie einen Stapel von acht RGB-Bildern mit einer Größe von 32×32
batch_size, in_channels, H, W = 8, 3, 32, 32
images = torch.randn(batch_size, in_channels, H, W)
# Definieren Sie eine Faltungsschicht mit 16 Ausgangskanälen, einem 3×3-Kernel, einem Schritt von eins und einer Auffüllung von eins
conv = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)
# Wende die Faltung auf die Bilder an
features = conv(images)
# features hat die Form (8, 16, 32, 32)
Wenn die Schrittweite eins ist und die Auffüllung gleich (kernel_size−1)/2
für ungerade Kernel-Größen ist, hat die Ausgabe-Feature-Map die gleichen räumlichen Dimensionen wie die Eingabe. Die Beibehaltung der Dimensionen auf diese Weise ist in frühen Phasen der Bildverarbeitungsnetzwerke üblich. Im Gegensatz dazu führt ein Stride größer als eins oder die Verwendung von Pooling-Layern zu einer Verringerung der räumlichen Dimensionen. Ein Zwei-mal-Zwei-Max-Pooling-Layer mit Stride zwei halbiert beispielsweise sowohl die Höhe als auch die Breite seiner Eingabe.
Pooling führt eine Form der lokalen Translationsinvarianz ein und reduziert den Rechenaufwand in tieferen Schichten. Eine Max-Pooling-Operation über ein p×p-Fenster ersetzt jedes Fenster durch seinen Maximalwert, während Average Pooling das Fenster durch seinen Mittelwert ersetzt. Im Code erstellt man eine Pooling-Schicht, indem man torch.nn.MaxPool2d
oder torch.nn.AvgPool2d
instanziiert.
Convolutional Layers lassen sich sequenziell stapeln, um tiefe Merkmalshierarchien aufzubauen. Frühe Schichten lernen, einfache Muster wie Kanten und Texturen zu erkennen, und spätere Schichten kombinieren diese Muster zu abstrakteren Darstellungen wie Formen und Objekten. Nach mehreren Convolutional- und Pooling-Stufen flacht man die resultierenden Merkmalkarten oft zu einem Vektor ab und leitet diesen durch vollständig verbundene Schichten, um eine Klassifizierung oder Regression durchzuführen.
Ein minimales Convolutional Network in PyTorch könnte wie folgt aussehen. Jede Zeile des Codes erfasst einen Aspekt der Architektur.
import torch
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self, num_classes=10):
super(SimpleCNN, self).__init__()
# Erster Faltungsblock: 3→16 Kanäle, Kernel 3×3, Auffüllung zur Beibehaltung der Größe
self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)
# Normalisieren Sie jede Merkmalskarte über den Batch auf einen Mittelwert von Null und eine Varianz von Eins
self.bn1 = nn.BatchNorm2d(num_features=16)
# Einführen von Nichtlinearität
self.relu = nn.ReLU()
# Zweiter Faltungsblock: 16→32 Kanäle
self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding=1)
self.bn2 = nn.BatchNorm2d(num_features=32)
# Downsampling um den Faktor zwei
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
# Vollständig verbundene Schicht, die abgeflachten Merkmale auf Klassenscores abbildet
self.fc = nn.Linear(in_features=32 * 16 * 16, out_features=num_classes)
def forward(self, x):
x = self.conv1(x)
x = self.bn1(x)
x = self.relu(x)
x = self.conv2(x)
x = self.bn2(x)
x = self.relu(x)
x = self.pool(x)
x = x.view(x.size(0), -1)
scores = self.fc(x)
return scores
model = SimpleCNN(num_classes=10)
input_tensor = torch.randn(8, 3, 32, 32)
output_scores = model(input_tensor)
# output_scores hat die Form (8, 10)
Der erste Faltungsblock wandelt die dreikanalige Eingabe in sechzehn Merkmalskarten gleicher räumlicher Größe um. Die Batch-Normalisierung stabilisiert anschließend die Verteilung der Aktivierungen, was häufig das Training beschleunigt. Eine ReLU-Nichtlinearität führt die erforderliche Nichtlinearität ein. Der zweite Block wiederholt dieses Muster und reduziert nach dem Max-Pooling die Höhe und Breite jeder Merkmalskarte von 32 auf 16. Schließlich formen wir alle Merkmalskarten in einen zweidimensionalen Tensor der Form (batch_size, 32×16×16) um und leiten ihn durch eine lineare Schicht, um eine Bewertung pro Klasse zu erzeugen.
Convolutional Neural Networks bilden die Grundlage für modernste Modelle in der Bildverarbeitung und darüber hinaus.
Der nächste Teil der Serie widmet sich rekursiven neuronalen Netzen, die für die Verarbeitung sequenzieller Daten ausgelegt sind.
(rme)
Entwicklung & Code
Modernes C++: Trauer um unseren Blogautor Rainer Grimm
Leider ist unser Autor Rainer Grimm im Oktober verstorben. Wir trauern um einen großartigen Autor, Experten und Menschen. Rainer hat seit fast zehn Jahren regelmäßig in diesem Blog über aktuelle C++-Themen, kommende Standards, komplexe Probleme und mehr geschrieben.
(Bild: Rainer Grimm)
Im Oktober 2023 hatte Rainer die Diagnose erhalten, dass er an Amyotropher Lateralsklerose (ALS) leidet, einer schweren und unheilbaren neurologischen Erkrankung, die zu Muskellähmung führt. In seinem englischen Blog „My ALS Journey“ schrieb Rainer offen über seine Krankheit. Noch Anfang September lautete die Überschrift „I feel good“.
Bis zum Schluss war sein Ziel, über die Krankheit zu informieren und die Forschung indirekt zu unterstützen, um Ansatzpunkte für Therapien zu finden. Außerdem sammelte er immer wieder Geld für die ALS-Forschung, unter anderem durch spezielle Aktionen beim Verkauf seiner Bücher und durch einen Spendenlauf.
Experte für C++
Als Experte schrieb er über C++ und andere IT-Themen. Neben seinem regelmäßigen Blog verfasste er zahlreiche Artikel und sieben Bücher. Ein achtes Buch hatte er in Arbeit. Zusätzlich arbeitete er als Trainer und trat auf zahlreichen Konferenzen auf.
Seinen Blog schrieb er bis zum Schluss regelmäßig und hat in den vergangenen Monaten die wichtigsten Neuerungen von C++26 vorgestellt. „Modernes C++“ erschien lange Zeit wöchentlich. Nach dem Fortschreiten seiner Krankheit wechselte er auf einen Zweiwochentakt. Er konnte dabei bereits nicht mehr tippen, sondern diktierte die Texte, und seine Ehefrau Beatrix Jaud-Grimm half bei der Korrektur. Bis zum Ende hielt er Onlinevorträge und war als Trainer aktiv.
Geboren wurde Rainer am 26. Juni 1966. Nach seiner Ausbildung zum Krankenpfleger und Rettungssanitäter holte er das Abitur nach und studierte Mathematik. Er arbeitete anschließend als Softwarearchitekt bei der Tübinger Firma Science + Computing. 2016 hatte er zusammen mit seiner Ehefrau ein Schulungsunternehmen für C++ gegründet.
Leidenschaft für den Laufsport
Rainer war nicht nur IT-Experte, sondern auch leidenschaftlicher Läufer und Trainer beim TV Rottenburg. Er hat an vielen Meisterschaften teilgenommen und als junger Mann zweimal den Ironman absolviert. Noch im September hatte er einen Spendenlauf für die ALS-Forschung organisiert.
Anfang Oktober 2025 erkrankte Rainer an einer schweren Lungenentzündung. Er entschied sich bewusst gegen lebenserhaltenden Maßnahmen, die eine Dauerbeatmung bedeutet hätten und ihm die Möglichkeit zu sprechen genommen hätten.
Rainer starb am 6. Oktober im Kreis seiner Familie. Er hinterlässt seine Ehefrau Beatrix, die ihn während seiner Krankheit aufopfernd gepflegt hat, und zwei Kinder.
(rme)
Entwicklung & Code
Die Produktwerker: Anforderungen wirksam kommunizieren als Product Owner
Anforderungen zu formulieren, gehört zum Alltag jeder Produktrolle. Doch obwohl viele Product Owner viel Zeit und Sorgfalt in ihre User Stories und Akzeptanzkriterien stecken, kommt am Ende oft etwas anderes heraus als gedacht. Warum ist das so – und was lässt sich daran ändern?
Klare Kommunikation für wirksame Produktentwicklung
In der aktuellen Folge des Podcasts „Die Produktwerker“ sprechen Tim Klein und Oliver Winter darüber, worauf es bei der Kommunikation von Anforderungen wirklich ankommt. Dabei geht es weniger um Tools oder Templates – sondern um die Frage, wie Sprache, Haltung und Kontext darüber entscheiden, ob Teams und Stakeholder das Gleiche verstehen, wenn sie über ein Feature oder ein Problem sprechen.
Die beiden Gastgeber greifen damit ein alltägliches, aber oft unterschätztes Thema auf – und geben zahlreiche Impulse für mehr Klarheit, bessere Zusammenarbeit und letztlich wirksamere Produktentwicklung. Eine Folge, deren Inhalte Product Ownern in ihrer täglichen Arbeit sofort weiterhelfen werden.
(Bild: deagreez/123rf.com)
So geht Produktmanagement: Auf der Online-Konferenz Product Owner Day von dpunkt.verlag und iX am 13. November 2025 kannst du deinen Methodenkoffer erweitern und dich von den Good Practices anderer Unternehmen inspirieren lassen.
Die aktuelle Ausgabe des Podcasts steht auch im Blog der Produktwerker bereit: „Anforderungen wirksam kommunizieren als Product Owner„.
(mai)
Entwicklung & Code
Visual Studio Code 1.105 erweitert KI-Chat um vollqualifizierte Tool-Namen
Mit der September-2025-Version von Visual Studio Code führt Microsoft eine Reihe von Neuerungen ein, darunter erweiterte Chat-Funktionen und vollqualifizierte Tool-Namen sowie einen MCP-Marktplatz. Entwicklerinnen und Entwickler erhalten zudem neue Möglichkeiten zur KI-gestützten Konfliktlösung und verbesserte Authentifizierungsoptionen.
Chat-System erhält umfangreiche Neuerungen
Das Chat-System von Visual Studio Code 1.105 führt vollqualifizierte Tool-Namen ein, um Konflikte zwischen integrierten Tools und solchen von MCP-Servern oder Extensions zu vermeiden. Die Namen der Tools verweisen nun unmittelbar auf den MCP-Server, die Erweiterung oder die Werkzeugsammlung, zu der sie gehören. Statt codebase
verwenden Entwickler nun search/codebase
, statt list_issues
nutzen sie github/github-mcp-server/list_issues
. Laut Microsoft hilft dies auch beim Auffinden fehlender Extensions oder MCP-Server.
Eine Code Action unterstützt bei der Migration zu den qualifizierten Tool-Namen.
(Bild: Microsoft)
Für benutzerdefinierte Modelle hat Microsoft die Edit-Tools verbessert und einen Lernmechanismus zur Auswahl optimaler Tool-Sets eingeführt. Bei OpenAI-kompatiblen Modellen lässt sich die Liste der Edit-Tools über die Einstellung github.copilot.chat.customOAIModels
konfigurieren. Die Unterstützung für verschachtelte AGENTS.md-Dateien in Unterordnern des Arbeitsbereichs ist als experimentelle Funktion verfügbar. Dies ermöglicht spezifischere Kontexte und Anweisungen für verschiedene Codebereiche, etwa unterschiedliche Vorgaben für Frontend- und Backend-Code. Die Funktion lässt sich über die Einstellung chat.useNestedAgentsMdFiles
aktivieren.
Benachrichtigungen des Betriebssystems informieren nun über eingehende Chat-Antworten, wenn das VS Code-Fenster nicht im Fokus steht. Die Benachrichtigung enthält eine Vorschau der Antwort und bringt bei Auswahl den Chat-Input in den Fokus. Das Verhalten steuert die Einstellung chat.notifyWindowOnResponseReceived
. In Visual Studio Code 1.105 stehen zudem neue LLMs zur Verfügung: GPT-5-Codex von OpenAI, optimiert für agentisches Coding, und Claude Sonnet 4.5 von Anthropic für Coding und Real-World-Agenten. Die Auswahl erfolgt über den Modell-Picker im Chat.
MCP-Marktplatz als Vorschau-Feature
Die neue Version des kostenlosen Code-Editors stellt erstmals einen MCP-Marktplatz in der Extensions-Ansicht bereit, der das Durchsuchen und Installieren von MCP-Servern direkt im Editor ermöglicht. Der Marktplatz nutzt die GitHub MCP Registry als Datenquelle. Entwickler können MCP-Server über den @mcp-Filter, die Dropdown-Auswahl „MCP Servers“ oder die direkte Namenssuche finden. Die Funktion ist standardmäßig deaktiviert und lässt sich über chat.mcp.gallery.enabled
aktivieren. Laut Microsoft befindet sich das Feature noch in der Vorschau-Phase – etwaige Unzulänglichkeiten beim Verwenden seien daher nicht auszuschließen.
Beim Senden von Chat-Nachrichten starten MCP-Server nun automatisch. VS Code vermeidet in diesem Fall störende Dialoge und zeigt stattdessen Indikatoren im Chat an, wenn ein Server Aufmerksamkeit benötigt. Die Einstellung chat.mcp.autostart
steuert das Verhalten.
Verbessert hat das VS-Code-Entwicklungsteam zudem die Darstellung von MCP-Ressourcen aus Tools: Der Editor fügt standardmäßig eine Vorschau des Ressourceninhalts hinzu und gibt Anweisungen zum Abrufen vollständiger Inhalte, was die Modell-Performance bei der Tool-Nutzung steigern soll. Darüber hinaus wurden einige MCP-Spezifikations-Updates implementiert: SEP-973 ermöglicht benutzerdefinierten Icons für Server, Ressourcen und Tools. SEP-1034 erlaubt Standard-Werte bei der Elicitation-Nutzung.
Weitere Verbesserungen für Entwickler
Visual Studio Code 1.105 führt KI-gestützte Lösung von Merge-Konflikten ein. Bei Dateien mit Git-Merge-Konflikt-Markierungen erscheint eine neue Aktion in der unteren rechten Editor-Ecke, die den Chat öffnet und einen agentischen Ablauf mit Merge-Base und Änderungen beider Branches als Kontext startet.
Das runTests-Tool im Chat unterstützt nun Test-Code-Coverage-Berichte an den Agenten, was die Generierung und Verifikation von Tests ermöglicht, die den gesamten Code abdecken. Für lang laufende Tasks zeigt VS Code OS-Benachrichtigungen bei Abschluss an, wenn das Fenster nicht im Fokus steht. Die Einstellung task.notifyWindowOnTaskCompletion
steuert dieses Verhalten.
Alle weiteren Informationen zu Visual Studio Code 1.105 lassen sich dem Ankündigungsbeitrag entnehmen.
Lesen Sie auch
Python in Visual Studio Code: Verbesserungen für Python Environments
Nicht nur den Sourcecode-Editor selbst, sondern auch die Python-Erweiterungen hat Microsoft mit einem Update versehen. Im Oktober-Release (während bei Visual Studio Code der Vormonat namensgebend ist, richtet sich die Python-Erweiterung nach dem aktuellen) widmet sich das Entwicklungsteam insbesondere den Verbesserungen der Erweiterung Python Environments. Das Update verspricht unter anderem verbesserte Leistung und Zuverlässigkeit bei der Arbeit mit Conda-Umgebungen – Code lässt sich nun direkt ohne conda run
starten. Auch gelegentlich auftretende Abstürze beim Ausführen von Python-Dateien, die input() verwenden, wurden korrigiert. Die Erweiterung aktualisiert nun auch automatisch die Umgebungsmanager beim Erweitern von Baumknoten, sodass die Umgebungsliste ohne weitere Maßnahmen auf dem neuesten Stand bleibt.
Weitere Informationen zu den Updates für Python in VS Code liefert ein Beitrag auf Microsofts Entwicklerblog.
(map)
-
UX/UI & Webdesignvor 2 Monaten
Der ultimative Guide für eine unvergessliche Customer Experience
-
UX/UI & Webdesignvor 1 Monat
Adobe Firefly Boards › PAGE online
-
Social Mediavor 2 Monaten
Relatable, relevant, viral? Wer heute auf Social Media zum Vorbild wird – und warum das für Marken (k)eine gute Nachricht ist
-
Entwicklung & Codevor 2 Monaten
Posit stellt Positron vor: Neue IDE für Data Science mit Python und R
-
Entwicklung & Codevor 1 Monat
EventSourcingDB 1.1 bietet flexiblere Konsistenzsteuerung und signierte Events
-
UX/UI & Webdesignvor 4 Wochen
Fake It Untlil You Make It? Trifft diese Kampagne den Nerv der Zeit? › PAGE online
-
Apps & Mobile Entwicklungvor 3 Monaten
Firefox-Update 141.0: KI-gestützte Tab‑Gruppen und Einheitenumrechner kommen
-
Online Marketing & SEOvor 3 Monaten
So baut Googles NotebookLM aus deinen Notizen KI‑Diashows