<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://tippvomtibb.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chris+T.+Ludwig</id>
	<title>TippvomTibb - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://tippvomtibb.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chris+T.+Ludwig"/>
	<link rel="alternate" type="text/html" href="https://tippvomtibb.de/mediawiki/Spezial:Beitr%C3%A4ge/Chris_T._Ludwig"/>
	<updated>2026-10-15T14:26:16Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(Pylontech)_US2000_Lithium_Battery&amp;diff=5512</id>
		<title>(Pylontech) US2000 Lithium Battery</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(Pylontech)_US2000_Lithium_Battery&amp;diff=5512"/>
		<updated>2026-10-15T12:38:12Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* LiIon/LiPo/LiFePO4 Zellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Die Li-Ion Batterie (eigentlich LFP s.u.) von Pylontech wird gerne im Bundle mit den Victron Energy Charger/Inverter angeboten.&lt;br /&gt;
Worin sich genau die Typen US2000 Plus/B/C unterscheiden habe ich noch nicht herausgefunden.&lt;br /&gt;
&lt;br /&gt;
 Die US2000 haben eine Speicherkapazitaet von 2,4 kWh (48V 50Ah).&lt;br /&gt;
 Die US3000 haben eine Speicherkapazitaet von 3,5 kWh.  3150 Wh (DoD 90%)&lt;br /&gt;
&lt;br /&gt;
Auf der [https://voltaconsolar.com/blog/2019/08/15/pylontech-announces-change-in-name-for-us2000-lithium-batteries/ Seite] sind zwei Pylontech abgebildet. Angeblich ein altes US2000 und ein neues US2000 B (Plus). Meins sieht aber so aus und gleicht keinem der Varianten so richtig.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech US2000NB05V00101.jpg|1000px|Pylontech US2000NB05V00101]]&lt;br /&gt;
&lt;br /&gt;
Ich besitze einen Pylontech mit der PartNumber: US2000NB05V00101&lt;br /&gt;
&lt;br /&gt;
Es handelt sich mit hoher Wahrscheinlichkeit um einen US2000B Plus.&lt;br /&gt;
Dies ist wichtig fuer die richtige Wahl des CAN-Bus Kabels. Die Pin-Belegung zwischen US2000 und US2000C bzw. US3000 hat sich geaendert.&lt;br /&gt;
&lt;br /&gt;
=Daten=&lt;br /&gt;
 PYLONTECH US2000&lt;br /&gt;
 Technologie 	Lithium-Eisenphosphat (LiFePo4)&lt;br /&gt;
 Nennspannung 	48V&lt;br /&gt;
 Nennkapazität 	50 Ah / 2,4 kWh&lt;br /&gt;
 Nutzbare Kapazität (90% DoD) 	45Ah / 2,2 kWh&lt;br /&gt;
 Entladespannungsbereich 	45,0 ... 54,0 V (Beachte: US3000C 44,5 ... 53,5 V)&lt;br /&gt;
 Ladespannungsbereich 	52,5 ... 54,0 V (Beachte: US3000C 52,5 ... 53,5 V)&lt;br /&gt;
 Maximaler Entladestrom 	100 A (2C) @ 15s.&lt;br /&gt;
 Maximaler Ladestrom 	100 A (2C)@ 15s.&lt;br /&gt;
 Empf. Dauer Entladestrom 	25 A (0.5C)&lt;br /&gt;
 Empf. Dauer Ladestrom 	25 A (0.5C)&lt;br /&gt;
 Kommunikation 	RS232, RS485, CAN&lt;br /&gt;
 Gewicht 	24 kg&lt;br /&gt;
 Abmessungen 	440 x 410 x 89 mm&lt;br /&gt;
 Schutzart 	IP20&lt;br /&gt;
 Temperaturbereich bei Ladung 	+0... +50°C&lt;br /&gt;
 Temperaturbereich bei Entladung 	-10... +50°C&lt;br /&gt;
 Temperaturbereich bei Lagerung 	-20... +60°C&lt;br /&gt;
 Lebensdauer 	über 10 Jahre&lt;br /&gt;
 Zyklenlebensdauer 	über 6000 bei 90% Entladetiefe&lt;br /&gt;
 BMS / Überwachung 	integriert in jedem Modul&lt;br /&gt;
 Garantie 	10 Jahre Garantie&lt;br /&gt;
 Zertifizierung 	TüV / CE / UN38.8 &lt;br /&gt;
 Abmessungen（mm） 440*410*89&lt;br /&gt;
&lt;br /&gt;
=Innenleben=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech US2000B Opened.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_BatteryLabel.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_BalancerConnector_1.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_BalancerBoard_2.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_BalancerBoad_1.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_OpenBatteryPack.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_MainConnectors.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_BalancerConnector.png|mini]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, dass im Gehaeuse 15 Einzelzellen in Serie/Reihe geschaltet sind. 15 Zellen zu je 3,2 Volt Nennspannung ergeben 48 Volt Gesamtnennspannung. Wenn jede Zelle wie angegeben 50 Ah an Kapazitaet besitzt, ergibt sich die Gesamtkapaztaet zu (3,2 V * 50 Ah * 15 Stueck) zu 2400 Wh.&lt;br /&gt;
15 Zellen sind insofern unguenstig, dass sie sich nicht mit &amp;quot;16ern&amp;quot; parallel betreiben lassen. Die 15 &amp;quot;Stück&amp;quot; sind auf 3 Pakete aufgeteilt. (NB: Eigentlich sind es nicht 15 sondern 30 s.u.) Beim Selbstbau (DiY) wuerde ich 16ern bevorzugen, nicht zuletzt da beim Ali oft 16er-Zellenpakete angeboten werden. &lt;br /&gt;
&lt;br /&gt;
Bei einer Zellenkapazitaet von 50 Ah ergibt sich C zu 50 A. Somit sind 0.1C = 5 A, 0.5C = 25 A und 2C = 100 A wie oben benutzt. &lt;br /&gt;
&lt;br /&gt;
In einem Pylontech US2000(B) befinden sich 3 von Pylontech selbst konfektionierte Einheiten (Packs) zu je 10 Zellen sogenannten Beutelzellen (https://de.wikipedia.org/wiki/Pouch-Zelle). Im Pack sind 5 Zellen in Reihe und jeweils 2 parallel (5S2P). &lt;br /&gt;
Der Aufdruck 20 V erschlieszt sich mir nicht so recht. Jedes Paket haette somit eine Nominalspannung von 16 Volt.&lt;br /&gt;
&lt;br /&gt;
Warum der Balancer Ausschluss 10 Pole besitzt kann ich so auch nicht nachvollziehen. Ich haette bei 5S 6 Pins erwartet. Wenn mir jemand eine defekte Pylontech-Batterie zur Verfuegung stellt werde ich es herausfinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==LiIon/LiPo/LiFePO4 Zellen==&lt;br /&gt;
Fuer den der sich schon mit Li-Ion oder LiPos (im Modellbau sehr verbreitet) auskennt.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Vergleich Li-Ion/LiPo und LiFePO4 (LFP)&lt;br /&gt;
|-&lt;br /&gt;
! !!Li-Ion/LiPo!! LiFePO!!US2000 (Werte mal 15)&lt;br /&gt;
|-&lt;br /&gt;
|Nennspannung||3,6 V - 3,7 V|| 3,2 V|| 48 V&lt;br /&gt;
|-&lt;br /&gt;
|Ladeschlussspannung|| 4,2 V - 4,22 V|| 3,5 - 3,65 V (Herstellerabhängig) || 52,5  V - 54,75 V&lt;br /&gt;
|-&lt;br /&gt;
|Entladeschlussspannung|| 2,5 V - 3,0 V || 2,0 V - 2,8 V (Herstellerabhängig) || 30 V - 42 V&lt;br /&gt;
|-&lt;br /&gt;
|Initialladung|| || 3,8 - 4,0 V (Herstellerabhängig)|| 57 V - 60 V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Spannungsbereich: 3V - 3,4V pro Zelle. Das bedeutet die &amp;quot;gesunde&amp;quot; Spannungsbereich laege zwischen 45 V und 51 V. Ich habe allerdings auch schon Empfehlungen fuer die Ladeschlussspannung von 52,5 V und auch vereinzelt auch 53,5 V gesehen. &lt;br /&gt;
&lt;br /&gt;
Eine Schutzabschaltung greift in der Regel bei ca. 3,8 V (60 V bei US2000).&lt;br /&gt;
&lt;br /&gt;
 Leicht reduzierte Ladeschlussspannungen (3,4–3,5 V) und verringerte Entladetiefen wirken sich positiv auf die nutzbare Zyklenanzahl und damit die Lebensdauer aus. &lt;br /&gt;
&lt;br /&gt;
[https://de.wikipedia.org/wiki/Lithium-Eisenphosphat-Akkumulator Lithium-Eisenphosphat-Akkumulator]&lt;br /&gt;
&lt;br /&gt;
[https://enerprof.de/blog/technische-anleitungen/li-ion-vs.-lifepo4-mythen-und-realitaet]&lt;br /&gt;
&lt;br /&gt;
 Im Gegensatz zu herkömmlichen Lithium-Ionen-Zellen mit Lithium-Cobalt(III)-oxid (LiCoO2) wird bei der chemischen Reaktion kein Sauerstoff freigesetzt. Dieser kann bei Lithium-Ionen-Akkumulatoren mit Lithium-Cobaltoxid-Kathoden zum thermischen Durchgehen führen, was unter ungünstigen Bedingungen zum selbstständigen Entflammen der Zelle führt. &lt;br /&gt;
&lt;br /&gt;
 Die Energiedichte von Lithium-Eisen-Phosphat-Akkumulatoren liegt bei 90 Wh/kg bis 110 Wh/kg.&lt;br /&gt;
&lt;br /&gt;
 Allerdings wird der Ersatz anderer Lithium-Ionen-Akkutechnologien bzw. die Umstellung dieser auf LiFePO4-Akkus durch die abweichende typische Zellenspannung von 3,2–3,3 V eher erschwert (3,6 V beim Lithium-Ionen-Akku auf Cobalt-Basis, 3,7 V beim Lithium-Polymer-Akku). Bereits vorhandene Batteriemanagementsysteme, Balancer und Ladegeräte für die Anwendung bei Lithium-Ionen-Akkus auf Cobalt-Basis lassen sich nur selten auf LiFePO4-Akku umkonfigurieren.&lt;br /&gt;
&lt;br /&gt;
===Ladeverfahren CCCV===&lt;br /&gt;
&lt;br /&gt;
Bei diesem Ladeverfahren werden die Akkus zuerst mit einem konstanten Strom geladen. Dadurch wird der Ladestrom begrenzt und es wird in der Anfangsphase ein zu hoher Ladestrom vermieden. Die Ladung mit konstantem Strom erfolgt solange bis die Ladeschlussspannung erreicht ist. Dieser Wert wird bei etwa 70 % bis 80 % der Nennkapazität erreicht. Anschließend wird mit konstanter Spannung weitergeladen wodurch die Ladeschlussspannung nicht überschritten werden kann. Mit steigender Ladung verringert sich der Ladestrom.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Empfohlene Ladestroeme&lt;br /&gt;
|-&lt;br /&gt;
|8-19 Ah|| 2 A&lt;br /&gt;
|-&lt;br /&gt;
|20-49 Ah|| 4 A&lt;br /&gt;
|-&lt;br /&gt;
|50 - 99 Ah|| 10 A&lt;br /&gt;
|-&lt;br /&gt;
|100 - 199 Ah || 20 A&lt;br /&gt;
|-&lt;br /&gt;
|&amp;gt;200 Ah || 40 A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein 10 Ah Akku ist mit einem 2 A (1/5 C = 0,2C) Ladegerät in etwas über 5 Stunden voll geladen.&lt;br /&gt;
&lt;br /&gt;
Prinzipiell können Sie einen LiFePO4-Akku aber auch locker mit 1 C laden. Das heißt, einen 10 Ah Akku mit 10 A Ladestrom. Der Akku ist dann in einer Stunde voll. Dieses schnelle Laden erzeugt in den Zellen jedoch Wärme, welche der Lebensdauer abträglich ist.&lt;br /&gt;
&lt;br /&gt;
=Anschluesse, Schalter und LEDs=&lt;br /&gt;
&lt;br /&gt;
==POWER==&lt;br /&gt;
&lt;br /&gt;
PowerSwitch: Hauptschalter zum Ein-/Ausschalten des BMS. Das BMS geht beim Einschalten in Standby. Es liegt keine Spannung an den Batterieanschluessen. Die ON/OFF LED (gruen) wurde beim US3000C eingespart.&lt;br /&gt;
&lt;br /&gt;
==SW==&lt;br /&gt;
&lt;br /&gt;
Der Startknopf muss fuer mehr als 0,5 Sekunden gedrueckt werden, damit das BMS startet. Danach liegt die Batteriespannung an den Batteriepolen.&lt;br /&gt;
&lt;br /&gt;
==RUN==&lt;br /&gt;
&lt;br /&gt;
==ALM==&lt;br /&gt;
&lt;br /&gt;
==SOC==&lt;br /&gt;
&lt;br /&gt;
6 gruene LEDs zeigen den aktuellen Ladezustand. Die genauen Werte muss ich noch herausfinden. Z.B. bei einem Ladezustand von 8% sind alle LEDs aus, 27% LED1 leuchtet LED2 blinkt, 37%-41% LED1/2 leuchten LED3 blinkt&lt;br /&gt;
&lt;br /&gt;
==ADD==&lt;br /&gt;
&lt;br /&gt;
ADD Switches. Was ADD bedeutet habe ich noch nicht herausgefunden. Das Maeuseklavier (DIP-Switches) hat 4 Schalter.&lt;br /&gt;
DIP 1 ist zum Einstellen der Baudrate des RS485-Ports. Es kann zwischen 1:9600 und 0:115200 gewechselt werden.&lt;br /&gt;
&lt;br /&gt;
DIP2-4 dient zum Einstellen der Adresse der Master (NB: Die bis zu 7 Slaves erhalten ihre Adresse automatisch).&lt;br /&gt;
Dabei folgen die Einstellungen der binaeren Zaehlweise in umgekehrter Richtung (DIP 2 low und DIP 4 high).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CONSOLE==&lt;br /&gt;
 &lt;br /&gt;
Der ConsolePort ist eine RJ-14 (6P4C) (oft falsch als RJ-11 (6P2C) angegeben)  Port mit RS232-Protokoll. Der ConsolePort des US3000C ist eine R-J45 (8P8C) Port.&lt;br /&gt;
Zu achten ist bei den Bezeichnungen RXD und TXD auf die Seite des Anschlusses. Beim Anschluss der RS232-Kommunikation-Partner werden RXD und TXD ueber Kreuz angeschlossen, was zu einem Verstauchen der Anschlussbezeichnungen fuehrt. RXD und TXD bei einem Kabel nur einmal anzugeben ist mehr als irrefuehrend. Vielmehr muss es auf jeder Stecker-/Buchsenseite angegeben werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Pinbelegung RJ-14 (RJ-11)&lt;br /&gt;
|-&lt;br /&gt;
|Pin RJ-14||Pin RJ-11||RS232 Protokoll&lt;br /&gt;
|-&lt;br /&gt;
|1||NC||-&lt;br /&gt;
|-&lt;br /&gt;
|2||1||GND&lt;br /&gt;
|-&lt;br /&gt;
|3||2||RXD&lt;br /&gt;
|-&lt;br /&gt;
|4||3||TXD&lt;br /&gt;
|-&lt;br /&gt;
|5||4||GND&lt;br /&gt;
|-&lt;br /&gt;
|6||NC||-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Datei:RJ12 6P6C.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Eine Vielzahl von Seiten beschaeftigt sich mit dem Auslesen des Consolenports.&lt;br /&gt;
&lt;br /&gt;
[https://powerforum.co.za/topic/2322-youdas-off-grid-lab/page/6/][https://github.com/Interster/PylonTechBattery]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:800px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;9. Juli 2017 reimer22 photovoltaikforum.com&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
Ich habe 4 der Pylontech US2000B Batterien im Betrieb und der Hersteller knausert mit der Herausgabe des Protokolls für das Auslesen der Batterien. Stand jetzt sind dazu keine Informationen im Internet und den Manuals verfügbar. Erst recht hält sich der Hersteller bedeckt.&lt;br /&gt;
Hier ist also die Anleitung wie man den Batterien die Informationen entlocken kann. Ich benötige die Daten der Batterien, weil die an meinem Wechselrichter PIP4048MS einstellbaren Spannungen für den Speicher zu ungenau sind und durch die flache Kennlinie auch unbrauchbar. Deshalb habe ich mir jetzt ein Programm geschrieben um den PIP bei der 23% Schwelle auf Netzbetrieb umzuschalten.&lt;br /&gt;
&lt;br /&gt;
Die Batterie kann über den Console Port ausgelesen werden. Bis zu 8 Batterien in Reihe können angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Zuerst muss die Konsole aktiviert werden. Dazu das Terminalprogramm auf 1200, 8,N,1 umschalten.&lt;br /&gt;
&lt;br /&gt;
Dann den folgenden Hexstring an die Batterie senden:&lt;br /&gt;
&lt;br /&gt;
Data: 7E 32 30 30 31 34 36 38 32 43 30 30 34 38 35 32 30 46 43 43 33 0D&lt;br /&gt;
&lt;br /&gt;
Jetzt auf 115200,8,N,1 umschalten..&lt;br /&gt;
&lt;br /&gt;
Data: 0D 0A senden.&lt;br /&gt;
&lt;br /&gt;
Es erscheint der pylon&amp;gt; Prompt, der die Eingabe von Kommandos ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Erstes Kommando z.B.&lt;br /&gt;
&lt;br /&gt;
help\n (\n = Linefeed Zeichen 0A)&lt;br /&gt;
&lt;br /&gt;
zeigt eine Hilfe&lt;br /&gt;
&lt;br /&gt;
pwr\n&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
@&lt;br /&gt;
&lt;br /&gt;
Power Volt Curr Tempr Tlow Thigh Vlow Vhigh Base.St Volt.St Curr.St Temp.St Coulomb Time B.V.St B.T.St&lt;br /&gt;
&lt;br /&gt;
1 49884 4310 28000 25000 26000 3322 3327 Charge Normal Normal Normal 31 % 2017 - 07 - 09 14:56 : 37 Normal Normal&lt;br /&gt;
&lt;br /&gt;
2 49832 4472 28000 25000 25000 3321 3323 Charge Normal Normal Normal 31 % 2017 - 07 - 09 14:56 : 36 Normal Normal&lt;br /&gt;
&lt;br /&gt;
3 49842 4318 28000 25000 25000 3322 3324 Charge Normal Normal Normal 30 % 2017 - 07 - 09 14:56 : 36 Normal Normal&lt;br /&gt;
&lt;br /&gt;
4 49858 4111 27000 23000 23000 3322 3325 Charge Normal Normal Normal 30 % 2017 - 07 - 09 14:56 : 36 Normal Normal&lt;br /&gt;
&lt;br /&gt;
5 - ------Absent - ------&lt;br /&gt;
&lt;br /&gt;
6 - ------Absent - ------&lt;br /&gt;
&lt;br /&gt;
7 - ------Absent - ------&lt;br /&gt;
&lt;br /&gt;
8 - ------Absent - ------&lt;br /&gt;
&lt;br /&gt;
Command completed successfully&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
Die Zahlen sind als Festkommazahlen angegeben und müssen meistens durch 1000 geteilt werden.&lt;br /&gt;
&lt;br /&gt;
Im Admin Mode stehen sehr viele Routinen zur Verfügung von deren Verwendung abzuraten ist. Bis auf Chip-Ebene um einzelne Chips auf dem Board zu testen.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
getpwr 1\n&lt;br /&gt;
...&lt;br /&gt;
getpwr 8\n&lt;br /&gt;
&lt;br /&gt;
können die u.a. Zellenspannungen ausgelesen werden. Die Batterien loggen extrem viel. Es lässt sich z.B. eine Event Historie auslesen.&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl soh\n kann man den State of Health auslesen.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==CAN==&lt;br /&gt;
&lt;br /&gt;
==RS485==&lt;br /&gt;
&lt;br /&gt;
==Link Port 0==&lt;br /&gt;
&lt;br /&gt;
==Link Port 1==&lt;br /&gt;
&lt;br /&gt;
==Dry Contact Terminal==&lt;br /&gt;
&lt;br /&gt;
==Power Terminals==&lt;br /&gt;
&lt;br /&gt;
=Unterschiedliche Varianten=&lt;br /&gt;
&lt;br /&gt;
[https://voltaconsolar.com/blog/2019/08/15/pylontech-announces-change-in-name-for-us2000-lithium-batteries/]&lt;br /&gt;
&lt;br /&gt;
[https://voltaconsolar.com/blog/wp-content/uploads/2019/08/US2000B-US2000-PLUS-difference-and-instruction.pdf]&lt;br /&gt;
&lt;br /&gt;
[https://www.victronenergy.com/live/_media/battery_compatibility:pylon-diagram-2018-12-28.jpg]&lt;br /&gt;
&lt;br /&gt;
[https://www.victronenergy.com/live/battery_compatibility:pylontech_phantom]&lt;br /&gt;
&lt;br /&gt;
[https://support.batrium.com/article/110-how-to-control-victron-gx-with-watchmon]&lt;br /&gt;
&lt;br /&gt;
[https://www.victronenergy.com/live/battery_compatibility:pylontech_phantom]&lt;br /&gt;
&lt;br /&gt;
[https://www.zerohomebills.com/victron-and-pylontech-solar-battery-systems/]&lt;br /&gt;
&lt;br /&gt;
==Test-Verbindung CAN-Bus Linux-PC==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:600px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;US2000 CAN Mitschnitt&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
worker:~ # ip link set can0 down&lt;br /&gt;
worker:~ # ip link set can0 up type can bitrate 500000&lt;br /&gt;
worker:~ # ip link set can0 up&lt;br /&gt;
worker:~ # candump can0&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es handelt sich wohl um einen Standard-Frame. Die Kommunikationsrate sind 500 kbps und der Sendezyklus ist eine Sekunde.&lt;br /&gt;
Der Laderegler sollte mit 0x305:00-00-00-00-00-00-00-00 antworten. Ich habe noch nicht getestet was passiert wenn er nicht antwortet.&lt;br /&gt;
&lt;br /&gt;
Jetzt geht es darum die Daten zu interpretieren.&lt;br /&gt;
&lt;br /&gt;
Einen Hinweis darauf habe ich [https://www.setfirelabs.com/green-energy/pylontech-can-reading-can-replication hier] gefunden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|CAN-BUS Mitschnitt&lt;br /&gt;
|-&lt;br /&gt;
!CAN-ID!!Byteanzahl!!Mitschnit!!Bedeutung (EN)!!Bedeutung DE)||Interpretation&lt;br /&gt;
|-&lt;br /&gt;
|0x351||[8]||14 02 FA 00 FA 00 C2 01||Battery voltage + current limits||Akku Ladespannung und Stromgrenzen fuer Laden und Entladen||siehe Folgetabelle  CAN-ID 0x351&lt;br /&gt;
|-&lt;br /&gt;
|0x355||[4]||32 00 64 00||State of Health (SOH) / State of Charge (SOC)||Akku &amp;quot;Gesundheits&amp;quot;-Zustand und Ladezustand||siehe Folgetabelle  CAN-ID 0x355&lt;br /&gt;
|-&lt;br /&gt;
|0x356||[6]|| 44 13 00 00 B7 00||Voltage / Current / Temp||Akkustatus: Spannung, Strom, Temperatur||siehe Folgetabelle  CAN-ID 0x356&lt;br /&gt;
|-&lt;br /&gt;
|0x35C||[2]||C0 00||Battery charge request flags||3 Flags (Anfrage/Anforderung) zu Laden und Entladen||siehe Folgetabelle  CAN-ID 0x35C&lt;br /&gt;
|-&lt;br /&gt;
|0x35E||[8]||50 59 4C 4F 4E 20 20 20||Manufacturer name||Herstellername in ASCII||“PYLON   “&lt;br /&gt;
|-&lt;br /&gt;
|0x359||[7]||00 00 00 00 01 50 4E||Protection &amp;amp; Alarm flags||Schutz und Alarm Flags||siehe Folgetabelle  CAN-ID 0x359&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 1000px;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;9&amp;quot;  style=&amp;quot;background-color:#ffffcc;&amp;quot;|CAN-ID 0x351 (8 Bytes; Byte 7 und 8 nicht dokumentiert\!\!\!)&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;!!Bit 7!!Bit 6!!Bit 5!!Bit 4!!Bit 3!!Bit 2!!Bit 1!!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|Byte 1||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Ladespannung (Datentyp: 16 Bit unsigned integer; Byte-Order: Little Endian; Korrekturfaktor: 0,1; Einheit: Volt)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 2&lt;br /&gt;
|-&lt;br /&gt;
|Byte 3||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Ladestrombegrenzung (Datentyp: 16 Bit signed integer, Zweierkomplement; Byte-Order: Little Endian; Korrekturfaktor: 0,1; Einheit: Ampere)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 4&lt;br /&gt;
|-&lt;br /&gt;
|Byte 5||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Entladestrombegrenzung (Datentyp: 16 Bit signed integer, Zweierkomplement; Byte-Order: Little Endian; Korrekturfaktor: 0,1; Einheit: Ampere)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 6&lt;br /&gt;
|-&lt;br /&gt;
|Byte 7||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|???&lt;br /&gt;
|-&lt;br /&gt;
|Byte 8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 1000px;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;9&amp;quot;  style=&amp;quot;background-color:#ffffcc;&amp;quot;|CAN-ID 0x355 (4 Bytes)&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;!!Bit 7!!Bit 6!!Bit 5!!Bit 4!!Bit 3!!Bit 2!!Bit 1!!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|Byte 1||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Ladezustand (SOC) (Datentyp: 16 Bit unsigned integer; Byte-Order: Little Endian; Korrekturfaktor: 1; Einheit: Prozent)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 2&lt;br /&gt;
|-&lt;br /&gt;
|Byte 3||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Betriebszustand (SOH) (Datentyp: 16 Bit unsigned integer; Byte-Order: Little Endian; Korrekturfaktor: 1; Einheit: Prozent)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 1000px;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;9&amp;quot;  style=&amp;quot;background-color:#ffffcc;&amp;quot;|CAN-ID 0x356 (6 Bytes)&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;!!Bit 7!!Bit 6!!Bit 5!!Bit 4!!Bit 3!!Bit 2!!Bit 1!!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|Byte 1||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Spannung (Datentyp: 16 Bit signed integer, Zweierkomplement; Byte-Order: Little Endian; Korrekturfaktor: 0,01; Einheit: Volt)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 2&lt;br /&gt;
|-&lt;br /&gt;
|Byte 3||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Strom (Datentyp: 16 Bit signed integer, Zweierkomplement; Byte-Order: Little Endian; Korrekturfaktor: 0,1; Einheit: Ampere)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 4&lt;br /&gt;
|-&lt;br /&gt;
|Byte 5||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Temperatur (Datentyp: 16 Bit signed integer, Zweierkomplement; Byte-Order: Little Endian; Korrekturfaktor: 0,1; Einheit: Grad Celsius)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 1000px;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;10&amp;quot;  style=&amp;quot;background-color:#ffffcc;&amp;quot;|CAN-ID 0x359 (7 Bytes)&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;!!Bit 7!!Bit 6!!Bit 5!!Bit 4!!Bit 3!!Bit 2!!Bit 1!!Bit 0!!&lt;br /&gt;
|-&lt;br /&gt;
|Byte 1||Ueberstrom (Entladung)|| || ||Untertemperatur||Uebertemperatur||Unterspannung||Uebertemperatur(Ueberspannung?)|| ||rowspan=&amp;quot;2&amp;quot;|Alarm&lt;br /&gt;
|-&lt;br /&gt;
|Byte 2|| || || || ||BMS intern|| || ||Ueberstrom (Ladung)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 3||Hoher Strom (Entladung)|| || ||Niedrige Temperatur||Hohe Temperatur||Niedrige Spannung||Hohe Spannung|| ||rowspan=&amp;quot;2&amp;quot;|Warnung&lt;br /&gt;
|-&lt;br /&gt;
|Byte 4|| || || || ||BMS intern|| || ||Hoher Strom (Ladung)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 5||colspan=&amp;quot;8&amp;quot;|Akkupack-Nummer (Datentyp: 8 Bit unsigned Character)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 6||&#039;P&#039; (0x50)||colspan=&amp;quot;7&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Byte 7||&#039;N&#039; (0x4E)||colspan=&amp;quot;7&amp;quot;|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 1000px;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;9&amp;quot;  style=&amp;quot;background-color:#ffffcc;&amp;quot;|CAN-ID 0x35C (2 Bytes)&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;!!Bit 7!!Bit 6!!Bit 5!!Bit 4!!Bit 3!!Bit 2!!Bit 1!!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|Byte 1||Laden eingeschaltet||Entladen eingeschaltet||Sofortladung|| || || || || &lt;br /&gt;
|-&lt;br /&gt;
|Byte 2|| || || || || || || || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 1000px;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;9&amp;quot;  style=&amp;quot;background-color:#ffffcc;&amp;quot;|CAN-ID 0x35E&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;!!Bit 7!!Bit 6!!Bit 5!!Bit 4!!Bit 3!!Bit 2!!Bit 1!!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|Byte 1||colspan=&amp;quot;8&amp;quot;|&#039;P&#039; (0x50)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 2||colspan=&amp;quot;8&amp;quot;|&#039;Y&#039; (0x59)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 3||colspan=&amp;quot;8&amp;quot;|&#039;L&#039; (0x4C)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 4||colspan=&amp;quot;8&amp;quot;|&#039;O&#039; (0x4F)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 5||colspan=&amp;quot;8&amp;quot;|&#039;N&#039; (0x4E)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 6||colspan=&amp;quot;8&amp;quot;|&#039; &#039; (0x20)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 7||colspan=&amp;quot;8&amp;quot;|&#039; &#039; (0x20)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 8||colspan=&amp;quot;8&amp;quot;|&#039; &#039; (0x20)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Verbindung zu VE (Cerbo)=&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;Anschluss A/CAN&#039;&#039;&#039; am Master-Pylontech US3000C wird am Cerbo GX an den BMS‑CAN-Anschluss angeschlossen – nicht an VE.Bus und beim ursprünglichen Cerbo möglichst nicht an VE.Can.&lt;br /&gt;
&lt;br /&gt;
Bei deinem ursprünglichen Cerbo GX&lt;br /&gt;
Pylontech A/CAN → Cerbo BMS‑CAN&lt;br /&gt;
Der BMS‑CAN-Port arbeitet fest mit 500 kbit/s.&lt;br /&gt;
In den zweiten BMS‑CAN-Anschluss des Cerbo kommt der blaue VE.Can-Abschlusswiderstand.&lt;br /&gt;
&lt;br /&gt;
So wie es aussieht kann man die an den weißen Kunststoff RJ45-Buchsen erkennen.&lt;br /&gt;
Die alten (Plus und B) Varianten hatten silberfarbenen Blech-RJ45 Buchsen. (Nachtrag: Meine 07/2022 gekauften US3000C haben ebenfalls Blech-RJ45-Buchsen. Nur auf den Bildern im Manual sind weiße Kunststoff-Buchsen zu sehen.)&lt;br /&gt;
&lt;br /&gt;
 Kabel 1 WI0SCAN30RJ1 1~3 NA 4-8 PIN-PIN (blaue Faehnchen)&lt;br /&gt;
 Kabel 2 WI0SCAN35RJ3 (silberne Faehnchen)&lt;br /&gt;
&lt;br /&gt;
Pylontech CAN zur Ausgabe von Batterieinformationen&lt;br /&gt;
Pinbelegung Typ B: &lt;br /&gt;
 1-NC&lt;br /&gt;
 2-GND&lt;br /&gt;
 3-NC &lt;br /&gt;
 4-CANH &lt;br /&gt;
 5-CANL&lt;br /&gt;
 6-NC&lt;br /&gt;
 7-NC&lt;br /&gt;
 8-NC&lt;br /&gt;
&lt;br /&gt;
BMS-Can (Cerbo A20 Eintein wurde spaeter scheinbar zu VE.Can 1/2)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!align=&amp;quot;left&amp;quot;| RJ45-Pin&lt;br /&gt;
! Signal&lt;br /&gt;
! Deine Messung&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 1&lt;br /&gt;
| NET-C / V− / GND&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 2&lt;br /&gt;
| NET-S / V+ / V_CAN&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 3&lt;br /&gt;
| NET-C / V− / GND&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 4&lt;br /&gt;
| nicht verbunden&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 5&lt;br /&gt;
| nicht verbunden&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| elektrisch auffällig, siehe unten&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 6&lt;br /&gt;
| NET-S / V+ / V_CAN&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 7&lt;br /&gt;
| CAN-H&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 8&lt;br /&gt;
| CAN-L&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Unterschied ist hauptsächlich die Pinbelegung auf der Batterieseite:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Signal&amp;amp;nbsp;||Victron-Seite||Typ A, Batterieseite||Typ B, Batterieseite&lt;br /&gt;
|-&lt;br /&gt;
|GND||Pin 3||	Pin 6||	Pin 2&lt;br /&gt;
|-&lt;br /&gt;
|CAN-H||Pin 7||	Pin 4||	Pin 4&lt;br /&gt;
|-&lt;br /&gt;
|CAN-L||Pin 8||	Pin 5||	Pin 5&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
CAN-H und CAN-L sind also identisch; lediglich GND liegt bei Typ A auf Pin 6 und bei Typ B auf Pin 2.&lt;br /&gt;
&lt;br /&gt;
Kurz gesagt:&lt;br /&gt;
&lt;br /&gt;
*US3000 → Typ B&lt;br /&gt;
*US3000C → Typ A&lt;br /&gt;
*US2000 → Typ B&lt;br /&gt;
*US2000C/US2000D → Typ A&lt;br /&gt;
*US5000/US5000B → Typ A&lt;br /&gt;
*UP2500 → Typ B&lt;br /&gt;
*UP5000 → Typ A&lt;br /&gt;
&lt;br /&gt;
Die offizielle Pinbelegung des A-CAN-Anschlusses (RJ45-Buchse) am Pylontech US3000C lautet wie folgt:&lt;br /&gt;
Pin 1: Nicht belegt (frei lassen)&lt;br /&gt;
Pin 2: Nicht belegt / Ggf. intern belegt (Pins 1–3 nicht beschalten, da dies die BMS-Kommunikation stören kann)&lt;br /&gt;
Pin 3: Nicht belegt (frei lassen)&lt;br /&gt;
Pin 4: CAN-H (High-Signal)Pin 5: CAN-L (Low-Signal)&lt;br /&gt;
Pin 6: CAN-GND (Masse/Ground)&lt;br /&gt;
Pin 7: Nicht für CAN genutzt (reserviert für RS485 A)&lt;br /&gt;
Pin 8: Nicht für CAN genutzt (reserviert für RS485 B)&lt;br /&gt;
&lt;br /&gt;
 Wichtig: Die ersten drei Pins sollten bei einem Eigenbau- oder Verbindungskabel zum Wechselrichter nicht belegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Kabel WIOSCAN30RJ1 (1~3 NC und 4~8 1:1) laesst sich also zu einem Typ A Kbael wunderbar umbauen. Die Inverterseite abknipsen. An der BATTERY-Seite (Blaues Faehnchen dran lassen) sind bereits die PINS 1~3 nicht belegt, das ist sehr gut und wie gefordert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:VictronCerbo Pylontech BMS Kabel.png|600px|alternativtext=VictronCerbo Pylontech BMS Kabel|VictronCerbo Pylontech BMS Kabel]]&lt;br /&gt;
&lt;br /&gt;
 The battery with the empty link port 0 is the master battery. You must use the VE.Can to CAN-bus BMS type B Cable, part number ASS030720018 for connection with US2000/US3000/UP2500; and VE.Can to CAN-bus BMS type A Cable, part number ASS030710018 for connection with US2000C/US3000C/UP5000/Force-L, you cannot use the cable supplied by Pylontech.&lt;br /&gt;
&lt;br /&gt;
=Batterie Ladekabel=&lt;br /&gt;
&lt;br /&gt;
 Das Pylontech Batteriekabelset enthält 2 x 2 Meter Kabel (Plus/Minus) mit je einem Querschnitt von 25mm² sowie einem Datenkabel mit 2 RJ45 Steckern. Sie benötigen es um die Batterien von Pylontech US2000B Plus mit dem Wechselrichter zu verbinden. Anschlüsse: 2 x Amphenol (Pylontech) 2 x M8 Ringkabelschuh.&lt;br /&gt;
&lt;br /&gt;
 Das Pylontech Batterieanschlusskabelset (MPN BW0US3000BAL0002) beinhaltet 2 x 2 Meter Kabel (Plus/Minus) mit je einem Querschnitt von 25mm² und ein CAN-Datenkabel mit RJ45 Steckern beidseitig.Das Set wird benötigt um die Batterien von Pylontech mit einem Wechselrichter zu verbinden.&lt;br /&gt;
&lt;br /&gt;
 2m Kabel Plus mit M8 Ringkabelschuh- und Amphenolanschluss (Pylontech)&lt;br /&gt;
 2m Kabel Minus mit M8 Ringkabelschuh- und Amphenolanschluss (Pylontech) &lt;br /&gt;
&lt;br /&gt;
 For 48V Pylontech, the cable is AWG 4 (=21mm2) and the terminals are Amphenol SurLok Plus.&lt;br /&gt;
&lt;br /&gt;
In the battery module itself, there&#039;s even a temperature sensor sealed in the every terminal.&lt;br /&gt;
&lt;br /&gt;
=Schaltfolgen=&lt;br /&gt;
&lt;br /&gt;
Der Powerswitch (Ein-Ausschalter mit 0 1 gekennzeichnet, mit POWER bezeichnet und mit einer Schutzkappe versehen) wird mit Hauptschalter uebersetzt. Ich gehe mal davon aus, dass damit das BMS ein und ausgeschaltet wird. Das erklaert auch warum nach dem Einschalten noch keine Spannung an den Batterie-Polen anliegt. Erst wenn der rote Startknopf (SW) fuer mehr als 0,5 s gedrueckt wird nimmt das BMS seinen Betrieb auf und es liegt eine Spannung an den Batterie-Polen.  &lt;br /&gt;
&lt;br /&gt;
==ABSCHALTEN==&lt;br /&gt;
&lt;br /&gt;
- Pylon: 5 sec. die Taste drücken bis der Speicher die interne Sicherung schmeißt&lt;br /&gt;
&lt;br /&gt;
- Sicherungstrenner vom AC-Netz zum WR abschalten&lt;br /&gt;
&lt;br /&gt;
- WR (Gen24) DC-Trennschalter (Gehäuseschalter) rausnehmen.&lt;br /&gt;
&lt;br /&gt;
==ZUSCHALTEN==&lt;br /&gt;
&lt;br /&gt;
- Pylon einschalten (Gerätesicherung ein, dann Taster kurz drücken)&lt;br /&gt;
&lt;br /&gt;
- WR DC-Trennschalter einschalten&lt;br /&gt;
&lt;br /&gt;
- Sicherungstrenner AC-Netz zum Wechselrichter wieder einschalten.&lt;br /&gt;
&lt;br /&gt;
Ein warnender Hinweis zur Stromversorgung über den AC-Out-Anschluss eines VE.Bus-Inverter, Multi oder Quattro:&lt;br /&gt;
Wenn Sie das Cerbo GX von einem an den AC-Out-Port eines beliebigen VE.Bus-Produktes (Inverter, Multi oder Quattro)&lt;br /&gt;
angeschlossenen Netzteil mit Strom versorgen, tritt nach dem Abschalten der VE.Bus-Produkte aus irgendeinem Grund (nach&lt;br /&gt;
einem Betriebsfehler oder während eines Schwarzstarts) ein Deadlock auf. Die VE.Bus-Geräte booten nicht, bis das Cerbo GX&lt;br /&gt;
Strom hat, aber das Cerbo GX bootet nicht, bis es Strom hat. Dieser Deadlock kann durch kurzes Herausziehen des Cerbo&lt;br /&gt;
GX VE.Bus-Kabels korrigiert werden, an dem Sie beobachten werden, dass die VE.Bus-Produkte sofort mit dem Hochfahren&lt;br /&gt;
beginnen.&lt;br /&gt;
&lt;br /&gt;
 Reihenfolge: Egal ob einschalten oder ausschalten, die Netzstelle des Ladegerätes muss/sollte getrennt sein bevor man die Batterie/Akku trennt. Das heißt fuer den Pylontech abgeleitet: Pylontech an, dann WR an oder WR aus, dann Pylon aus.&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
[https://www.meintechblog.de/2022/02/operation-hausspeicher-28kwh-fuer-unter-7000euro/ 28kWh fuer 7000€]&lt;br /&gt;
[https://powerforum.co.za/topic/8524-pylontech-us2000-plus-teardown/ US2000 Teardown]&lt;br /&gt;
[https://www.youtube.com/watch?v=KY9GM9VmDlE US2000 Plus Inside]&lt;br /&gt;
[https://www.youtube.com/watch?v=IlExe2zcifM US2000 WLAN]&lt;br /&gt;
&lt;br /&gt;
=Request for Comments=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(Pylontech)_US2000_Lithium_Battery&amp;diff=5511</id>
		<title>(Pylontech) US2000 Lithium Battery</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(Pylontech)_US2000_Lithium_Battery&amp;diff=5511"/>
		<updated>2026-10-15T12:23:16Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Die Li-Ion Batterie (eigentlich LFP s.u.) von Pylontech wird gerne im Bundle mit den Victron Energy Charger/Inverter angeboten.&lt;br /&gt;
Worin sich genau die Typen US2000 Plus/B/C unterscheiden habe ich noch nicht herausgefunden.&lt;br /&gt;
&lt;br /&gt;
 Die US2000 haben eine Speicherkapazitaet von 2,4 kWh (48V 50Ah).&lt;br /&gt;
 Die US3000 haben eine Speicherkapazitaet von 3,5 kWh.  3150 Wh (DoD 90%)&lt;br /&gt;
&lt;br /&gt;
Auf der [https://voltaconsolar.com/blog/2019/08/15/pylontech-announces-change-in-name-for-us2000-lithium-batteries/ Seite] sind zwei Pylontech abgebildet. Angeblich ein altes US2000 und ein neues US2000 B (Plus). Meins sieht aber so aus und gleicht keinem der Varianten so richtig.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech US2000NB05V00101.jpg|1000px|Pylontech US2000NB05V00101]]&lt;br /&gt;
&lt;br /&gt;
Ich besitze einen Pylontech mit der PartNumber: US2000NB05V00101&lt;br /&gt;
&lt;br /&gt;
Es handelt sich mit hoher Wahrscheinlichkeit um einen US2000B Plus.&lt;br /&gt;
Dies ist wichtig fuer die richtige Wahl des CAN-Bus Kabels. Die Pin-Belegung zwischen US2000 und US2000C bzw. US3000 hat sich geaendert.&lt;br /&gt;
&lt;br /&gt;
=Daten=&lt;br /&gt;
 PYLONTECH US2000&lt;br /&gt;
 Technologie 	Lithium-Eisenphosphat (LiFePo4)&lt;br /&gt;
 Nennspannung 	48V&lt;br /&gt;
 Nennkapazität 	50 Ah / 2,4 kWh&lt;br /&gt;
 Nutzbare Kapazität (90% DoD) 	45Ah / 2,2 kWh&lt;br /&gt;
 Entladespannungsbereich 	45,0 ... 54,0 V (Beachte: US3000C 44,5 ... 53,5 V)&lt;br /&gt;
 Ladespannungsbereich 	52,5 ... 54,0 V (Beachte: US3000C 52,5 ... 53,5 V)&lt;br /&gt;
 Maximaler Entladestrom 	100 A (2C) @ 15s.&lt;br /&gt;
 Maximaler Ladestrom 	100 A (2C)@ 15s.&lt;br /&gt;
 Empf. Dauer Entladestrom 	25 A (0.5C)&lt;br /&gt;
 Empf. Dauer Ladestrom 	25 A (0.5C)&lt;br /&gt;
 Kommunikation 	RS232, RS485, CAN&lt;br /&gt;
 Gewicht 	24 kg&lt;br /&gt;
 Abmessungen 	440 x 410 x 89 mm&lt;br /&gt;
 Schutzart 	IP20&lt;br /&gt;
 Temperaturbereich bei Ladung 	+0... +50°C&lt;br /&gt;
 Temperaturbereich bei Entladung 	-10... +50°C&lt;br /&gt;
 Temperaturbereich bei Lagerung 	-20... +60°C&lt;br /&gt;
 Lebensdauer 	über 10 Jahre&lt;br /&gt;
 Zyklenlebensdauer 	über 6000 bei 90% Entladetiefe&lt;br /&gt;
 BMS / Überwachung 	integriert in jedem Modul&lt;br /&gt;
 Garantie 	10 Jahre Garantie&lt;br /&gt;
 Zertifizierung 	TüV / CE / UN38.8 &lt;br /&gt;
 Abmessungen（mm） 440*410*89&lt;br /&gt;
&lt;br /&gt;
=Innenleben=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech US2000B Opened.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_BatteryLabel.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_BalancerConnector_1.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_BalancerBoard_2.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_BalancerBoad_1.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_OpenBatteryPack.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_MainConnectors.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech_US2000B_BalancerConnector.png|mini]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, dass im Gehaeuse 15 Einzelzellen in Serie/Reihe geschaltet sind. 15 Zellen zu je 3,2 Volt Nennspannung ergeben 48 Volt Gesamtnennspannung. Wenn jede Zelle wie angegeben 50 Ah an Kapazitaet besitzt, ergibt sich die Gesamtkapaztaet zu (3,2 V * 50 Ah * 15 Stueck) zu 2400 Wh.&lt;br /&gt;
15 Zellen sind insofern unguenstig, dass sie sich nicht mit &amp;quot;16ern&amp;quot; parallel betreiben lassen. Die 15 &amp;quot;Stück&amp;quot; sind auf 3 Pakete aufgeteilt. (NB: Eigentlich sind es nicht 15 sondern 30 s.u.) Beim Selbstbau (DiY) wuerde ich 16ern bevorzugen, nicht zuletzt da beim Ali oft 16er-Zellenpakete angeboten werden. &lt;br /&gt;
&lt;br /&gt;
Bei einer Zellenkapazitaet von 50 Ah ergibt sich C zu 50 A. Somit sind 0.1C = 5 A, 0.5C = 25 A und 2C = 100 A wie oben benutzt. &lt;br /&gt;
&lt;br /&gt;
In einem Pylontech US2000(B) befinden sich 3 von Pylontech selbst konfektionierte Einheiten (Packs) zu je 10 Zellen sogenannten Beutelzellen (https://de.wikipedia.org/wiki/Pouch-Zelle). Im Pack sind 5 Zellen in Reihe und jeweils 2 parallel (5S2P). &lt;br /&gt;
Der Aufdruck 20 V erschlieszt sich mir nicht so recht. Jedes Paket haette somit eine Nominalspannung von 16 Volt.&lt;br /&gt;
&lt;br /&gt;
Warum der Balancer Ausschluss 10 Pole besitzt kann ich so auch nicht nachvollziehen. Ich haette bei 5S 6 Pins erwartet. Wenn mir jemand eine defekte Pylontech-Batterie zur Verfuegung stellt werde ich es herausfinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==LiIon/LiPo/LiFePO4 Zellen==&lt;br /&gt;
Fuer den der sich schon mit Li-Ion oder LiPos (im Modellbau sehr verbreitet) auskennt.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Vergleich Li-Ion/LiPo und LiFePO4 (LFP)&lt;br /&gt;
|-&lt;br /&gt;
! !!Li-Ion/LiPo!! LiFePO!!US2000 (Werte mal 15)&lt;br /&gt;
|-&lt;br /&gt;
|Nennspannung||3,6 V - 3,7 V|| 3,2 V|| 51,2 V (48 V - 54,4 V)&lt;br /&gt;
|-&lt;br /&gt;
|Ladeschlussspannung|| 4,2 V - 4,22 V|| 3,5 - 3,65 V (Herstellerabhängig) || 56 V - 58,4V&lt;br /&gt;
|-&lt;br /&gt;
|Entladeschlussspannung|| 2,5 V - 3,0 V || 2,0 V - 2,8 V (Herstellerabhängig) || 32 V - 44,8 V&lt;br /&gt;
|-&lt;br /&gt;
|Initialladung|| || 3,8 - 4,0 V (Herstellerabhängig)|| 60 V - 64 V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Spannungsbereich: 3V - 3,4V pro Zelle &lt;br /&gt;
&lt;br /&gt;
Eine Schutzabschaltung greift in der Regel bei ca. 3,8 V (60 V bei US2000).&lt;br /&gt;
&lt;br /&gt;
 Leicht reduzierte Ladeschlussspannungen (3,4–3,5 V) und verringerte Entladetiefen wirken sich positiv auf die nutzbare Zyklenanzahl und damit die Lebensdauer aus. &lt;br /&gt;
&lt;br /&gt;
[https://de.wikipedia.org/wiki/Lithium-Eisenphosphat-Akkumulator Lithium-Eisenphosphat-Akkumulator]&lt;br /&gt;
&lt;br /&gt;
[https://enerprof.de/blog/technische-anleitungen/li-ion-vs.-lifepo4-mythen-und-realitaet]&lt;br /&gt;
&lt;br /&gt;
 Im Gegensatz zu herkömmlichen Lithium-Ionen-Zellen mit Lithium-Cobalt(III)-oxid (LiCoO2) wird bei der chemischen Reaktion kein Sauerstoff freigesetzt. Dieser kann bei Lithium-Ionen-Akkumulatoren mit Lithium-Cobaltoxid-Kathoden zum thermischen Durchgehen führen, was unter ungünstigen Bedingungen zum selbstständigen Entflammen der Zelle führt. &lt;br /&gt;
&lt;br /&gt;
 Die Energiedichte von Lithium-Eisen-Phosphat-Akkumulatoren liegt bei 90 Wh/kg bis 110 Wh/kg.&lt;br /&gt;
&lt;br /&gt;
 Allerdings wird der Ersatz anderer Lithium-Ionen-Akkutechnologien bzw. die Umstellung dieser auf LiFePO4-Akkus durch die abweichende typische Zellenspannung von 3,2–3,3 V eher erschwert (3,6 V beim Lithium-Ionen-Akku auf Cobalt-Basis, 3,7 V beim Lithium-Polymer-Akku). Bereits vorhandene Batteriemanagementsysteme, Balancer und Ladegeräte für die Anwendung bei Lithium-Ionen-Akkus auf Cobalt-Basis lassen sich nur selten auf LiFePO4-Akku umkonfigurieren.&lt;br /&gt;
&lt;br /&gt;
===Ladeverfahren CCCV===&lt;br /&gt;
&lt;br /&gt;
Bei diesem Ladeverfahren werden die Akkus zuerst mit einem konstanten Strom geladen. Dadurch wird der Ladestrom begrenzt und es wird in der Anfangsphase ein zu hoher Ladestrom vermieden. Die Ladung mit konstantem Strom erfolgt solange bis die Ladeschlussspannung erreicht ist. Dieser Wert wird bei etwa 70 % bis 80 % der Nennkapazität erreicht. Anschließend wird mit konstanter Spannung weitergeladen wodurch die Ladeschlussspannung nicht überschritten werden kann. Mit steigender Ladung verringert sich der Ladestrom.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Empfohlene Ladestroeme&lt;br /&gt;
|-&lt;br /&gt;
|8-19 Ah|| 2 A&lt;br /&gt;
|-&lt;br /&gt;
|20-49 Ah|| 4 A&lt;br /&gt;
|-&lt;br /&gt;
|50 - 99 Ah|| 10 A&lt;br /&gt;
|-&lt;br /&gt;
|100 - 199 Ah || 20 A&lt;br /&gt;
|-&lt;br /&gt;
|&amp;gt;200 Ah || 40 A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein 10 Ah Akku ist mit einem 2 A (1/5 C = 0,2C) Ladegerät in etwas über 5 Stunden voll geladen.&lt;br /&gt;
&lt;br /&gt;
Prinzipiell können Sie einen LiFePO4-Akku aber auch locker mit 1 C laden. Das heißt, einen 10 Ah Akku mit 10 A Ladestrom. Der Akku ist dann in einer Stunde voll. Dieses schnelle Laden erzeugt in den Zellen jedoch Wärme, welche der Lebensdauer abträglich ist.&lt;br /&gt;
&lt;br /&gt;
=Anschluesse, Schalter und LEDs=&lt;br /&gt;
&lt;br /&gt;
==POWER==&lt;br /&gt;
&lt;br /&gt;
PowerSwitch: Hauptschalter zum Ein-/Ausschalten des BMS. Das BMS geht beim Einschalten in Standby. Es liegt keine Spannung an den Batterieanschluessen. Die ON/OFF LED (gruen) wurde beim US3000C eingespart.&lt;br /&gt;
&lt;br /&gt;
==SW==&lt;br /&gt;
&lt;br /&gt;
Der Startknopf muss fuer mehr als 0,5 Sekunden gedrueckt werden, damit das BMS startet. Danach liegt die Batteriespannung an den Batteriepolen.&lt;br /&gt;
&lt;br /&gt;
==RUN==&lt;br /&gt;
&lt;br /&gt;
==ALM==&lt;br /&gt;
&lt;br /&gt;
==SOC==&lt;br /&gt;
&lt;br /&gt;
6 gruene LEDs zeigen den aktuellen Ladezustand. Die genauen Werte muss ich noch herausfinden. Z.B. bei einem Ladezustand von 8% sind alle LEDs aus, 27% LED1 leuchtet LED2 blinkt, 37%-41% LED1/2 leuchten LED3 blinkt&lt;br /&gt;
&lt;br /&gt;
==ADD==&lt;br /&gt;
&lt;br /&gt;
ADD Switches. Was ADD bedeutet habe ich noch nicht herausgefunden. Das Maeuseklavier (DIP-Switches) hat 4 Schalter.&lt;br /&gt;
DIP 1 ist zum Einstellen der Baudrate des RS485-Ports. Es kann zwischen 1:9600 und 0:115200 gewechselt werden.&lt;br /&gt;
&lt;br /&gt;
DIP2-4 dient zum Einstellen der Adresse der Master (NB: Die bis zu 7 Slaves erhalten ihre Adresse automatisch).&lt;br /&gt;
Dabei folgen die Einstellungen der binaeren Zaehlweise in umgekehrter Richtung (DIP 2 low und DIP 4 high).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CONSOLE==&lt;br /&gt;
 &lt;br /&gt;
Der ConsolePort ist eine RJ-14 (6P4C) (oft falsch als RJ-11 (6P2C) angegeben)  Port mit RS232-Protokoll. Der ConsolePort des US3000C ist eine R-J45 (8P8C) Port.&lt;br /&gt;
Zu achten ist bei den Bezeichnungen RXD und TXD auf die Seite des Anschlusses. Beim Anschluss der RS232-Kommunikation-Partner werden RXD und TXD ueber Kreuz angeschlossen, was zu einem Verstauchen der Anschlussbezeichnungen fuehrt. RXD und TXD bei einem Kabel nur einmal anzugeben ist mehr als irrefuehrend. Vielmehr muss es auf jeder Stecker-/Buchsenseite angegeben werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Pinbelegung RJ-14 (RJ-11)&lt;br /&gt;
|-&lt;br /&gt;
|Pin RJ-14||Pin RJ-11||RS232 Protokoll&lt;br /&gt;
|-&lt;br /&gt;
|1||NC||-&lt;br /&gt;
|-&lt;br /&gt;
|2||1||GND&lt;br /&gt;
|-&lt;br /&gt;
|3||2||RXD&lt;br /&gt;
|-&lt;br /&gt;
|4||3||TXD&lt;br /&gt;
|-&lt;br /&gt;
|5||4||GND&lt;br /&gt;
|-&lt;br /&gt;
|6||NC||-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Datei:RJ12 6P6C.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Eine Vielzahl von Seiten beschaeftigt sich mit dem Auslesen des Consolenports.&lt;br /&gt;
&lt;br /&gt;
[https://powerforum.co.za/topic/2322-youdas-off-grid-lab/page/6/][https://github.com/Interster/PylonTechBattery]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:800px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;9. Juli 2017 reimer22 photovoltaikforum.com&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
Ich habe 4 der Pylontech US2000B Batterien im Betrieb und der Hersteller knausert mit der Herausgabe des Protokolls für das Auslesen der Batterien. Stand jetzt sind dazu keine Informationen im Internet und den Manuals verfügbar. Erst recht hält sich der Hersteller bedeckt.&lt;br /&gt;
Hier ist also die Anleitung wie man den Batterien die Informationen entlocken kann. Ich benötige die Daten der Batterien, weil die an meinem Wechselrichter PIP4048MS einstellbaren Spannungen für den Speicher zu ungenau sind und durch die flache Kennlinie auch unbrauchbar. Deshalb habe ich mir jetzt ein Programm geschrieben um den PIP bei der 23% Schwelle auf Netzbetrieb umzuschalten.&lt;br /&gt;
&lt;br /&gt;
Die Batterie kann über den Console Port ausgelesen werden. Bis zu 8 Batterien in Reihe können angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Zuerst muss die Konsole aktiviert werden. Dazu das Terminalprogramm auf 1200, 8,N,1 umschalten.&lt;br /&gt;
&lt;br /&gt;
Dann den folgenden Hexstring an die Batterie senden:&lt;br /&gt;
&lt;br /&gt;
Data: 7E 32 30 30 31 34 36 38 32 43 30 30 34 38 35 32 30 46 43 43 33 0D&lt;br /&gt;
&lt;br /&gt;
Jetzt auf 115200,8,N,1 umschalten..&lt;br /&gt;
&lt;br /&gt;
Data: 0D 0A senden.&lt;br /&gt;
&lt;br /&gt;
Es erscheint der pylon&amp;gt; Prompt, der die Eingabe von Kommandos ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Erstes Kommando z.B.&lt;br /&gt;
&lt;br /&gt;
help\n (\n = Linefeed Zeichen 0A)&lt;br /&gt;
&lt;br /&gt;
zeigt eine Hilfe&lt;br /&gt;
&lt;br /&gt;
pwr\n&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
@&lt;br /&gt;
&lt;br /&gt;
Power Volt Curr Tempr Tlow Thigh Vlow Vhigh Base.St Volt.St Curr.St Temp.St Coulomb Time B.V.St B.T.St&lt;br /&gt;
&lt;br /&gt;
1 49884 4310 28000 25000 26000 3322 3327 Charge Normal Normal Normal 31 % 2017 - 07 - 09 14:56 : 37 Normal Normal&lt;br /&gt;
&lt;br /&gt;
2 49832 4472 28000 25000 25000 3321 3323 Charge Normal Normal Normal 31 % 2017 - 07 - 09 14:56 : 36 Normal Normal&lt;br /&gt;
&lt;br /&gt;
3 49842 4318 28000 25000 25000 3322 3324 Charge Normal Normal Normal 30 % 2017 - 07 - 09 14:56 : 36 Normal Normal&lt;br /&gt;
&lt;br /&gt;
4 49858 4111 27000 23000 23000 3322 3325 Charge Normal Normal Normal 30 % 2017 - 07 - 09 14:56 : 36 Normal Normal&lt;br /&gt;
&lt;br /&gt;
5 - ------Absent - ------&lt;br /&gt;
&lt;br /&gt;
6 - ------Absent - ------&lt;br /&gt;
&lt;br /&gt;
7 - ------Absent - ------&lt;br /&gt;
&lt;br /&gt;
8 - ------Absent - ------&lt;br /&gt;
&lt;br /&gt;
Command completed successfully&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
Die Zahlen sind als Festkommazahlen angegeben und müssen meistens durch 1000 geteilt werden.&lt;br /&gt;
&lt;br /&gt;
Im Admin Mode stehen sehr viele Routinen zur Verfügung von deren Verwendung abzuraten ist. Bis auf Chip-Ebene um einzelne Chips auf dem Board zu testen.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
getpwr 1\n&lt;br /&gt;
...&lt;br /&gt;
getpwr 8\n&lt;br /&gt;
&lt;br /&gt;
können die u.a. Zellenspannungen ausgelesen werden. Die Batterien loggen extrem viel. Es lässt sich z.B. eine Event Historie auslesen.&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl soh\n kann man den State of Health auslesen.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==CAN==&lt;br /&gt;
&lt;br /&gt;
==RS485==&lt;br /&gt;
&lt;br /&gt;
==Link Port 0==&lt;br /&gt;
&lt;br /&gt;
==Link Port 1==&lt;br /&gt;
&lt;br /&gt;
==Dry Contact Terminal==&lt;br /&gt;
&lt;br /&gt;
==Power Terminals==&lt;br /&gt;
&lt;br /&gt;
=Unterschiedliche Varianten=&lt;br /&gt;
&lt;br /&gt;
[https://voltaconsolar.com/blog/2019/08/15/pylontech-announces-change-in-name-for-us2000-lithium-batteries/]&lt;br /&gt;
&lt;br /&gt;
[https://voltaconsolar.com/blog/wp-content/uploads/2019/08/US2000B-US2000-PLUS-difference-and-instruction.pdf]&lt;br /&gt;
&lt;br /&gt;
[https://www.victronenergy.com/live/_media/battery_compatibility:pylon-diagram-2018-12-28.jpg]&lt;br /&gt;
&lt;br /&gt;
[https://www.victronenergy.com/live/battery_compatibility:pylontech_phantom]&lt;br /&gt;
&lt;br /&gt;
[https://support.batrium.com/article/110-how-to-control-victron-gx-with-watchmon]&lt;br /&gt;
&lt;br /&gt;
[https://www.victronenergy.com/live/battery_compatibility:pylontech_phantom]&lt;br /&gt;
&lt;br /&gt;
[https://www.zerohomebills.com/victron-and-pylontech-solar-battery-systems/]&lt;br /&gt;
&lt;br /&gt;
==Test-Verbindung CAN-Bus Linux-PC==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:600px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;US2000 CAN Mitschnitt&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
worker:~ # ip link set can0 down&lt;br /&gt;
worker:~ # ip link set can0 up type can bitrate 500000&lt;br /&gt;
worker:~ # ip link set can0 up&lt;br /&gt;
worker:~ # candump can0&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
  can0  359   [7]  00 00 00 00 01 50 4E&lt;br /&gt;
  can0  351   [8]  14 02 FA 00 FA 00 C2 01&lt;br /&gt;
  can0  355   [4]  32 00 64 00&lt;br /&gt;
  can0  356   [6]  44 13 00 00 B7 00&lt;br /&gt;
  can0  35C   [2]  C0 00&lt;br /&gt;
  can0  35E   [8]  50 59 4C 4F 4E 20 20 20&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es handelt sich wohl um einen Standard-Frame. Die Kommunikationsrate sind 500 kbps und der Sendezyklus ist eine Sekunde.&lt;br /&gt;
Der Laderegler sollte mit 0x305:00-00-00-00-00-00-00-00 antworten. Ich habe noch nicht getestet was passiert wenn er nicht antwortet.&lt;br /&gt;
&lt;br /&gt;
Jetzt geht es darum die Daten zu interpretieren.&lt;br /&gt;
&lt;br /&gt;
Einen Hinweis darauf habe ich [https://www.setfirelabs.com/green-energy/pylontech-can-reading-can-replication hier] gefunden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|CAN-BUS Mitschnitt&lt;br /&gt;
|-&lt;br /&gt;
!CAN-ID!!Byteanzahl!!Mitschnit!!Bedeutung (EN)!!Bedeutung DE)||Interpretation&lt;br /&gt;
|-&lt;br /&gt;
|0x351||[8]||14 02 FA 00 FA 00 C2 01||Battery voltage + current limits||Akku Ladespannung und Stromgrenzen fuer Laden und Entladen||siehe Folgetabelle  CAN-ID 0x351&lt;br /&gt;
|-&lt;br /&gt;
|0x355||[4]||32 00 64 00||State of Health (SOH) / State of Charge (SOC)||Akku &amp;quot;Gesundheits&amp;quot;-Zustand und Ladezustand||siehe Folgetabelle  CAN-ID 0x355&lt;br /&gt;
|-&lt;br /&gt;
|0x356||[6]|| 44 13 00 00 B7 00||Voltage / Current / Temp||Akkustatus: Spannung, Strom, Temperatur||siehe Folgetabelle  CAN-ID 0x356&lt;br /&gt;
|-&lt;br /&gt;
|0x35C||[2]||C0 00||Battery charge request flags||3 Flags (Anfrage/Anforderung) zu Laden und Entladen||siehe Folgetabelle  CAN-ID 0x35C&lt;br /&gt;
|-&lt;br /&gt;
|0x35E||[8]||50 59 4C 4F 4E 20 20 20||Manufacturer name||Herstellername in ASCII||“PYLON   “&lt;br /&gt;
|-&lt;br /&gt;
|0x359||[7]||00 00 00 00 01 50 4E||Protection &amp;amp; Alarm flags||Schutz und Alarm Flags||siehe Folgetabelle  CAN-ID 0x359&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 1000px;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;9&amp;quot;  style=&amp;quot;background-color:#ffffcc;&amp;quot;|CAN-ID 0x351 (8 Bytes; Byte 7 und 8 nicht dokumentiert\!\!\!)&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;!!Bit 7!!Bit 6!!Bit 5!!Bit 4!!Bit 3!!Bit 2!!Bit 1!!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|Byte 1||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Ladespannung (Datentyp: 16 Bit unsigned integer; Byte-Order: Little Endian; Korrekturfaktor: 0,1; Einheit: Volt)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 2&lt;br /&gt;
|-&lt;br /&gt;
|Byte 3||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Ladestrombegrenzung (Datentyp: 16 Bit signed integer, Zweierkomplement; Byte-Order: Little Endian; Korrekturfaktor: 0,1; Einheit: Ampere)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 4&lt;br /&gt;
|-&lt;br /&gt;
|Byte 5||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Entladestrombegrenzung (Datentyp: 16 Bit signed integer, Zweierkomplement; Byte-Order: Little Endian; Korrekturfaktor: 0,1; Einheit: Ampere)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 6&lt;br /&gt;
|-&lt;br /&gt;
|Byte 7||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|???&lt;br /&gt;
|-&lt;br /&gt;
|Byte 8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 1000px;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;9&amp;quot;  style=&amp;quot;background-color:#ffffcc;&amp;quot;|CAN-ID 0x355 (4 Bytes)&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;!!Bit 7!!Bit 6!!Bit 5!!Bit 4!!Bit 3!!Bit 2!!Bit 1!!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|Byte 1||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Ladezustand (SOC) (Datentyp: 16 Bit unsigned integer; Byte-Order: Little Endian; Korrekturfaktor: 1; Einheit: Prozent)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 2&lt;br /&gt;
|-&lt;br /&gt;
|Byte 3||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Betriebszustand (SOH) (Datentyp: 16 Bit unsigned integer; Byte-Order: Little Endian; Korrekturfaktor: 1; Einheit: Prozent)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 1000px;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;9&amp;quot;  style=&amp;quot;background-color:#ffffcc;&amp;quot;|CAN-ID 0x356 (6 Bytes)&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;!!Bit 7!!Bit 6!!Bit 5!!Bit 4!!Bit 3!!Bit 2!!Bit 1!!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|Byte 1||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Spannung (Datentyp: 16 Bit signed integer, Zweierkomplement; Byte-Order: Little Endian; Korrekturfaktor: 0,01; Einheit: Volt)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 2&lt;br /&gt;
|-&lt;br /&gt;
|Byte 3||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Strom (Datentyp: 16 Bit signed integer, Zweierkomplement; Byte-Order: Little Endian; Korrekturfaktor: 0,1; Einheit: Ampere)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 4&lt;br /&gt;
|-&lt;br /&gt;
|Byte 5||colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;|Akku Temperatur (Datentyp: 16 Bit signed integer, Zweierkomplement; Byte-Order: Little Endian; Korrekturfaktor: 0,1; Einheit: Grad Celsius)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 1000px;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;10&amp;quot;  style=&amp;quot;background-color:#ffffcc;&amp;quot;|CAN-ID 0x359 (7 Bytes)&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;!!Bit 7!!Bit 6!!Bit 5!!Bit 4!!Bit 3!!Bit 2!!Bit 1!!Bit 0!!&lt;br /&gt;
|-&lt;br /&gt;
|Byte 1||Ueberstrom (Entladung)|| || ||Untertemperatur||Uebertemperatur||Unterspannung||Uebertemperatur(Ueberspannung?)|| ||rowspan=&amp;quot;2&amp;quot;|Alarm&lt;br /&gt;
|-&lt;br /&gt;
|Byte 2|| || || || ||BMS intern|| || ||Ueberstrom (Ladung)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 3||Hoher Strom (Entladung)|| || ||Niedrige Temperatur||Hohe Temperatur||Niedrige Spannung||Hohe Spannung|| ||rowspan=&amp;quot;2&amp;quot;|Warnung&lt;br /&gt;
|-&lt;br /&gt;
|Byte 4|| || || || ||BMS intern|| || ||Hoher Strom (Ladung)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 5||colspan=&amp;quot;8&amp;quot;|Akkupack-Nummer (Datentyp: 8 Bit unsigned Character)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 6||&#039;P&#039; (0x50)||colspan=&amp;quot;7&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Byte 7||&#039;N&#039; (0x4E)||colspan=&amp;quot;7&amp;quot;|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 1000px;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;9&amp;quot;  style=&amp;quot;background-color:#ffffcc;&amp;quot;|CAN-ID 0x35C (2 Bytes)&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;!!Bit 7!!Bit 6!!Bit 5!!Bit 4!!Bit 3!!Bit 2!!Bit 1!!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|Byte 1||Laden eingeschaltet||Entladen eingeschaltet||Sofortladung|| || || || || &lt;br /&gt;
|-&lt;br /&gt;
|Byte 2|| || || || || || || || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 1000px;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;9&amp;quot;  style=&amp;quot;background-color:#ffffcc;&amp;quot;|CAN-ID 0x35E&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;!!Bit 7!!Bit 6!!Bit 5!!Bit 4!!Bit 3!!Bit 2!!Bit 1!!Bit 0&lt;br /&gt;
|-&lt;br /&gt;
|Byte 1||colspan=&amp;quot;8&amp;quot;|&#039;P&#039; (0x50)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 2||colspan=&amp;quot;8&amp;quot;|&#039;Y&#039; (0x59)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 3||colspan=&amp;quot;8&amp;quot;|&#039;L&#039; (0x4C)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 4||colspan=&amp;quot;8&amp;quot;|&#039;O&#039; (0x4F)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 5||colspan=&amp;quot;8&amp;quot;|&#039;N&#039; (0x4E)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 6||colspan=&amp;quot;8&amp;quot;|&#039; &#039; (0x20)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 7||colspan=&amp;quot;8&amp;quot;|&#039; &#039; (0x20)&lt;br /&gt;
|-&lt;br /&gt;
|Byte 8||colspan=&amp;quot;8&amp;quot;|&#039; &#039; (0x20)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Verbindung zu VE (Cerbo)=&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;Anschluss A/CAN&#039;&#039;&#039; am Master-Pylontech US3000C wird am Cerbo GX an den BMS‑CAN-Anschluss angeschlossen – nicht an VE.Bus und beim ursprünglichen Cerbo möglichst nicht an VE.Can.&lt;br /&gt;
&lt;br /&gt;
Bei deinem ursprünglichen Cerbo GX&lt;br /&gt;
Pylontech A/CAN → Cerbo BMS‑CAN&lt;br /&gt;
Der BMS‑CAN-Port arbeitet fest mit 500 kbit/s.&lt;br /&gt;
In den zweiten BMS‑CAN-Anschluss des Cerbo kommt der blaue VE.Can-Abschlusswiderstand.&lt;br /&gt;
&lt;br /&gt;
So wie es aussieht kann man die an den weißen Kunststoff RJ45-Buchsen erkennen.&lt;br /&gt;
Die alten (Plus und B) Varianten hatten silberfarbenen Blech-RJ45 Buchsen. (Nachtrag: Meine 07/2022 gekauften US3000C haben ebenfalls Blech-RJ45-Buchsen. Nur auf den Bildern im Manual sind weiße Kunststoff-Buchsen zu sehen.)&lt;br /&gt;
&lt;br /&gt;
 Kabel 1 WI0SCAN30RJ1 1~3 NA 4-8 PIN-PIN (blaue Faehnchen)&lt;br /&gt;
 Kabel 2 WI0SCAN35RJ3 (silberne Faehnchen)&lt;br /&gt;
&lt;br /&gt;
Pylontech CAN zur Ausgabe von Batterieinformationen&lt;br /&gt;
Pinbelegung Typ B: &lt;br /&gt;
 1-NC&lt;br /&gt;
 2-GND&lt;br /&gt;
 3-NC &lt;br /&gt;
 4-CANH &lt;br /&gt;
 5-CANL&lt;br /&gt;
 6-NC&lt;br /&gt;
 7-NC&lt;br /&gt;
 8-NC&lt;br /&gt;
&lt;br /&gt;
BMS-Can (Cerbo A20 Eintein wurde spaeter scheinbar zu VE.Can 1/2)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!align=&amp;quot;left&amp;quot;| RJ45-Pin&lt;br /&gt;
! Signal&lt;br /&gt;
! Deine Messung&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 1&lt;br /&gt;
| NET-C / V− / GND&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 2&lt;br /&gt;
| NET-S / V+ / V_CAN&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 3&lt;br /&gt;
| NET-C / V− / GND&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 4&lt;br /&gt;
| nicht verbunden&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 5&lt;br /&gt;
| nicht verbunden&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| elektrisch auffällig, siehe unten&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 6&lt;br /&gt;
| NET-S / V+ / V_CAN&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 7&lt;br /&gt;
| CAN-H&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| 8&lt;br /&gt;
| CAN-L&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| bestätigt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Unterschied ist hauptsächlich die Pinbelegung auf der Batterieseite:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Signal&amp;amp;nbsp;||Victron-Seite||Typ A, Batterieseite||Typ B, Batterieseite&lt;br /&gt;
|-&lt;br /&gt;
|GND||Pin 3||	Pin 6||	Pin 2&lt;br /&gt;
|-&lt;br /&gt;
|CAN-H||Pin 7||	Pin 4||	Pin 4&lt;br /&gt;
|-&lt;br /&gt;
|CAN-L||Pin 8||	Pin 5||	Pin 5&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
CAN-H und CAN-L sind also identisch; lediglich GND liegt bei Typ A auf Pin 6 und bei Typ B auf Pin 2.&lt;br /&gt;
&lt;br /&gt;
Kurz gesagt:&lt;br /&gt;
&lt;br /&gt;
*US3000 → Typ B&lt;br /&gt;
*US3000C → Typ A&lt;br /&gt;
*US2000 → Typ B&lt;br /&gt;
*US2000C/US2000D → Typ A&lt;br /&gt;
*US5000/US5000B → Typ A&lt;br /&gt;
*UP2500 → Typ B&lt;br /&gt;
*UP5000 → Typ A&lt;br /&gt;
&lt;br /&gt;
Die offizielle Pinbelegung des A-CAN-Anschlusses (RJ45-Buchse) am Pylontech US3000C lautet wie folgt:&lt;br /&gt;
Pin 1: Nicht belegt (frei lassen)&lt;br /&gt;
Pin 2: Nicht belegt / Ggf. intern belegt (Pins 1–3 nicht beschalten, da dies die BMS-Kommunikation stören kann)&lt;br /&gt;
Pin 3: Nicht belegt (frei lassen)&lt;br /&gt;
Pin 4: CAN-H (High-Signal)Pin 5: CAN-L (Low-Signal)&lt;br /&gt;
Pin 6: CAN-GND (Masse/Ground)&lt;br /&gt;
Pin 7: Nicht für CAN genutzt (reserviert für RS485 A)&lt;br /&gt;
Pin 8: Nicht für CAN genutzt (reserviert für RS485 B)&lt;br /&gt;
&lt;br /&gt;
 Wichtig: Die ersten drei Pins sollten bei einem Eigenbau- oder Verbindungskabel zum Wechselrichter nicht belegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Kabel WIOSCAN30RJ1 (1~3 NC und 4~8 1:1) laesst sich also zu einem Typ A Kbael wunderbar umbauen. Die Inverterseite abknipsen. An der BATTERY-Seite (Blaues Faehnchen dran lassen) sind bereits die PINS 1~3 nicht belegt, das ist sehr gut und wie gefordert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:VictronCerbo Pylontech BMS Kabel.png|600px|alternativtext=VictronCerbo Pylontech BMS Kabel|VictronCerbo Pylontech BMS Kabel]]&lt;br /&gt;
&lt;br /&gt;
 The battery with the empty link port 0 is the master battery. You must use the VE.Can to CAN-bus BMS type B Cable, part number ASS030720018 for connection with US2000/US3000/UP2500; and VE.Can to CAN-bus BMS type A Cable, part number ASS030710018 for connection with US2000C/US3000C/UP5000/Force-L, you cannot use the cable supplied by Pylontech.&lt;br /&gt;
&lt;br /&gt;
=Batterie Ladekabel=&lt;br /&gt;
&lt;br /&gt;
 Das Pylontech Batteriekabelset enthält 2 x 2 Meter Kabel (Plus/Minus) mit je einem Querschnitt von 25mm² sowie einem Datenkabel mit 2 RJ45 Steckern. Sie benötigen es um die Batterien von Pylontech US2000B Plus mit dem Wechselrichter zu verbinden. Anschlüsse: 2 x Amphenol (Pylontech) 2 x M8 Ringkabelschuh.&lt;br /&gt;
&lt;br /&gt;
 Das Pylontech Batterieanschlusskabelset (MPN BW0US3000BAL0002) beinhaltet 2 x 2 Meter Kabel (Plus/Minus) mit je einem Querschnitt von 25mm² und ein CAN-Datenkabel mit RJ45 Steckern beidseitig.Das Set wird benötigt um die Batterien von Pylontech mit einem Wechselrichter zu verbinden.&lt;br /&gt;
&lt;br /&gt;
 2m Kabel Plus mit M8 Ringkabelschuh- und Amphenolanschluss (Pylontech)&lt;br /&gt;
 2m Kabel Minus mit M8 Ringkabelschuh- und Amphenolanschluss (Pylontech) &lt;br /&gt;
&lt;br /&gt;
 For 48V Pylontech, the cable is AWG 4 (=21mm2) and the terminals are Amphenol SurLok Plus.&lt;br /&gt;
&lt;br /&gt;
In the battery module itself, there&#039;s even a temperature sensor sealed in the every terminal.&lt;br /&gt;
&lt;br /&gt;
=Schaltfolgen=&lt;br /&gt;
&lt;br /&gt;
Der Powerswitch (Ein-Ausschalter mit 0 1 gekennzeichnet, mit POWER bezeichnet und mit einer Schutzkappe versehen) wird mit Hauptschalter uebersetzt. Ich gehe mal davon aus, dass damit das BMS ein und ausgeschaltet wird. Das erklaert auch warum nach dem Einschalten noch keine Spannung an den Batterie-Polen anliegt. Erst wenn der rote Startknopf (SW) fuer mehr als 0,5 s gedrueckt wird nimmt das BMS seinen Betrieb auf und es liegt eine Spannung an den Batterie-Polen.  &lt;br /&gt;
&lt;br /&gt;
==ABSCHALTEN==&lt;br /&gt;
&lt;br /&gt;
- Pylon: 5 sec. die Taste drücken bis der Speicher die interne Sicherung schmeißt&lt;br /&gt;
&lt;br /&gt;
- Sicherungstrenner vom AC-Netz zum WR abschalten&lt;br /&gt;
&lt;br /&gt;
- WR (Gen24) DC-Trennschalter (Gehäuseschalter) rausnehmen.&lt;br /&gt;
&lt;br /&gt;
==ZUSCHALTEN==&lt;br /&gt;
&lt;br /&gt;
- Pylon einschalten (Gerätesicherung ein, dann Taster kurz drücken)&lt;br /&gt;
&lt;br /&gt;
- WR DC-Trennschalter einschalten&lt;br /&gt;
&lt;br /&gt;
- Sicherungstrenner AC-Netz zum Wechselrichter wieder einschalten.&lt;br /&gt;
&lt;br /&gt;
Ein warnender Hinweis zur Stromversorgung über den AC-Out-Anschluss eines VE.Bus-Inverter, Multi oder Quattro:&lt;br /&gt;
Wenn Sie das Cerbo GX von einem an den AC-Out-Port eines beliebigen VE.Bus-Produktes (Inverter, Multi oder Quattro)&lt;br /&gt;
angeschlossenen Netzteil mit Strom versorgen, tritt nach dem Abschalten der VE.Bus-Produkte aus irgendeinem Grund (nach&lt;br /&gt;
einem Betriebsfehler oder während eines Schwarzstarts) ein Deadlock auf. Die VE.Bus-Geräte booten nicht, bis das Cerbo GX&lt;br /&gt;
Strom hat, aber das Cerbo GX bootet nicht, bis es Strom hat. Dieser Deadlock kann durch kurzes Herausziehen des Cerbo&lt;br /&gt;
GX VE.Bus-Kabels korrigiert werden, an dem Sie beobachten werden, dass die VE.Bus-Produkte sofort mit dem Hochfahren&lt;br /&gt;
beginnen.&lt;br /&gt;
&lt;br /&gt;
 Reihenfolge: Egal ob einschalten oder ausschalten, die Netzstelle des Ladegerätes muss/sollte getrennt sein bevor man die Batterie/Akku trennt. Das heißt fuer den Pylontech abgeleitet: Pylontech an, dann WR an oder WR aus, dann Pylon aus.&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
[https://www.meintechblog.de/2022/02/operation-hausspeicher-28kwh-fuer-unter-7000euro/ 28kWh fuer 7000€]&lt;br /&gt;
[https://powerforum.co.za/topic/8524-pylontech-us2000-plus-teardown/ US2000 Teardown]&lt;br /&gt;
[https://www.youtube.com/watch?v=KY9GM9VmDlE US2000 Plus Inside]&lt;br /&gt;
[https://www.youtube.com/watch?v=IlExe2zcifM US2000 WLAN]&lt;br /&gt;
&lt;br /&gt;
=Request for Comments=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(CAN)_CAN-Bus_%26_Co&amp;diff=5510</id>
		<title>(CAN) CAN-Bus &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(CAN)_CAN-Bus_%26_Co&amp;diff=5510"/>
		<updated>2026-10-12T07:16:24Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Bedienungsanleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Hin und wieder begegnet mir der CAN-Bus auch außerhalb des Einsatzortes KFZ (z.B. [[(CAN) USB2CAN]]). Um nicht jedes mal recht mühsam die Infos zum weiteren Verständnis aus Büchern (ja, sowas gibt&#039;s auch noch;-)) und dem Internet zusammensuchen zu müssen, habe ich hier mal angefangen die für mich notwendigen Informationen zusammenzustellen.&lt;br /&gt;
&lt;br /&gt;
=Feldbusse=&lt;br /&gt;
&lt;br /&gt;
CAN (Controller Area Network) gehoert mit dem &lt;br /&gt;
* LIN-Bus&lt;br /&gt;
* FlexRay&lt;br /&gt;
* MOST&lt;br /&gt;
* Byteflight und&lt;br /&gt;
* Intellibus&lt;br /&gt;
zu den Fledbus-Systemen, die im Bereich Automotive die groeszte Verbreitung finden.&lt;br /&gt;
&lt;br /&gt;
Die Pseudodefinition aus [https://de.wikipedia.org/wiki/Feldbus Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 Ein Feldbus ist ein Bussystem, das in einer Anlage Feldgeräte wie Messfühler (Sensoren) und Stellglieder (Aktoren) zur Kommunikation mit einem Automatisierungsgerät verbindet.&lt;br /&gt;
&lt;br /&gt;
finde ich in sofern widerspruechlich, als auch zu eng gefasst, da weiter unten im Artikel die o. g. Bussysteme aufgelistet werden, aber ein Auto als Feldgeraet einzuordnen braucht doch ein wenig Fantasie.&lt;br /&gt;
&lt;br /&gt;
=Historie=&lt;br /&gt;
&lt;br /&gt;
Im Schnelldurchlauf:&lt;br /&gt;
&lt;br /&gt;
Das CAN ist ein serielles Bus-System. &lt;br /&gt;
&lt;br /&gt;
Entwickelt wurde es von der Robert-Bosch GmbH ab 1983.&lt;br /&gt;
&lt;br /&gt;
Das CAN-Protokoll ist durch Patente geschuetzt.&lt;br /&gt;
&lt;br /&gt;
Specification 2.0 wurde 1991 veroeffentlicht.&lt;br /&gt;
&lt;br /&gt;
CAN ist eine reine DataLinkLayer (Sicherungsschicht) Implementation.&lt;br /&gt;
&lt;br /&gt;
ISO 11898 wurde 1993 veroeffentlicht (Road vehicles - Interchange of digital information - Controller area network (CAN) for high speed communication.&lt;br /&gt;
&lt;br /&gt;
CANopen Protokoll von CiA (CANinAutomation) 1995 veroeffentlicht.&lt;br /&gt;
&lt;br /&gt;
CiA spezifiziert CAL (CAN Applikation Layer)&lt;br /&gt;
&lt;br /&gt;
2000 Entwicklung von TTCAN (Time-triggered communication)&lt;br /&gt;
&lt;br /&gt;
=Eigenschaften=&lt;br /&gt;
&lt;br /&gt;
* Busstruktur (Topologie) mit einem TrunkCable&lt;br /&gt;
* Zweileitungssystem (verdrillt)&lt;br /&gt;
* Busterminierung an jedem Ende des TrunkCables mit einem 120 Ohm Widerstand&lt;br /&gt;
* Anschluss der Teilnehmer mit einem DropCable&lt;br /&gt;
* Bis zu 1 Mbps, dann aber max TrunkCable-Laenge 40 m&lt;br /&gt;
* Bis zu 8 Bytes können mit einer Nachricht (Frames) uebertragen werden.&lt;br /&gt;
* Multi-Master Zugriff&lt;br /&gt;
* Bus Arbitration (Streit-Schlichter) bei gleichzeitigem Zugriff mehrerer Sender&lt;br /&gt;
* Broadcast Nachrichten&lt;br /&gt;
* Keine Teilnehmer-Adressen (relevante Nachrichten werden gefiltert)&lt;br /&gt;
* Nachrichten Anforderung moeglich&lt;br /&gt;
* Error Detection und Signaling durch spezielle Frames.&lt;br /&gt;
* Automatische Wiederholung der Nachricht bei einem Fehler.&lt;br /&gt;
* Automatische Deaktivierung von Teilnehmern (nodes) bei dauerhaften Fehlern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Controllerboard CANUSB-OEM-ISO Interface Adapter Lawicell AB=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recherchestand: 11. Oktober 2026.&#039;&#039;&#039; Die CANUSB-OEM-ISO ist die galvanisch getrennte Einbauplatine des LAWICEL CANUSB. Hersteller/Fertigung: ELMICRO Computer. Treiber, ASCII-Protokoll und API sind mit CANUSB kompatibel.&amp;lt;ref name=&amp;quot;produkt&amp;quot;&amp;gt;https://www.canusb.com/products/canusb-oem-iso/ – Hersteller-Produktseite, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schnellanschluss:&#039;&#039;&#039; &lt;br /&gt;
*USB an den Computer&lt;br /&gt;
*CAN_H an D-Sub-Pin 7, CAN_L an Pin 2, CAN_GND an Pin 3. &lt;br /&gt;
*Keine externe Versorgung am CAN-Stecker einspeisen. &lt;br /&gt;
&lt;br /&gt;
==Bedienungsanleitung==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf width=&amp;quot;1000&amp;quot; height=&amp;quot;300&amp;quot;&amp;gt;File:Lawicell_canusb_manual.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&amp;lt;pdf width=&amp;quot;1000&amp;quot; height=&amp;quot;300&amp;quot;&amp;gt;File:LAWICEL_CANUSB_ASCII-Kommandos.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Platinenbilder ==&lt;br /&gt;
[[Datei:CANUSB-OEM_ISO_platine.jpg|thumb|600px|Paltinenfoto der Standardbestückung mit Mini-B und D-Sub9]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eckdaten und Varianten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! Angabe / Einordnung&lt;br /&gt;
|-&lt;br /&gt;
| Bauform || Offene FR4-Einbauplatine; kein Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| Isolation || Bauteile mindestens 1 kV; Kriechstrecke mindestens 3 mm&lt;br /&gt;
|-&lt;br /&gt;
| Bedeutung der Isolation || Kurzzeitige Bauteilprüfspannung, keine zulässige dauernde Betriebsspannung; Datenblatt sieht Versorgungsspannungen über 42 V DC nicht vor&lt;br /&gt;
|-&lt;br /&gt;
| Platinenmaß || 66,04 × 45,72 mm&lt;br /&gt;
|-&lt;br /&gt;
| Befestigung || Vier Bohrungen Ø 3,20 mm; Lochabstände 58,42 × 38,10 mm&lt;br /&gt;
|-&lt;br /&gt;
| Standardanschlüsse || USB Mini-B; CAN D-Sub9, männlich&lt;br /&gt;
|-&lt;br /&gt;
| Optionen || USB 2×5-Pads, Raster 2,54 mm; CAN sechspolige Federkraftklemme, Raster 5,08 mm&lt;br /&gt;
|-&lt;br /&gt;
| Bestellbezeichnung || CANUSB/OEM122: isoliert / Mini-B / D-Sub9&lt;br /&gt;
|}&lt;br /&gt;
OEM-spezifische Angaben: Datenblatt vom 24.06.2015.&amp;lt;ref name=&amp;quot;oem&amp;quot;&amp;gt;https://elmicro.com/files/elmicro/canusb-oem-iso_spec003.pdf – CANUSB-OEM-ISO Produktspezifikation, 24.06.2015, 2 Seiten.&amp;lt;/ref&amp;gt; Varianten und Lieferbestückung vor Bestellung bestätigen. Die Hersteller-Shopseite nennt 122,90 € netto zuzüglich Versand; das ist ein abgelesenes Angebot, kein verbindlicher aktueller Kaufpreis.&amp;lt;ref name=&amp;quot;shop&amp;quot;&amp;gt;https://elmicro.com/en/canusb-oem-iso.html – OEM-Produkt- und Bestellseite, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! CANUSB-Funktion !! Angabe&lt;br /&gt;
|-&lt;br /&gt;
| Bus || Classical CAN 2.0A/2.0B; 11-/29-Bit-Identifier, RTR; bis 1 Mbit/s&lt;br /&gt;
|-&lt;br /&gt;
| USB || USB 2.0 Full Speed, Versorgung über USB&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Controller || SJA1000, 16 MHz&lt;br /&gt;
|-&lt;br /&gt;
| Empfang || 32 Frames FIFO; optionale Millisekunden-Zeitstempel&lt;br /&gt;
|-&lt;br /&gt;
| Anzeigen || Grün: CAN-Aktivität; Rot: CAN-Fehler&lt;br /&gt;
|-&lt;br /&gt;
| Software || FTDI VCP oder D2XX; LAWICEL API-DLL 32/64 Bit&lt;br /&gt;
|}&lt;br /&gt;
Diese Funktionen stammen vom kompatiblen CANUSB.&amp;lt;ref name=&amp;quot;canusb&amp;quot;&amp;gt;https://www.canusb.com/products/canusb/ – LAWICEL CANUSB, Spezifikationen und Anschlussinformationen.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;CAN FD wird nicht unterstützt.&#039;&#039;&#039; Die Gehäusemaße, Stromaufnahme und Temperaturfreigabe des normalen Dongles sind kein eigenständiger OEM-Nachweis. Ebenso darf 1 Mbit/s nicht als Garantie verlustfreier Aufzeichnung eines voll ausgelasteten Busses verstanden werden.&lt;br /&gt;
&lt;br /&gt;
== Anschlussbelegungen ==&lt;br /&gt;
=== D-Sub9: CAN ===&lt;br /&gt;
Pinzahlen am Steckverbinder verwenden: Lötseite und Steckseite sind spiegelverkehrt. Die folgenden drei Signale sind vom Hersteller ausdrücklich für den Betrieb genannt.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Pin !! Verwendung an dieser Baugruppe&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Für Betrieb nicht verwenden; tatsächliche OEM-Verschaltung nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CAN_L&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CAN_GND, galvanisch getrennte Busseite&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Für Betrieb nicht verwenden; nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Für Betrieb nicht verwenden; Schirmbehandlung nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Für Betrieb nicht verwenden; zusätzliche Masseverbindung nicht separat bestätigt&lt;br /&gt;
|-&lt;br /&gt;
| 7 || CAN_H&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Für Betrieb nicht verwenden; nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Keine externe Versorgung erforderlich; nicht mit Batteriespannung verbinden&lt;br /&gt;
|}&lt;br /&gt;
Ein D-Sub9-Stecker macht das Gerät nicht zu RS232. Insbesondere nicht an einen seriellen PC-Port anschließen.&lt;br /&gt;
&lt;br /&gt;
=== USB-Pads: 2×5 ===&lt;br /&gt;
&#039;&#039;&#039;Orientierung wie in der Maßzeichnung: USB-Pads links, CAN-Pads rechts.&#039;&#039;&#039; Beide Spalten haben dieselbe Zeilenbelegung. Keine erfundene fortlaufende Pin-Nummerierung: Das Datenblatt benennt Signale, keine Pinnummern.&amp;lt;ref name=&amp;quot;oem&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Zeile von oben !! Linkes Pad !! Rechtes Pad&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC (+5 V USB) || VCC (+5 V USB)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || D− || D−&lt;br /&gt;
|-&lt;br /&gt;
| 3 || D+ || D+&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND (USB-Seite) || GND (USB-Seite)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || n.c. || n.c.&lt;br /&gt;
|}&lt;br /&gt;
Nicht blind einen beliebigen Mainboard-USB-Stecker aufsetzen: Position des fehlenden Pins und der freien Leitung am konkreten Kabel prüfen. USB-GND nicht mit CAN_GND brücken, wenn die galvanische Trennung erhalten bleiben soll. Mini-B und Header nicht gleichzeitig an zwei USB-Hosts anschließen.&lt;br /&gt;
&lt;br /&gt;
=== CAN-Pads / optionale Klemme ===&lt;br /&gt;
Die Zeichnung zeigt sechs Signalpositionen mit jeweils zwei horizontalen Lötpads. &#039;&#039;&#039;Von oben nach unten in der Herstellerzeichnung:&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;oem&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Position !! Signal !! Verbindung zum D-Sub&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CAN_H || Pin 7&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CAN_H || Pin 7&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CAN_L || Pin 2&lt;br /&gt;
|-&lt;br /&gt;
| 4 || CAN_L || Pin 2&lt;br /&gt;
|-&lt;br /&gt;
| 5 || CAN_GND || Pin 3&lt;br /&gt;
|-&lt;br /&gt;
| 6 || CAN_GND || Pin 3&lt;br /&gt;
|}&lt;br /&gt;
Signalreihenfolge aus der Zeichnung, D-Sub-Zuordnung aus den CANUSB-Anschlussangaben. Die Nummern 1–6 sind hier Positionshilfen, keine aufgedruckten Hersteller-Pinnummern. Masse auf der Busseite ist nicht USB-Masse.&lt;br /&gt;
&lt;br /&gt;
=== Praktischer Kabelaufbau ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Computer / Board !! Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| USB Mini-B || USB-Host über geeignetes Datenkabel&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 7 / CAN_H-Pad || CAN_H der Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 2 / CAN_L-Pad || CAN_L der Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 3 / CAN_GND-Pad || CAN-Bezugsmasse der Gegenstelle&lt;br /&gt;
|}&lt;br /&gt;
CAN_H/CAN_L als verdrilltes Paar führen. An beiden physikalischen Busenden jeweils 120 Ω zwischen H und L; einen zusätzlichen Abschluss nur setzen, wenn die Platine am Busende sitzt und dort noch kein Abschluss vorhanden ist. Bei ausgeschalteten Geräten ergeben zwei parallele 120-Ω-Abschlüsse rechnerisch etwa 60 Ω. &#039;&#039;&#039;Eine onboard zuschaltbare Terminierung ist in den recherchierten OEM-Unterlagen nicht belegt.&#039;&#039;&#039; Für normales Senden braucht es einen weiteren aktiven CAN-Knoten, der quittiert.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bauteile / Teilstückliste ==&lt;br /&gt;
&#039;&#039;&#039;Keine vollständige Hersteller-BOM gefunden.&#039;&#039;&#039; Die Tabelle ist eine Funktions- und Identifikationsliste, keine belastbare Einkaufsstückliste. Nicht lesbare Werte und Bestückungsreferenzen werden nicht ergänzt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Baugruppe / Bauteil !! Identifikation !! Belegstatus&lt;br /&gt;
|-&lt;br /&gt;
| USB-FIFO || FTDI FT245RL || In CANUSB-Unterlagen genannt; entsprechendes IC im OEM-Foto&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Controller || NXP/Philips SJA1000 || Dokumentiert; NXP-IC im Platinenfoto&lt;br /&gt;
|-&lt;br /&gt;
| Mikrocontroller || Atmel AVR || CANUSB-Handbuch; konkreten OEM-Typ am eigenen Board ablesen&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Transceiver || CANUSB nennt 82C251 || Nicht als verbindliche OEM-BOM behandeln; exakten Aufdruck prüfen&lt;br /&gt;
|-&lt;br /&gt;
| Isolations-Signalbauteile || Typ nicht sicher bestimmt || Im OEM-Foto sichtbar; keine öffentliche Bestückungsliste gefunden&lt;br /&gt;
|-&lt;br /&gt;
| Isolierte Versorgung || DC/DC-Funktionsblock plausibel || Bauteiltyp und Kennwerte nicht verifiziert&lt;br /&gt;
|-&lt;br /&gt;
| Taktbauteile || Quarz / Resonator || Foto; vollständige Frequenz- und Typzuordnung offen&lt;br /&gt;
|-&lt;br /&gt;
| USB-Buchse || Mini-B, SMD || OEM-Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Stecker || D-Sub9 male, SMD mit mechanischen TH-Pads || OEM-Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| Optionale USB-Stiftleiste || 2×5, 2,54 mm || Variante; Standardfoto zeigt freie Pads&lt;br /&gt;
|-&lt;br /&gt;
| Optionale CAN-Klemme || 6-polig, 5,08 mm || Variante; Standardfoto zeigt freie Pads&lt;br /&gt;
|-&lt;br /&gt;
| LEDs / R / C / Schutzbeschaltung || Einzelwerte unbekannt || Keine vollständige BOM gefunden&lt;br /&gt;
|}&lt;br /&gt;
Basis-ICs: CANUSB-Produktseite und Handbuch; Sichtbefunde: Herstellerfoto.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;manual&amp;quot;&amp;gt;https://www.canusb.com/files/canusb_manual.pdf – LAWICEL CANUSB User Manual, Rev. 1.1-en, 12.07.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schaltung und Schaltplan ==&lt;br /&gt;
[[Datei:CANUSB-OEM-ISO_funktionsschema.svg|thumb|800px|Eigenes vereinfachtes Funktionsschema; kein Hersteller-Schaltplan.]]&lt;br /&gt;
&#039;&#039;&#039;Ein vollständiger öffentlich zugänglicher OEM-Schaltplan wurde nicht gefunden.&#039;&#039;&#039; Ebenso fehlen verifizierte Gerberdaten, Netzliste und vollständige BOM. Das Schema zeigt nur die funktionale Architektur. Es ist weder eine Rekonstruktion der tatsächlichen Verdrahtung noch eine Nachbauvorlage. Ein SJA1000-Datenblatt ersetzt keinen OEM-Schaltplan.&lt;br /&gt;
&lt;br /&gt;
== Betrieb unter Windows ==&lt;br /&gt;
# Platine per USB-Datenkabel anschließen; FTDI-Treiber normalerweise automatisch installieren lassen, andernfalls das offizielle FTDI-Paket verwenden.&lt;br /&gt;
# Geräte-Manager: passenden „USB Serial Converter“ anhand Gerätebeschreibung „CANUSB“ identifizieren.&lt;br /&gt;
# Für COM-Port-Zugriff: Eigenschaften → Erweitert → „Load VCP“ aktivieren, USB abziehen und wieder einstecken.&lt;br /&gt;
# Zugewiesenen COM-Port notieren. Terminal mit 8N1, ohne Handshake und mit &#039;&#039;&#039;CR allein&#039;&#039;&#039; als Sendeabschluss öffnen. Laut Hersteller ist die eingestellte virtuelle Baudrate beliebig; sie ist nicht die CAN-Bitrate.&lt;br /&gt;
# Zuerst nur Version mit V abfragen; danach passende CAN-Bitrate setzen und Kanal öffnen.&lt;br /&gt;
Diese VCP-Schritte sind im Hersteller-Testtutorial beschrieben.&amp;lt;ref name=&amp;quot;test&amp;quot;&amp;gt;https://www.canusb.com/support/howto-check-canusb/ – Hersteller-Testanleitung, 02.02.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternative: D2XX und LAWICEL CANUSB-DLL. DLL-Architektur muss zur Anwendung passen: canusbdrv.dll für 32 Bit, canusbdrv64.dll für 64 Bit. Auch eine 32-Bit-Anwendung unter 64-Bit-Windows braucht die 32-Bit-DLL. Hersteller-Supportseite enthält DLL-Paket, Beispiele und CAN Monitor Lite. Alte Geräte vor Februar 2015 können PID FFA8 statt 6001 besitzen und benötigen besondere Behandlung. Derselbe Adapter sollte nicht parallel von Terminal und D2XX-Anwendung geöffnet werden.&amp;lt;ref name=&amp;quot;support&amp;quot;&amp;gt;https://www.canusb.com/support/canusb-support/ – Treiber, DLL, Beispiele, Legacy-Hinweise.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Windows 11 ist hier nicht als separat getestete OEM-Konfiguration nachgewiesen. Den passenden aktuellen FTDI-Treiber und die Anwendungskompatibilität prüfen; alte Windows-Treiber nicht ungeprüft übernehmen.&lt;br /&gt;
&lt;br /&gt;
== ASCII-Befehle ==&lt;br /&gt;
Groß-/Kleinschreibung beachten; jede Zeile endet mit CR (0x0D). Konfiguration bei geschlossenem CAN-Kanal.&amp;lt;ref name=&amp;quot;manual&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Befehl !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| V / N || Version / Seriennummer&lt;br /&gt;
|-&lt;br /&gt;
| S0, S1, S2, S3, S4 || 10, 20, 50, 100, 125 kbit/s&lt;br /&gt;
|-&lt;br /&gt;
| S5, S6, S7, S8 || 250, 500, 800, 1000 kbit/s&lt;br /&gt;
|-&lt;br /&gt;
| sxxyy || SJA1000 BTR0/BTR1 setzen&lt;br /&gt;
|-&lt;br /&gt;
| O / C || Kanal öffnen / schließen&lt;br /&gt;
|-&lt;br /&gt;
| tiiildd… / Tiiiiiiiildd… || 11-/29-Bit-Datenframe; DLC 0–8&lt;br /&gt;
|-&lt;br /&gt;
| riiil / Riiiiiiiil || RTR mit 11-/29-Bit-ID&lt;br /&gt;
|-&lt;br /&gt;
| F || Fehlerstatus&lt;br /&gt;
|-&lt;br /&gt;
| Mxxxxxxxx / mxxxxxxxx || Acceptance-Code / -Maske&lt;br /&gt;
|-&lt;br /&gt;
| Z0 / Z1 || Empfangszeitstempel aus / an&lt;br /&gt;
|}&lt;br /&gt;
Beispiel für einen eigenen Testbus mit 500 kbit/s; jede Zeile einzeln senden und Antwort abwarten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
V&lt;br /&gt;
S6&lt;br /&gt;
O&lt;br /&gt;
F&lt;br /&gt;
C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein Sendetest erst am geeigneten Testbus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
t12320102&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bedeutung: ID 0x123, zwei Datenbytes 01 02. &#039;&#039;&#039;Nicht als BMS-Abfrage oder sonstigen gerätespezifischen Befehl interpretieren.&#039;&#039;&#039; Erfolg bei Datenframes: z beziehungsweise Z plus CR; Fehler: BEL (0x07). Ein angenommenes Sendekommando ist kein Nachweis, dass die Zielanwendung die Daten verstanden hat.&lt;br /&gt;
&lt;br /&gt;
== Betrieb unter Linux ==&lt;br /&gt;
=== Erkennung ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsusb&lt;br /&gt;
sudo modprobe ftdi_sio&lt;br /&gt;
journalctl -k -n 50&lt;br /&gt;
ls -l /dev/serial/by-id/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Typischer Port: /dev/ttyUSB0; bei mehreren Adaptern stabilen by-id-Pfad bevorzugen. Moderne Geräte verwenden FTDI-PID 6001, alte FFA8.&amp;lt;ref name=&amp;quot;support&amp;quot; /&amp;gt; Kein ttyUSB-Port: USB-Datenkabel, Treiberbindung, PID und Zugriffsrechte prüfen. D2XX-Zugriff und ftdi_sio können um das Gerät konkurrieren.&lt;br /&gt;
&lt;br /&gt;
So wurde die Karte bei mir eingebunden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lrwxrwxrwx. 1 root root 13 11. Okt 19:24 usb-LAWICEL_CANUSB_LWZ2QLNW-if00-port0 -&amp;gt; ../../ttyUSB1&lt;br /&gt;
Bus 003 Device 056: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SocketCAN mit slcand ===&lt;br /&gt;
Benötigt can-utils, iproute2 und Kernelmodul slcan. Beispielinstallation je nach Distribution:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Debian / Ubuntu&lt;br /&gt;
sudo apt install can-utils iproute2&lt;br /&gt;
# Fedora&lt;br /&gt;
sudo dnf install can-utils iproute&lt;br /&gt;
# openSUSE: Paketverfügbarkeit im verwendeten Release prüfen&lt;br /&gt;
sudo zypper install can-utils iproute2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vorher andere Programme am seriellen Port schließen. 500-kbit/s-Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo modprobe slcan&lt;br /&gt;
sudo slcand -o -c -f -s6 -S 115200 /dev/ttyUSB0 can0&lt;br /&gt;
sudo ip link set can0 up&lt;br /&gt;
ip -details -statistics link show can0&lt;br /&gt;
candump -tz can0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-s6 setzt CAN auf 500 kbit/s; -S 115200 betrifft den seriellen Port. -c/-o schließen/öffnen den Kanal, -f liest Status. Dies ist die Verwendung des can-utils-Werkzeugs, kein nativer USB-CAN-Netzwerktreiber.&amp;lt;ref name=&amp;quot;slcand&amp;quot;&amp;gt;https://raw.githubusercontent.com/linux-can/can-utils/master/slcand.c – Offizieller can-utils-Quelltext, insbesondere print_usage; abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur am Testbus senden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cansend can0 123#0102&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Für das Beenden: can0 mit ip link herunterfahren und den zu diesem Adapter gehörenden slcand-Prozess gezielt beenden. Keine pauschale Beendigung anderer Adapterprozesse.&lt;br /&gt;
&lt;br /&gt;
=== Python unter Linux und Windows ===&lt;br /&gt;
Alternative ohne slcand; VCP muss erreichbar sein. Beispiel erzeugt &#039;&#039;&#039;keine eigenen Datenframes&#039;&#039;&#039;, arbeitet jedoch im normalen aktiven CAN-Modus und kann ACK/Fehlerverhalten des Busses beeinflussen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python -m venv .venv&lt;br /&gt;
# Linux:&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
# Windows PowerShell stattdessen:&lt;br /&gt;
# .venv\Scripts\Activate.ps1&lt;br /&gt;
python -m pip install python-can pyserial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import can&lt;br /&gt;
&lt;br /&gt;
PORT = &amp;quot;/dev/ttyUSB0&amp;quot;  # Windows: z. B. &amp;quot;COM5&amp;quot;&lt;br /&gt;
with can.Bus(interface=&amp;quot;slcan&amp;quot;, channel=PORT,&lt;br /&gt;
             tty_baudrate=115200, bitrate=500000,&lt;br /&gt;
             listen_only=False) as bus:&lt;br /&gt;
    try:&lt;br /&gt;
        while True:&lt;br /&gt;
            message = bus.recv(timeout=1.0)&lt;br /&gt;
            if message is not None:&lt;br /&gt;
                print(message)&lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
API gemäß python-can-SLCAN-Dokumentation.&amp;lt;ref name=&amp;quot;python&amp;quot;&amp;gt;https://python-can.readthedocs.io/en/stable/interfaces/slcan.html – Offizielle python-can-Dokumentation, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt; Das Beispiel ist dokumentationsbasiert, nicht mit einer realen CANUSB-OEM-ISO getestet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Listen-only nicht voraussetzen:&#039;&#039;&#039; python-can bietet listen_only=True und slcand bietet -l; beide senden dafür L. Dieser Befehl steht nicht im aktuellen CANUSB-Handbuch. Seine Unterstützung durch die konkrete Firmware muss gesondert nachgewiesen werden. Ein lediglich lesendes Programm ist kein garantierter Silent-Sniffer.&lt;br /&gt;
&lt;br /&gt;
== Fehlerdiagnose und Grenzen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Kein COM-Port unter Windows || Load VCP aktivieren; richtigen Converter auswählen; neu verbinden&lt;br /&gt;
|-&lt;br /&gt;
| Kein ttyUSB unter Linux || ftdi_sio, PID, Kabel und konkurrierender D2XX-Zugriff&lt;br /&gt;
|-&lt;br /&gt;
| V antwortet, aber keine CAN-Frames || CAN-Bitrate, H/L, Bezugsmasse, offene/geschlossene Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
| Rote LED / Busfehler || Terminierung, Verkabelung, aktiver quittierender Gegenknoten&lt;br /&gt;
|-&lt;br /&gt;
| Verluste bei hoher Last || FIFO/USB/ASCII-Durchsatz; Hardwarefilter und Buslast prüfen&lt;br /&gt;
|-&lt;br /&gt;
| 29-Bit-Nachrichten fehlen im Monitor || Fähigkeiten der Software prüfen; Hardware unterstützt 29-Bit-IDs&lt;br /&gt;
|}&lt;br /&gt;
Keine mitgelieferten höheren Protokolle wie CANopen/J1939/BMS-Decodierung; dafür zusätzliche Software und Protokollwissen erforderlich.&amp;lt;ref name=&amp;quot;support&amp;quot; /&amp;gt; Batterie-RJ45-Belegungen sind herstellerspezifisch und nicht aus dieser D-Sub-Belegung ableitbar.&lt;br /&gt;
&lt;br /&gt;
== Quellen und offene Punkte ==&lt;br /&gt;
Die Recherche begann bei der angegebenen canusb.com-Produktseite und umfasste ELMICRO-Datenblatt, aktuelle CANUSB-Unterlagen, Supportseite und Software-Primärquellen. Gefunden: Herstellerfoto, Datenblattfoto, mechanische Padzeichnung und Treiber-/Protokollunterlagen. Nicht gefunden: separate Rückseitenaufnahme, vollständiger OEM-Schaltplan, vollständige BOM oder eine belastbare OEM-spezifische Dokumentation zusätzlicher Test-/Programmierpads. Bestückung und Firmware können revisionsabhängig sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=MCP2515=&lt;br /&gt;
&lt;br /&gt;
Modul TODO&lt;br /&gt;
&lt;br /&gt;
=MCP2515 vs SJA10001=&lt;br /&gt;
&lt;br /&gt;
Wenn man den &#039;&#039;&#039;MCP2515&#039;&#039;&#039; einsetzen und mit einer klassischen industriellen Kombination wie dem &#039;&#039;&#039;SJA1000&#039;&#039;&#039; (CAN-Controller) und einem &#039;&#039;&#039;ISO1050&#039;&#039;&#039; (galvanisch isolierter CAN-Transceiver) vergleicht, muss man wesentliche Unterschiede in der Architektur, Leistungsfaehigkeit und Physik beachten. \[1, 2\]&lt;br /&gt;
&lt;br /&gt;
==Architektur und Performance (MCP2515 vs. SJA1000)==&lt;br /&gt;
&lt;br /&gt;
Der SJA1000 von NXP gilt als der &amp;quot;Panzer&amp;quot; unter den klassischen CAN-Controllern, waehrend der MCP2515 von Microchip ein kompakter Standalone-Controller fuer kleinere eingebettete Systeme ist. \[2, 3\]&lt;br /&gt;
&lt;br /&gt;
| Kriterium | MCP2515 | SJA1000 |&lt;br /&gt;
| :---- | :---- | :---- |&lt;br /&gt;
| &#039;&#039;&#039;Schnittstelle zum Host&#039;&#039;&#039; | &#039;&#039;&#039;SPI&#039;&#039;&#039; (seriell, max. 10 MHz) | &#039;&#039;&#039;Paraller Bus&#039;&#039;&#039; (8-Bit, direkt im Speicher-Interface) |&lt;br /&gt;
| &#039;&#039;&#039;Empfangspuffer (RX)&#039;&#039;&#039; | &#039;&#039;&#039;Sehr klein:&#039;&#039;&#039; Nur 2 Message Buffer | &#039;&#039;&#039;Groesser:&#039;&#039;&#039; 64-Byte FIFO-Puffer (PeliCAN-Modus) |&lt;br /&gt;
| &#039;&#039;&#039;Gefahr von Frame-Loss&#039;&#039;&#039; | &#039;&#039;&#039;Hoch&#039;&#039;&#039; bei hoher Buslast (Buffer Overflow) | &#039;&#039;&#039;Sehr gering&#039;&#039;&#039; durch echten Hardware-FIFO |&lt;br /&gt;
&lt;br /&gt;
&amp;gt; *   &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Das Puffer-Problem (Rx-Overflow):&#039;&#039;&#039; Da der MCP2515 nur zwei Empfangspuffer besitzt, muessen Sie eingehende Nachrichten extrem schnell via SPI auslesen. Bei einer Busgeschwindigkeit von 500 kbit/s oder 1 Mbit/s und hoher Buslast (\&amp;gt; 40–50 %) kommt es bei SPI-Controllern schnell zu einem &#039;&#039;&#039;Rx-Overflow&#039;&#039;&#039;, bei dem ungelesene CAN-Nachrichten einfach verworfen werden. Der SJA1000 faengt solche Bursts durch seinen 64-Byte-FIFO problemlos ab. \[2, 4\]  &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Interrupt-Handling:&#039;&#039;&#039; Beim MCP2515 muessen Sie zwingend mit dem Hardware-Interrupt-Pin (INT) arbeiten. Reines Polling ueber SPI ist bei schnellen Bussen zu langsam und fuehrt unweigerlich zu Datenverlust. \[5, 6\]  &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Hardware-Filter nutzen:&#039;&#039;&#039; Da der Host-Prozessor beim MCP2515 durch das langsame SPI-Protokoll gebremst wird, sollten Sie die integrierten &#039;&#039;&#039;6 Acceptance Filter und 2 Masken&#039;&#039;&#039; des MCP2515 penibel konfigurieren. Lassen Sie den MCP2515 nur die Nachrichten per Interrupt an den PC/Mikrocontroller weitergeben, die Sie wirklich auswerten wollen. \[2, 4\]  &lt;br /&gt;
&amp;gt; * &lt;br /&gt;
&lt;br /&gt;
==Transceiver und galvanische Trennung (Die Rolle des ISO1050)==&lt;br /&gt;
&lt;br /&gt;
Typische billige MCP2515-Fertigmodule (z. B. fuer Arduino oder Raspberry Pi) nutzen als Transceiver den &#039;&#039;&#039;TJA1050&#039;&#039;&#039; oder &#039;&#039;&#039;MCP2551&#039;&#039;&#039;. Wenn Sie dies mit einem &#039;&#039;&#039;ISO1050&#039;&#039;&#039; vergleichen, ergeben sich massive Sicherheits- und Layout-Unterschiede: \[7, 8\]&lt;br /&gt;
&lt;br /&gt;
&amp;gt; *   &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Fehlende Isolation beim Standard-MCP2515-Modul:&#039;&#039;&#039; Der ISO1050 ist ein *galvanisch isolierter* Transceiver (bis zu 5000 V), der die empfindliche Elektronik (PC/Raspberry Pi) vor Spannungsspitzen auf dem CAN-Bus (z.B. im Auto oder in der Industrie) schuetzt. Standard-MCP2515-Boards mit dem TJA1050 besitzen &#039;&#039;&#039;keine galvanische Trennung&#039;&#039;&#039;. Schliesst man diese direkt an ein Fahrzeug-Bordnetz an, kann eine Masseschleife oder Ueberspannung den gesamten PC zerstoeren. \[7\]  &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Spannungsversorgung (3.3V vs. 5V):&#039;&#039;&#039; Der ISO1050 besitzt getrennte Spannungsversorgungen fuer die Logikseite (VCC1: 3V bis 5.5V) und die Busseite (VCC2: 4.75V bis 5.25V). Guenstige MCP2515+TJA1050-Module laufen oft &#039;&#039;&#039;strikt mit 5V&#039;&#039;&#039;. Wenn Sie ein solches Modul an ein 3.3V-Geraet (wie den Raspberry Pi oder ESP32) anschliessen, benoetigen Sie Pegelwandler (Level Shifter) auf den SPI-Leitungen (vor allem auf der MISO-Leitung), um das Board nicht zu beschaedigen. \[7\]  &lt;br /&gt;
&amp;gt; * &lt;br /&gt;
&lt;br /&gt;
==Zusammenfassende Empfehlungen fuer die Praxis==&lt;br /&gt;
&lt;br /&gt;
&amp;gt; 1. &#039;&#039;&#039;Fuer Industrie &amp;amp; Automotive:&#039;&#039;&#039; Wenn Sie den MCP2515 in rauen Umgebungen einsetzen wollen, nutzen Sie &#039;&#039;&#039;kein&#039;&#039;&#039; billiges 2-Euro-Modul. Setzen Sie stattdessen auf Boards mit integrierter galvanischer Trennung (z. B. mit einem ISO1050 oder ADM3053 Transceiver) und integrierten TVS-Schutzdioden.  &lt;br /&gt;
&amp;gt; 2. &#039;&#039;&#039;SPI-Takt maximieren:&#039;&#039;&#039; Nutzen Sie einen moeglichst hohen SPI-Takt (der MCP2515 vertraegt bis zu 10 MHz), um die Puffer so schnell wie moeglich zu leeren. Achten Sie dabei auf kurze, gut geschirmte SPI-Leitungen.  &lt;br /&gt;
&amp;gt; 3. &#039;&#039;&#039;Taktquarz beachten:&#039;&#039;&#039; Achten Sie in der Software-Konfiguration (Bit-Timing) penibel darauf, ob auf Ihrem MCP2515-Board ein &#039;&#039;&#039;8-MHz- oder ein 16-MHz-Quarz&#039;&#039;&#039; verbaut ist. Eine falsche Angabe fuehrt dazu, dass die CAN-Baudrate halbiert oder verdoppelt wird und die Kommunikation komplett fehlschlaegt. \[2, 6, 7\]&lt;br /&gt;
&lt;br /&gt;
\[1\] [https\://adaptivesupport.amd.com](https://adaptivesupport.amd.com/s/question/0D52E00006iHjy4SAC/can-bus-implement-in-spartan-kit?language=zh_CN)  &lt;br /&gt;
\[2\] [https\://www\.flywing-tech.com](https://www.flywing-tech.com/blog/mcp2515-can-bus-overview-performance-and-alternatives/)  &lt;br /&gt;
\[3\] [https\://www\.mikrocontroller.net](https://www.mikrocontroller.net/topic/226261)  &lt;br /&gt;
\[4\] [https\://www\.flywing-tech.com](https://www.flywing-tech.com/blog/mcp2515-can-bus-overview-performance-and-alternatives/)  &lt;br /&gt;
\[5\] [https\://forum.arduino.cc](https://forum.arduino.cc/t/mcp2515-using-coryjfowler-library-on-esp32/1342270?page=2)  &lt;br /&gt;
\[6\] [https\://www\.kreatives-chaos.com](http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515)  &lt;br /&gt;
\[7\] [https\://microcontrollerslab.com](https://microcontrollerslab.com/best-can-bus-modules-mcp2515-buying-guide/)  &lt;br /&gt;
\[8\] [https\://www\.ebay.de](https://www.ebay.de/itm/314870492130)&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(CAN)_CAN-Bus_%26_Co&amp;diff=5509</id>
		<title>(CAN) CAN-Bus &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(CAN)_CAN-Bus_%26_Co&amp;diff=5509"/>
		<updated>2026-10-12T07:15:41Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* CANUSB-OEM-ISO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Hin und wieder begegnet mir der CAN-Bus auch außerhalb des Einsatzortes KFZ (z.B. [[(CAN) USB2CAN]]). Um nicht jedes mal recht mühsam die Infos zum weiteren Verständnis aus Büchern (ja, sowas gibt&#039;s auch noch;-)) und dem Internet zusammensuchen zu müssen, habe ich hier mal angefangen die für mich notwendigen Informationen zusammenzustellen.&lt;br /&gt;
&lt;br /&gt;
=Feldbusse=&lt;br /&gt;
&lt;br /&gt;
CAN (Controller Area Network) gehoert mit dem &lt;br /&gt;
* LIN-Bus&lt;br /&gt;
* FlexRay&lt;br /&gt;
* MOST&lt;br /&gt;
* Byteflight und&lt;br /&gt;
* Intellibus&lt;br /&gt;
zu den Fledbus-Systemen, die im Bereich Automotive die groeszte Verbreitung finden.&lt;br /&gt;
&lt;br /&gt;
Die Pseudodefinition aus [https://de.wikipedia.org/wiki/Feldbus Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 Ein Feldbus ist ein Bussystem, das in einer Anlage Feldgeräte wie Messfühler (Sensoren) und Stellglieder (Aktoren) zur Kommunikation mit einem Automatisierungsgerät verbindet.&lt;br /&gt;
&lt;br /&gt;
finde ich in sofern widerspruechlich, als auch zu eng gefasst, da weiter unten im Artikel die o. g. Bussysteme aufgelistet werden, aber ein Auto als Feldgeraet einzuordnen braucht doch ein wenig Fantasie.&lt;br /&gt;
&lt;br /&gt;
=Historie=&lt;br /&gt;
&lt;br /&gt;
Im Schnelldurchlauf:&lt;br /&gt;
&lt;br /&gt;
Das CAN ist ein serielles Bus-System. &lt;br /&gt;
&lt;br /&gt;
Entwickelt wurde es von der Robert-Bosch GmbH ab 1983.&lt;br /&gt;
&lt;br /&gt;
Das CAN-Protokoll ist durch Patente geschuetzt.&lt;br /&gt;
&lt;br /&gt;
Specification 2.0 wurde 1991 veroeffentlicht.&lt;br /&gt;
&lt;br /&gt;
CAN ist eine reine DataLinkLayer (Sicherungsschicht) Implementation.&lt;br /&gt;
&lt;br /&gt;
ISO 11898 wurde 1993 veroeffentlicht (Road vehicles - Interchange of digital information - Controller area network (CAN) for high speed communication.&lt;br /&gt;
&lt;br /&gt;
CANopen Protokoll von CiA (CANinAutomation) 1995 veroeffentlicht.&lt;br /&gt;
&lt;br /&gt;
CiA spezifiziert CAL (CAN Applikation Layer)&lt;br /&gt;
&lt;br /&gt;
2000 Entwicklung von TTCAN (Time-triggered communication)&lt;br /&gt;
&lt;br /&gt;
=Eigenschaften=&lt;br /&gt;
&lt;br /&gt;
* Busstruktur (Topologie) mit einem TrunkCable&lt;br /&gt;
* Zweileitungssystem (verdrillt)&lt;br /&gt;
* Busterminierung an jedem Ende des TrunkCables mit einem 120 Ohm Widerstand&lt;br /&gt;
* Anschluss der Teilnehmer mit einem DropCable&lt;br /&gt;
* Bis zu 1 Mbps, dann aber max TrunkCable-Laenge 40 m&lt;br /&gt;
* Bis zu 8 Bytes können mit einer Nachricht (Frames) uebertragen werden.&lt;br /&gt;
* Multi-Master Zugriff&lt;br /&gt;
* Bus Arbitration (Streit-Schlichter) bei gleichzeitigem Zugriff mehrerer Sender&lt;br /&gt;
* Broadcast Nachrichten&lt;br /&gt;
* Keine Teilnehmer-Adressen (relevante Nachrichten werden gefiltert)&lt;br /&gt;
* Nachrichten Anforderung moeglich&lt;br /&gt;
* Error Detection und Signaling durch spezielle Frames.&lt;br /&gt;
* Automatische Wiederholung der Nachricht bei einem Fehler.&lt;br /&gt;
* Automatische Deaktivierung von Teilnehmern (nodes) bei dauerhaften Fehlern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Controllerboard CANUSB-OEM-ISO Interface Adapter Lawicell AB=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recherchestand: 11. Oktober 2026.&#039;&#039;&#039; Die CANUSB-OEM-ISO ist die galvanisch getrennte Einbauplatine des LAWICEL CANUSB. Hersteller/Fertigung: ELMICRO Computer. Treiber, ASCII-Protokoll und API sind mit CANUSB kompatibel.&amp;lt;ref name=&amp;quot;produkt&amp;quot;&amp;gt;https://www.canusb.com/products/canusb-oem-iso/ – Hersteller-Produktseite, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schnellanschluss:&#039;&#039;&#039; &lt;br /&gt;
*USB an den Computer&lt;br /&gt;
*CAN_H an D-Sub-Pin 7, CAN_L an Pin 2, CAN_GND an Pin 3. &lt;br /&gt;
*Keine externe Versorgung am CAN-Stecker einspeisen. &lt;br /&gt;
&lt;br /&gt;
=Bedienungsanleitung=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf width=&amp;quot;1000&amp;quot; height=&amp;quot;300&amp;quot;&amp;gt;File:Lawicell_canusb_manual.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&amp;lt;pdf width=&amp;quot;1000&amp;quot; height=&amp;quot;300&amp;quot;&amp;gt;File:LAWICEL_CANUSB_ASCII-Kommandos.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Platinenbilder ==&lt;br /&gt;
[[Datei:CANUSB-OEM_ISO_platine.jpg|thumb|600px|Paltinenfoto der Standardbestückung mit Mini-B und D-Sub9]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eckdaten und Varianten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! Angabe / Einordnung&lt;br /&gt;
|-&lt;br /&gt;
| Bauform || Offene FR4-Einbauplatine; kein Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| Isolation || Bauteile mindestens 1 kV; Kriechstrecke mindestens 3 mm&lt;br /&gt;
|-&lt;br /&gt;
| Bedeutung der Isolation || Kurzzeitige Bauteilprüfspannung, keine zulässige dauernde Betriebsspannung; Datenblatt sieht Versorgungsspannungen über 42 V DC nicht vor&lt;br /&gt;
|-&lt;br /&gt;
| Platinenmaß || 66,04 × 45,72 mm&lt;br /&gt;
|-&lt;br /&gt;
| Befestigung || Vier Bohrungen Ø 3,20 mm; Lochabstände 58,42 × 38,10 mm&lt;br /&gt;
|-&lt;br /&gt;
| Standardanschlüsse || USB Mini-B; CAN D-Sub9, männlich&lt;br /&gt;
|-&lt;br /&gt;
| Optionen || USB 2×5-Pads, Raster 2,54 mm; CAN sechspolige Federkraftklemme, Raster 5,08 mm&lt;br /&gt;
|-&lt;br /&gt;
| Bestellbezeichnung || CANUSB/OEM122: isoliert / Mini-B / D-Sub9&lt;br /&gt;
|}&lt;br /&gt;
OEM-spezifische Angaben: Datenblatt vom 24.06.2015.&amp;lt;ref name=&amp;quot;oem&amp;quot;&amp;gt;https://elmicro.com/files/elmicro/canusb-oem-iso_spec003.pdf – CANUSB-OEM-ISO Produktspezifikation, 24.06.2015, 2 Seiten.&amp;lt;/ref&amp;gt; Varianten und Lieferbestückung vor Bestellung bestätigen. Die Hersteller-Shopseite nennt 122,90 € netto zuzüglich Versand; das ist ein abgelesenes Angebot, kein verbindlicher aktueller Kaufpreis.&amp;lt;ref name=&amp;quot;shop&amp;quot;&amp;gt;https://elmicro.com/en/canusb-oem-iso.html – OEM-Produkt- und Bestellseite, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! CANUSB-Funktion !! Angabe&lt;br /&gt;
|-&lt;br /&gt;
| Bus || Classical CAN 2.0A/2.0B; 11-/29-Bit-Identifier, RTR; bis 1 Mbit/s&lt;br /&gt;
|-&lt;br /&gt;
| USB || USB 2.0 Full Speed, Versorgung über USB&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Controller || SJA1000, 16 MHz&lt;br /&gt;
|-&lt;br /&gt;
| Empfang || 32 Frames FIFO; optionale Millisekunden-Zeitstempel&lt;br /&gt;
|-&lt;br /&gt;
| Anzeigen || Grün: CAN-Aktivität; Rot: CAN-Fehler&lt;br /&gt;
|-&lt;br /&gt;
| Software || FTDI VCP oder D2XX; LAWICEL API-DLL 32/64 Bit&lt;br /&gt;
|}&lt;br /&gt;
Diese Funktionen stammen vom kompatiblen CANUSB.&amp;lt;ref name=&amp;quot;canusb&amp;quot;&amp;gt;https://www.canusb.com/products/canusb/ – LAWICEL CANUSB, Spezifikationen und Anschlussinformationen.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;CAN FD wird nicht unterstützt.&#039;&#039;&#039; Die Gehäusemaße, Stromaufnahme und Temperaturfreigabe des normalen Dongles sind kein eigenständiger OEM-Nachweis. Ebenso darf 1 Mbit/s nicht als Garantie verlustfreier Aufzeichnung eines voll ausgelasteten Busses verstanden werden.&lt;br /&gt;
&lt;br /&gt;
== Anschlussbelegungen ==&lt;br /&gt;
=== D-Sub9: CAN ===&lt;br /&gt;
Pinzahlen am Steckverbinder verwenden: Lötseite und Steckseite sind spiegelverkehrt. Die folgenden drei Signale sind vom Hersteller ausdrücklich für den Betrieb genannt.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Pin !! Verwendung an dieser Baugruppe&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Für Betrieb nicht verwenden; tatsächliche OEM-Verschaltung nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CAN_L&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CAN_GND, galvanisch getrennte Busseite&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Für Betrieb nicht verwenden; nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Für Betrieb nicht verwenden; Schirmbehandlung nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Für Betrieb nicht verwenden; zusätzliche Masseverbindung nicht separat bestätigt&lt;br /&gt;
|-&lt;br /&gt;
| 7 || CAN_H&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Für Betrieb nicht verwenden; nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Keine externe Versorgung erforderlich; nicht mit Batteriespannung verbinden&lt;br /&gt;
|}&lt;br /&gt;
Ein D-Sub9-Stecker macht das Gerät nicht zu RS232. Insbesondere nicht an einen seriellen PC-Port anschließen.&lt;br /&gt;
&lt;br /&gt;
=== USB-Pads: 2×5 ===&lt;br /&gt;
&#039;&#039;&#039;Orientierung wie in der Maßzeichnung: USB-Pads links, CAN-Pads rechts.&#039;&#039;&#039; Beide Spalten haben dieselbe Zeilenbelegung. Keine erfundene fortlaufende Pin-Nummerierung: Das Datenblatt benennt Signale, keine Pinnummern.&amp;lt;ref name=&amp;quot;oem&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Zeile von oben !! Linkes Pad !! Rechtes Pad&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC (+5 V USB) || VCC (+5 V USB)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || D− || D−&lt;br /&gt;
|-&lt;br /&gt;
| 3 || D+ || D+&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND (USB-Seite) || GND (USB-Seite)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || n.c. || n.c.&lt;br /&gt;
|}&lt;br /&gt;
Nicht blind einen beliebigen Mainboard-USB-Stecker aufsetzen: Position des fehlenden Pins und der freien Leitung am konkreten Kabel prüfen. USB-GND nicht mit CAN_GND brücken, wenn die galvanische Trennung erhalten bleiben soll. Mini-B und Header nicht gleichzeitig an zwei USB-Hosts anschließen.&lt;br /&gt;
&lt;br /&gt;
=== CAN-Pads / optionale Klemme ===&lt;br /&gt;
Die Zeichnung zeigt sechs Signalpositionen mit jeweils zwei horizontalen Lötpads. &#039;&#039;&#039;Von oben nach unten in der Herstellerzeichnung:&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;oem&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Position !! Signal !! Verbindung zum D-Sub&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CAN_H || Pin 7&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CAN_H || Pin 7&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CAN_L || Pin 2&lt;br /&gt;
|-&lt;br /&gt;
| 4 || CAN_L || Pin 2&lt;br /&gt;
|-&lt;br /&gt;
| 5 || CAN_GND || Pin 3&lt;br /&gt;
|-&lt;br /&gt;
| 6 || CAN_GND || Pin 3&lt;br /&gt;
|}&lt;br /&gt;
Signalreihenfolge aus der Zeichnung, D-Sub-Zuordnung aus den CANUSB-Anschlussangaben. Die Nummern 1–6 sind hier Positionshilfen, keine aufgedruckten Hersteller-Pinnummern. Masse auf der Busseite ist nicht USB-Masse.&lt;br /&gt;
&lt;br /&gt;
=== Praktischer Kabelaufbau ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Computer / Board !! Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| USB Mini-B || USB-Host über geeignetes Datenkabel&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 7 / CAN_H-Pad || CAN_H der Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 2 / CAN_L-Pad || CAN_L der Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 3 / CAN_GND-Pad || CAN-Bezugsmasse der Gegenstelle&lt;br /&gt;
|}&lt;br /&gt;
CAN_H/CAN_L als verdrilltes Paar führen. An beiden physikalischen Busenden jeweils 120 Ω zwischen H und L; einen zusätzlichen Abschluss nur setzen, wenn die Platine am Busende sitzt und dort noch kein Abschluss vorhanden ist. Bei ausgeschalteten Geräten ergeben zwei parallele 120-Ω-Abschlüsse rechnerisch etwa 60 Ω. &#039;&#039;&#039;Eine onboard zuschaltbare Terminierung ist in den recherchierten OEM-Unterlagen nicht belegt.&#039;&#039;&#039; Für normales Senden braucht es einen weiteren aktiven CAN-Knoten, der quittiert.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bauteile / Teilstückliste ==&lt;br /&gt;
&#039;&#039;&#039;Keine vollständige Hersteller-BOM gefunden.&#039;&#039;&#039; Die Tabelle ist eine Funktions- und Identifikationsliste, keine belastbare Einkaufsstückliste. Nicht lesbare Werte und Bestückungsreferenzen werden nicht ergänzt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Baugruppe / Bauteil !! Identifikation !! Belegstatus&lt;br /&gt;
|-&lt;br /&gt;
| USB-FIFO || FTDI FT245RL || In CANUSB-Unterlagen genannt; entsprechendes IC im OEM-Foto&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Controller || NXP/Philips SJA1000 || Dokumentiert; NXP-IC im Platinenfoto&lt;br /&gt;
|-&lt;br /&gt;
| Mikrocontroller || Atmel AVR || CANUSB-Handbuch; konkreten OEM-Typ am eigenen Board ablesen&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Transceiver || CANUSB nennt 82C251 || Nicht als verbindliche OEM-BOM behandeln; exakten Aufdruck prüfen&lt;br /&gt;
|-&lt;br /&gt;
| Isolations-Signalbauteile || Typ nicht sicher bestimmt || Im OEM-Foto sichtbar; keine öffentliche Bestückungsliste gefunden&lt;br /&gt;
|-&lt;br /&gt;
| Isolierte Versorgung || DC/DC-Funktionsblock plausibel || Bauteiltyp und Kennwerte nicht verifiziert&lt;br /&gt;
|-&lt;br /&gt;
| Taktbauteile || Quarz / Resonator || Foto; vollständige Frequenz- und Typzuordnung offen&lt;br /&gt;
|-&lt;br /&gt;
| USB-Buchse || Mini-B, SMD || OEM-Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Stecker || D-Sub9 male, SMD mit mechanischen TH-Pads || OEM-Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| Optionale USB-Stiftleiste || 2×5, 2,54 mm || Variante; Standardfoto zeigt freie Pads&lt;br /&gt;
|-&lt;br /&gt;
| Optionale CAN-Klemme || 6-polig, 5,08 mm || Variante; Standardfoto zeigt freie Pads&lt;br /&gt;
|-&lt;br /&gt;
| LEDs / R / C / Schutzbeschaltung || Einzelwerte unbekannt || Keine vollständige BOM gefunden&lt;br /&gt;
|}&lt;br /&gt;
Basis-ICs: CANUSB-Produktseite und Handbuch; Sichtbefunde: Herstellerfoto.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;manual&amp;quot;&amp;gt;https://www.canusb.com/files/canusb_manual.pdf – LAWICEL CANUSB User Manual, Rev. 1.1-en, 12.07.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schaltung und Schaltplan ==&lt;br /&gt;
[[Datei:CANUSB-OEM-ISO_funktionsschema.svg|thumb|800px|Eigenes vereinfachtes Funktionsschema; kein Hersteller-Schaltplan.]]&lt;br /&gt;
&#039;&#039;&#039;Ein vollständiger öffentlich zugänglicher OEM-Schaltplan wurde nicht gefunden.&#039;&#039;&#039; Ebenso fehlen verifizierte Gerberdaten, Netzliste und vollständige BOM. Das Schema zeigt nur die funktionale Architektur. Es ist weder eine Rekonstruktion der tatsächlichen Verdrahtung noch eine Nachbauvorlage. Ein SJA1000-Datenblatt ersetzt keinen OEM-Schaltplan.&lt;br /&gt;
&lt;br /&gt;
== Betrieb unter Windows ==&lt;br /&gt;
# Platine per USB-Datenkabel anschließen; FTDI-Treiber normalerweise automatisch installieren lassen, andernfalls das offizielle FTDI-Paket verwenden.&lt;br /&gt;
# Geräte-Manager: passenden „USB Serial Converter“ anhand Gerätebeschreibung „CANUSB“ identifizieren.&lt;br /&gt;
# Für COM-Port-Zugriff: Eigenschaften → Erweitert → „Load VCP“ aktivieren, USB abziehen und wieder einstecken.&lt;br /&gt;
# Zugewiesenen COM-Port notieren. Terminal mit 8N1, ohne Handshake und mit &#039;&#039;&#039;CR allein&#039;&#039;&#039; als Sendeabschluss öffnen. Laut Hersteller ist die eingestellte virtuelle Baudrate beliebig; sie ist nicht die CAN-Bitrate.&lt;br /&gt;
# Zuerst nur Version mit V abfragen; danach passende CAN-Bitrate setzen und Kanal öffnen.&lt;br /&gt;
Diese VCP-Schritte sind im Hersteller-Testtutorial beschrieben.&amp;lt;ref name=&amp;quot;test&amp;quot;&amp;gt;https://www.canusb.com/support/howto-check-canusb/ – Hersteller-Testanleitung, 02.02.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternative: D2XX und LAWICEL CANUSB-DLL. DLL-Architektur muss zur Anwendung passen: canusbdrv.dll für 32 Bit, canusbdrv64.dll für 64 Bit. Auch eine 32-Bit-Anwendung unter 64-Bit-Windows braucht die 32-Bit-DLL. Hersteller-Supportseite enthält DLL-Paket, Beispiele und CAN Monitor Lite. Alte Geräte vor Februar 2015 können PID FFA8 statt 6001 besitzen und benötigen besondere Behandlung. Derselbe Adapter sollte nicht parallel von Terminal und D2XX-Anwendung geöffnet werden.&amp;lt;ref name=&amp;quot;support&amp;quot;&amp;gt;https://www.canusb.com/support/canusb-support/ – Treiber, DLL, Beispiele, Legacy-Hinweise.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Windows 11 ist hier nicht als separat getestete OEM-Konfiguration nachgewiesen. Den passenden aktuellen FTDI-Treiber und die Anwendungskompatibilität prüfen; alte Windows-Treiber nicht ungeprüft übernehmen.&lt;br /&gt;
&lt;br /&gt;
== ASCII-Befehle ==&lt;br /&gt;
Groß-/Kleinschreibung beachten; jede Zeile endet mit CR (0x0D). Konfiguration bei geschlossenem CAN-Kanal.&amp;lt;ref name=&amp;quot;manual&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Befehl !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| V / N || Version / Seriennummer&lt;br /&gt;
|-&lt;br /&gt;
| S0, S1, S2, S3, S4 || 10, 20, 50, 100, 125 kbit/s&lt;br /&gt;
|-&lt;br /&gt;
| S5, S6, S7, S8 || 250, 500, 800, 1000 kbit/s&lt;br /&gt;
|-&lt;br /&gt;
| sxxyy || SJA1000 BTR0/BTR1 setzen&lt;br /&gt;
|-&lt;br /&gt;
| O / C || Kanal öffnen / schließen&lt;br /&gt;
|-&lt;br /&gt;
| tiiildd… / Tiiiiiiiildd… || 11-/29-Bit-Datenframe; DLC 0–8&lt;br /&gt;
|-&lt;br /&gt;
| riiil / Riiiiiiiil || RTR mit 11-/29-Bit-ID&lt;br /&gt;
|-&lt;br /&gt;
| F || Fehlerstatus&lt;br /&gt;
|-&lt;br /&gt;
| Mxxxxxxxx / mxxxxxxxx || Acceptance-Code / -Maske&lt;br /&gt;
|-&lt;br /&gt;
| Z0 / Z1 || Empfangszeitstempel aus / an&lt;br /&gt;
|}&lt;br /&gt;
Beispiel für einen eigenen Testbus mit 500 kbit/s; jede Zeile einzeln senden und Antwort abwarten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
V&lt;br /&gt;
S6&lt;br /&gt;
O&lt;br /&gt;
F&lt;br /&gt;
C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein Sendetest erst am geeigneten Testbus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
t12320102&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bedeutung: ID 0x123, zwei Datenbytes 01 02. &#039;&#039;&#039;Nicht als BMS-Abfrage oder sonstigen gerätespezifischen Befehl interpretieren.&#039;&#039;&#039; Erfolg bei Datenframes: z beziehungsweise Z plus CR; Fehler: BEL (0x07). Ein angenommenes Sendekommando ist kein Nachweis, dass die Zielanwendung die Daten verstanden hat.&lt;br /&gt;
&lt;br /&gt;
== Betrieb unter Linux ==&lt;br /&gt;
=== Erkennung ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsusb&lt;br /&gt;
sudo modprobe ftdi_sio&lt;br /&gt;
journalctl -k -n 50&lt;br /&gt;
ls -l /dev/serial/by-id/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Typischer Port: /dev/ttyUSB0; bei mehreren Adaptern stabilen by-id-Pfad bevorzugen. Moderne Geräte verwenden FTDI-PID 6001, alte FFA8.&amp;lt;ref name=&amp;quot;support&amp;quot; /&amp;gt; Kein ttyUSB-Port: USB-Datenkabel, Treiberbindung, PID und Zugriffsrechte prüfen. D2XX-Zugriff und ftdi_sio können um das Gerät konkurrieren.&lt;br /&gt;
&lt;br /&gt;
So wurde die Karte bei mir eingebunden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lrwxrwxrwx. 1 root root 13 11. Okt 19:24 usb-LAWICEL_CANUSB_LWZ2QLNW-if00-port0 -&amp;gt; ../../ttyUSB1&lt;br /&gt;
Bus 003 Device 056: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SocketCAN mit slcand ===&lt;br /&gt;
Benötigt can-utils, iproute2 und Kernelmodul slcan. Beispielinstallation je nach Distribution:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Debian / Ubuntu&lt;br /&gt;
sudo apt install can-utils iproute2&lt;br /&gt;
# Fedora&lt;br /&gt;
sudo dnf install can-utils iproute&lt;br /&gt;
# openSUSE: Paketverfügbarkeit im verwendeten Release prüfen&lt;br /&gt;
sudo zypper install can-utils iproute2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vorher andere Programme am seriellen Port schließen. 500-kbit/s-Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo modprobe slcan&lt;br /&gt;
sudo slcand -o -c -f -s6 -S 115200 /dev/ttyUSB0 can0&lt;br /&gt;
sudo ip link set can0 up&lt;br /&gt;
ip -details -statistics link show can0&lt;br /&gt;
candump -tz can0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-s6 setzt CAN auf 500 kbit/s; -S 115200 betrifft den seriellen Port. -c/-o schließen/öffnen den Kanal, -f liest Status. Dies ist die Verwendung des can-utils-Werkzeugs, kein nativer USB-CAN-Netzwerktreiber.&amp;lt;ref name=&amp;quot;slcand&amp;quot;&amp;gt;https://raw.githubusercontent.com/linux-can/can-utils/master/slcand.c – Offizieller can-utils-Quelltext, insbesondere print_usage; abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur am Testbus senden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cansend can0 123#0102&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Für das Beenden: can0 mit ip link herunterfahren und den zu diesem Adapter gehörenden slcand-Prozess gezielt beenden. Keine pauschale Beendigung anderer Adapterprozesse.&lt;br /&gt;
&lt;br /&gt;
=== Python unter Linux und Windows ===&lt;br /&gt;
Alternative ohne slcand; VCP muss erreichbar sein. Beispiel erzeugt &#039;&#039;&#039;keine eigenen Datenframes&#039;&#039;&#039;, arbeitet jedoch im normalen aktiven CAN-Modus und kann ACK/Fehlerverhalten des Busses beeinflussen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python -m venv .venv&lt;br /&gt;
# Linux:&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
# Windows PowerShell stattdessen:&lt;br /&gt;
# .venv\Scripts\Activate.ps1&lt;br /&gt;
python -m pip install python-can pyserial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import can&lt;br /&gt;
&lt;br /&gt;
PORT = &amp;quot;/dev/ttyUSB0&amp;quot;  # Windows: z. B. &amp;quot;COM5&amp;quot;&lt;br /&gt;
with can.Bus(interface=&amp;quot;slcan&amp;quot;, channel=PORT,&lt;br /&gt;
             tty_baudrate=115200, bitrate=500000,&lt;br /&gt;
             listen_only=False) as bus:&lt;br /&gt;
    try:&lt;br /&gt;
        while True:&lt;br /&gt;
            message = bus.recv(timeout=1.0)&lt;br /&gt;
            if message is not None:&lt;br /&gt;
                print(message)&lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
API gemäß python-can-SLCAN-Dokumentation.&amp;lt;ref name=&amp;quot;python&amp;quot;&amp;gt;https://python-can.readthedocs.io/en/stable/interfaces/slcan.html – Offizielle python-can-Dokumentation, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt; Das Beispiel ist dokumentationsbasiert, nicht mit einer realen CANUSB-OEM-ISO getestet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Listen-only nicht voraussetzen:&#039;&#039;&#039; python-can bietet listen_only=True und slcand bietet -l; beide senden dafür L. Dieser Befehl steht nicht im aktuellen CANUSB-Handbuch. Seine Unterstützung durch die konkrete Firmware muss gesondert nachgewiesen werden. Ein lediglich lesendes Programm ist kein garantierter Silent-Sniffer.&lt;br /&gt;
&lt;br /&gt;
== Fehlerdiagnose und Grenzen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Kein COM-Port unter Windows || Load VCP aktivieren; richtigen Converter auswählen; neu verbinden&lt;br /&gt;
|-&lt;br /&gt;
| Kein ttyUSB unter Linux || ftdi_sio, PID, Kabel und konkurrierender D2XX-Zugriff&lt;br /&gt;
|-&lt;br /&gt;
| V antwortet, aber keine CAN-Frames || CAN-Bitrate, H/L, Bezugsmasse, offene/geschlossene Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
| Rote LED / Busfehler || Terminierung, Verkabelung, aktiver quittierender Gegenknoten&lt;br /&gt;
|-&lt;br /&gt;
| Verluste bei hoher Last || FIFO/USB/ASCII-Durchsatz; Hardwarefilter und Buslast prüfen&lt;br /&gt;
|-&lt;br /&gt;
| 29-Bit-Nachrichten fehlen im Monitor || Fähigkeiten der Software prüfen; Hardware unterstützt 29-Bit-IDs&lt;br /&gt;
|}&lt;br /&gt;
Keine mitgelieferten höheren Protokolle wie CANopen/J1939/BMS-Decodierung; dafür zusätzliche Software und Protokollwissen erforderlich.&amp;lt;ref name=&amp;quot;support&amp;quot; /&amp;gt; Batterie-RJ45-Belegungen sind herstellerspezifisch und nicht aus dieser D-Sub-Belegung ableitbar.&lt;br /&gt;
&lt;br /&gt;
== Quellen und offene Punkte ==&lt;br /&gt;
Die Recherche begann bei der angegebenen canusb.com-Produktseite und umfasste ELMICRO-Datenblatt, aktuelle CANUSB-Unterlagen, Supportseite und Software-Primärquellen. Gefunden: Herstellerfoto, Datenblattfoto, mechanische Padzeichnung und Treiber-/Protokollunterlagen. Nicht gefunden: separate Rückseitenaufnahme, vollständiger OEM-Schaltplan, vollständige BOM oder eine belastbare OEM-spezifische Dokumentation zusätzlicher Test-/Programmierpads. Bestückung und Firmware können revisionsabhängig sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=MCP2515=&lt;br /&gt;
&lt;br /&gt;
Modul TODO&lt;br /&gt;
&lt;br /&gt;
=MCP2515 vs SJA10001=&lt;br /&gt;
&lt;br /&gt;
Wenn man den &#039;&#039;&#039;MCP2515&#039;&#039;&#039; einsetzen und mit einer klassischen industriellen Kombination wie dem &#039;&#039;&#039;SJA1000&#039;&#039;&#039; (CAN-Controller) und einem &#039;&#039;&#039;ISO1050&#039;&#039;&#039; (galvanisch isolierter CAN-Transceiver) vergleicht, muss man wesentliche Unterschiede in der Architektur, Leistungsfaehigkeit und Physik beachten. \[1, 2\]&lt;br /&gt;
&lt;br /&gt;
==Architektur und Performance (MCP2515 vs. SJA1000)==&lt;br /&gt;
&lt;br /&gt;
Der SJA1000 von NXP gilt als der &amp;quot;Panzer&amp;quot; unter den klassischen CAN-Controllern, waehrend der MCP2515 von Microchip ein kompakter Standalone-Controller fuer kleinere eingebettete Systeme ist. \[2, 3\]&lt;br /&gt;
&lt;br /&gt;
| Kriterium | MCP2515 | SJA1000 |&lt;br /&gt;
| :---- | :---- | :---- |&lt;br /&gt;
| &#039;&#039;&#039;Schnittstelle zum Host&#039;&#039;&#039; | &#039;&#039;&#039;SPI&#039;&#039;&#039; (seriell, max. 10 MHz) | &#039;&#039;&#039;Paraller Bus&#039;&#039;&#039; (8-Bit, direkt im Speicher-Interface) |&lt;br /&gt;
| &#039;&#039;&#039;Empfangspuffer (RX)&#039;&#039;&#039; | &#039;&#039;&#039;Sehr klein:&#039;&#039;&#039; Nur 2 Message Buffer | &#039;&#039;&#039;Groesser:&#039;&#039;&#039; 64-Byte FIFO-Puffer (PeliCAN-Modus) |&lt;br /&gt;
| &#039;&#039;&#039;Gefahr von Frame-Loss&#039;&#039;&#039; | &#039;&#039;&#039;Hoch&#039;&#039;&#039; bei hoher Buslast (Buffer Overflow) | &#039;&#039;&#039;Sehr gering&#039;&#039;&#039; durch echten Hardware-FIFO |&lt;br /&gt;
&lt;br /&gt;
&amp;gt; *   &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Das Puffer-Problem (Rx-Overflow):&#039;&#039;&#039; Da der MCP2515 nur zwei Empfangspuffer besitzt, muessen Sie eingehende Nachrichten extrem schnell via SPI auslesen. Bei einer Busgeschwindigkeit von 500 kbit/s oder 1 Mbit/s und hoher Buslast (\&amp;gt; 40–50 %) kommt es bei SPI-Controllern schnell zu einem &#039;&#039;&#039;Rx-Overflow&#039;&#039;&#039;, bei dem ungelesene CAN-Nachrichten einfach verworfen werden. Der SJA1000 faengt solche Bursts durch seinen 64-Byte-FIFO problemlos ab. \[2, 4\]  &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Interrupt-Handling:&#039;&#039;&#039; Beim MCP2515 muessen Sie zwingend mit dem Hardware-Interrupt-Pin (INT) arbeiten. Reines Polling ueber SPI ist bei schnellen Bussen zu langsam und fuehrt unweigerlich zu Datenverlust. \[5, 6\]  &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Hardware-Filter nutzen:&#039;&#039;&#039; Da der Host-Prozessor beim MCP2515 durch das langsame SPI-Protokoll gebremst wird, sollten Sie die integrierten &#039;&#039;&#039;6 Acceptance Filter und 2 Masken&#039;&#039;&#039; des MCP2515 penibel konfigurieren. Lassen Sie den MCP2515 nur die Nachrichten per Interrupt an den PC/Mikrocontroller weitergeben, die Sie wirklich auswerten wollen. \[2, 4\]  &lt;br /&gt;
&amp;gt; * &lt;br /&gt;
&lt;br /&gt;
==Transceiver und galvanische Trennung (Die Rolle des ISO1050)==&lt;br /&gt;
&lt;br /&gt;
Typische billige MCP2515-Fertigmodule (z. B. fuer Arduino oder Raspberry Pi) nutzen als Transceiver den &#039;&#039;&#039;TJA1050&#039;&#039;&#039; oder &#039;&#039;&#039;MCP2551&#039;&#039;&#039;. Wenn Sie dies mit einem &#039;&#039;&#039;ISO1050&#039;&#039;&#039; vergleichen, ergeben sich massive Sicherheits- und Layout-Unterschiede: \[7, 8\]&lt;br /&gt;
&lt;br /&gt;
&amp;gt; *   &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Fehlende Isolation beim Standard-MCP2515-Modul:&#039;&#039;&#039; Der ISO1050 ist ein *galvanisch isolierter* Transceiver (bis zu 5000 V), der die empfindliche Elektronik (PC/Raspberry Pi) vor Spannungsspitzen auf dem CAN-Bus (z.B. im Auto oder in der Industrie) schuetzt. Standard-MCP2515-Boards mit dem TJA1050 besitzen &#039;&#039;&#039;keine galvanische Trennung&#039;&#039;&#039;. Schliesst man diese direkt an ein Fahrzeug-Bordnetz an, kann eine Masseschleife oder Ueberspannung den gesamten PC zerstoeren. \[7\]  &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Spannungsversorgung (3.3V vs. 5V):&#039;&#039;&#039; Der ISO1050 besitzt getrennte Spannungsversorgungen fuer die Logikseite (VCC1: 3V bis 5.5V) und die Busseite (VCC2: 4.75V bis 5.25V). Guenstige MCP2515+TJA1050-Module laufen oft &#039;&#039;&#039;strikt mit 5V&#039;&#039;&#039;. Wenn Sie ein solches Modul an ein 3.3V-Geraet (wie den Raspberry Pi oder ESP32) anschliessen, benoetigen Sie Pegelwandler (Level Shifter) auf den SPI-Leitungen (vor allem auf der MISO-Leitung), um das Board nicht zu beschaedigen. \[7\]  &lt;br /&gt;
&amp;gt; * &lt;br /&gt;
&lt;br /&gt;
==Zusammenfassende Empfehlungen fuer die Praxis==&lt;br /&gt;
&lt;br /&gt;
&amp;gt; 1. &#039;&#039;&#039;Fuer Industrie &amp;amp; Automotive:&#039;&#039;&#039; Wenn Sie den MCP2515 in rauen Umgebungen einsetzen wollen, nutzen Sie &#039;&#039;&#039;kein&#039;&#039;&#039; billiges 2-Euro-Modul. Setzen Sie stattdessen auf Boards mit integrierter galvanischer Trennung (z. B. mit einem ISO1050 oder ADM3053 Transceiver) und integrierten TVS-Schutzdioden.  &lt;br /&gt;
&amp;gt; 2. &#039;&#039;&#039;SPI-Takt maximieren:&#039;&#039;&#039; Nutzen Sie einen moeglichst hohen SPI-Takt (der MCP2515 vertraegt bis zu 10 MHz), um die Puffer so schnell wie moeglich zu leeren. Achten Sie dabei auf kurze, gut geschirmte SPI-Leitungen.  &lt;br /&gt;
&amp;gt; 3. &#039;&#039;&#039;Taktquarz beachten:&#039;&#039;&#039; Achten Sie in der Software-Konfiguration (Bit-Timing) penibel darauf, ob auf Ihrem MCP2515-Board ein &#039;&#039;&#039;8-MHz- oder ein 16-MHz-Quarz&#039;&#039;&#039; verbaut ist. Eine falsche Angabe fuehrt dazu, dass die CAN-Baudrate halbiert oder verdoppelt wird und die Kommunikation komplett fehlschlaegt. \[2, 6, 7\]&lt;br /&gt;
&lt;br /&gt;
\[1\] [https\://adaptivesupport.amd.com](https://adaptivesupport.amd.com/s/question/0D52E00006iHjy4SAC/can-bus-implement-in-spartan-kit?language=zh_CN)  &lt;br /&gt;
\[2\] [https\://www\.flywing-tech.com](https://www.flywing-tech.com/blog/mcp2515-can-bus-overview-performance-and-alternatives/)  &lt;br /&gt;
\[3\] [https\://www\.mikrocontroller.net](https://www.mikrocontroller.net/topic/226261)  &lt;br /&gt;
\[4\] [https\://www\.flywing-tech.com](https://www.flywing-tech.com/blog/mcp2515-can-bus-overview-performance-and-alternatives/)  &lt;br /&gt;
\[5\] [https\://forum.arduino.cc](https://forum.arduino.cc/t/mcp2515-using-coryjfowler-library-on-esp32/1342270?page=2)  &lt;br /&gt;
\[6\] [https\://www\.kreatives-chaos.com](http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515)  &lt;br /&gt;
\[7\] [https\://microcontrollerslab.com](https://microcontrollerslab.com/best-can-bus-modules-mcp2515-buying-guide/)  &lt;br /&gt;
\[8\] [https\://www\.ebay.de](https://www.ebay.de/itm/314870492130)&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:LAWICEL_CANUSB_ASCII-Kommandos.pdf&amp;diff=5508</id>
		<title>Datei:LAWICEL CANUSB ASCII-Kommandos.pdf</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:LAWICEL_CANUSB_ASCII-Kommandos.pdf&amp;diff=5508"/>
		<updated>2026-10-12T07:13:41Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Lawicell_canusb_manual.pdf&amp;diff=5507</id>
		<title>Datei:Lawicell canusb manual.pdf</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Lawicell_canusb_manual.pdf&amp;diff=5507"/>
		<updated>2026-10-12T07:13:40Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(CAN)_CAN-Bus_%26_Co&amp;diff=5506</id>
		<title>(CAN) CAN-Bus &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(CAN)_CAN-Bus_%26_Co&amp;diff=5506"/>
		<updated>2026-10-12T07:11:59Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Controllerboard CANUSB-OEM-ISO INTERFACE ADAPTER TYP 122 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Hin und wieder begegnet mir der CAN-Bus auch außerhalb des Einsatzortes KFZ (z.B. [[(CAN) USB2CAN]]). Um nicht jedes mal recht mühsam die Infos zum weiteren Verständnis aus Büchern (ja, sowas gibt&#039;s auch noch;-)) und dem Internet zusammensuchen zu müssen, habe ich hier mal angefangen die für mich notwendigen Informationen zusammenzustellen.&lt;br /&gt;
&lt;br /&gt;
=Feldbusse=&lt;br /&gt;
&lt;br /&gt;
CAN (Controller Area Network) gehoert mit dem &lt;br /&gt;
* LIN-Bus&lt;br /&gt;
* FlexRay&lt;br /&gt;
* MOST&lt;br /&gt;
* Byteflight und&lt;br /&gt;
* Intellibus&lt;br /&gt;
zu den Fledbus-Systemen, die im Bereich Automotive die groeszte Verbreitung finden.&lt;br /&gt;
&lt;br /&gt;
Die Pseudodefinition aus [https://de.wikipedia.org/wiki/Feldbus Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 Ein Feldbus ist ein Bussystem, das in einer Anlage Feldgeräte wie Messfühler (Sensoren) und Stellglieder (Aktoren) zur Kommunikation mit einem Automatisierungsgerät verbindet.&lt;br /&gt;
&lt;br /&gt;
finde ich in sofern widerspruechlich, als auch zu eng gefasst, da weiter unten im Artikel die o. g. Bussysteme aufgelistet werden, aber ein Auto als Feldgeraet einzuordnen braucht doch ein wenig Fantasie.&lt;br /&gt;
&lt;br /&gt;
=Historie=&lt;br /&gt;
&lt;br /&gt;
Im Schnelldurchlauf:&lt;br /&gt;
&lt;br /&gt;
Das CAN ist ein serielles Bus-System. &lt;br /&gt;
&lt;br /&gt;
Entwickelt wurde es von der Robert-Bosch GmbH ab 1983.&lt;br /&gt;
&lt;br /&gt;
Das CAN-Protokoll ist durch Patente geschuetzt.&lt;br /&gt;
&lt;br /&gt;
Specification 2.0 wurde 1991 veroeffentlicht.&lt;br /&gt;
&lt;br /&gt;
CAN ist eine reine DataLinkLayer (Sicherungsschicht) Implementation.&lt;br /&gt;
&lt;br /&gt;
ISO 11898 wurde 1993 veroeffentlicht (Road vehicles - Interchange of digital information - Controller area network (CAN) for high speed communication.&lt;br /&gt;
&lt;br /&gt;
CANopen Protokoll von CiA (CANinAutomation) 1995 veroeffentlicht.&lt;br /&gt;
&lt;br /&gt;
CiA spezifiziert CAL (CAN Applikation Layer)&lt;br /&gt;
&lt;br /&gt;
2000 Entwicklung von TTCAN (Time-triggered communication)&lt;br /&gt;
&lt;br /&gt;
=Eigenschaften=&lt;br /&gt;
&lt;br /&gt;
* Busstruktur (Topologie) mit einem TrunkCable&lt;br /&gt;
* Zweileitungssystem (verdrillt)&lt;br /&gt;
* Busterminierung an jedem Ende des TrunkCables mit einem 120 Ohm Widerstand&lt;br /&gt;
* Anschluss der Teilnehmer mit einem DropCable&lt;br /&gt;
* Bis zu 1 Mbps, dann aber max TrunkCable-Laenge 40 m&lt;br /&gt;
* Bis zu 8 Bytes können mit einer Nachricht (Frames) uebertragen werden.&lt;br /&gt;
* Multi-Master Zugriff&lt;br /&gt;
* Bus Arbitration (Streit-Schlichter) bei gleichzeitigem Zugriff mehrerer Sender&lt;br /&gt;
* Broadcast Nachrichten&lt;br /&gt;
* Keine Teilnehmer-Adressen (relevante Nachrichten werden gefiltert)&lt;br /&gt;
* Nachrichten Anforderung moeglich&lt;br /&gt;
* Error Detection und Signaling durch spezielle Frames.&lt;br /&gt;
* Automatische Wiederholung der Nachricht bei einem Fehler.&lt;br /&gt;
* Automatische Deaktivierung von Teilnehmern (nodes) bei dauerhaften Fehlern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Controllerboard CANUSB-OEM-ISO Interface Adapter Lawicell AB=&lt;br /&gt;
&lt;br /&gt;
= CANUSB-OEM-ISO =&lt;br /&gt;
&#039;&#039;&#039;Recherchestand: 11. Oktober 2026.&#039;&#039;&#039; Die CANUSB-OEM-ISO ist die galvanisch getrennte Einbauplatine des LAWICEL CANUSB. Hersteller/Fertigung: ELMICRO Computer. Treiber, ASCII-Protokoll und API sind mit CANUSB kompatibel.&amp;lt;ref name=&amp;quot;produkt&amp;quot;&amp;gt;https://www.canusb.com/products/canusb-oem-iso/ – Hersteller-Produktseite, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schnellanschluss:&#039;&#039;&#039; &lt;br /&gt;
*USB an den Computer&lt;br /&gt;
*CAN_H an D-Sub-Pin 7, CAN_L an Pin 2, CAN_GND an Pin 3. &lt;br /&gt;
*Keine externe Versorgung am CAN-Stecker einspeisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platinenbilder ==&lt;br /&gt;
[[Datei:CANUSB-OEM_ISO_platine.jpg|thumb|600px|Paltinenfoto der Standardbestückung mit Mini-B und D-Sub9]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eckdaten und Varianten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! Angabe / Einordnung&lt;br /&gt;
|-&lt;br /&gt;
| Bauform || Offene FR4-Einbauplatine; kein Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| Isolation || Bauteile mindestens 1 kV; Kriechstrecke mindestens 3 mm&lt;br /&gt;
|-&lt;br /&gt;
| Bedeutung der Isolation || Kurzzeitige Bauteilprüfspannung, keine zulässige dauernde Betriebsspannung; Datenblatt sieht Versorgungsspannungen über 42 V DC nicht vor&lt;br /&gt;
|-&lt;br /&gt;
| Platinenmaß || 66,04 × 45,72 mm&lt;br /&gt;
|-&lt;br /&gt;
| Befestigung || Vier Bohrungen Ø 3,20 mm; Lochabstände 58,42 × 38,10 mm&lt;br /&gt;
|-&lt;br /&gt;
| Standardanschlüsse || USB Mini-B; CAN D-Sub9, männlich&lt;br /&gt;
|-&lt;br /&gt;
| Optionen || USB 2×5-Pads, Raster 2,54 mm; CAN sechspolige Federkraftklemme, Raster 5,08 mm&lt;br /&gt;
|-&lt;br /&gt;
| Bestellbezeichnung || CANUSB/OEM122: isoliert / Mini-B / D-Sub9&lt;br /&gt;
|}&lt;br /&gt;
OEM-spezifische Angaben: Datenblatt vom 24.06.2015.&amp;lt;ref name=&amp;quot;oem&amp;quot;&amp;gt;https://elmicro.com/files/elmicro/canusb-oem-iso_spec003.pdf – CANUSB-OEM-ISO Produktspezifikation, 24.06.2015, 2 Seiten.&amp;lt;/ref&amp;gt; Varianten und Lieferbestückung vor Bestellung bestätigen. Die Hersteller-Shopseite nennt 122,90 € netto zuzüglich Versand; das ist ein abgelesenes Angebot, kein verbindlicher aktueller Kaufpreis.&amp;lt;ref name=&amp;quot;shop&amp;quot;&amp;gt;https://elmicro.com/en/canusb-oem-iso.html – OEM-Produkt- und Bestellseite, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! CANUSB-Funktion !! Angabe&lt;br /&gt;
|-&lt;br /&gt;
| Bus || Classical CAN 2.0A/2.0B; 11-/29-Bit-Identifier, RTR; bis 1 Mbit/s&lt;br /&gt;
|-&lt;br /&gt;
| USB || USB 2.0 Full Speed, Versorgung über USB&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Controller || SJA1000, 16 MHz&lt;br /&gt;
|-&lt;br /&gt;
| Empfang || 32 Frames FIFO; optionale Millisekunden-Zeitstempel&lt;br /&gt;
|-&lt;br /&gt;
| Anzeigen || Grün: CAN-Aktivität; Rot: CAN-Fehler&lt;br /&gt;
|-&lt;br /&gt;
| Software || FTDI VCP oder D2XX; LAWICEL API-DLL 32/64 Bit&lt;br /&gt;
|}&lt;br /&gt;
Diese Funktionen stammen vom kompatiblen CANUSB.&amp;lt;ref name=&amp;quot;canusb&amp;quot;&amp;gt;https://www.canusb.com/products/canusb/ – LAWICEL CANUSB, Spezifikationen und Anschlussinformationen.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;CAN FD wird nicht unterstützt.&#039;&#039;&#039; Die Gehäusemaße, Stromaufnahme und Temperaturfreigabe des normalen Dongles sind kein eigenständiger OEM-Nachweis. Ebenso darf 1 Mbit/s nicht als Garantie verlustfreier Aufzeichnung eines voll ausgelasteten Busses verstanden werden.&lt;br /&gt;
&lt;br /&gt;
== Anschlussbelegungen ==&lt;br /&gt;
=== D-Sub9: CAN ===&lt;br /&gt;
Pinzahlen am Steckverbinder verwenden: Lötseite und Steckseite sind spiegelverkehrt. Die folgenden drei Signale sind vom Hersteller ausdrücklich für den Betrieb genannt.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Pin !! Verwendung an dieser Baugruppe&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Für Betrieb nicht verwenden; tatsächliche OEM-Verschaltung nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CAN_L&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CAN_GND, galvanisch getrennte Busseite&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Für Betrieb nicht verwenden; nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Für Betrieb nicht verwenden; Schirmbehandlung nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Für Betrieb nicht verwenden; zusätzliche Masseverbindung nicht separat bestätigt&lt;br /&gt;
|-&lt;br /&gt;
| 7 || CAN_H&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Für Betrieb nicht verwenden; nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Keine externe Versorgung erforderlich; nicht mit Batteriespannung verbinden&lt;br /&gt;
|}&lt;br /&gt;
Ein D-Sub9-Stecker macht das Gerät nicht zu RS232. Insbesondere nicht an einen seriellen PC-Port anschließen.&lt;br /&gt;
&lt;br /&gt;
=== USB-Pads: 2×5 ===&lt;br /&gt;
&#039;&#039;&#039;Orientierung wie in der Maßzeichnung: USB-Pads links, CAN-Pads rechts.&#039;&#039;&#039; Beide Spalten haben dieselbe Zeilenbelegung. Keine erfundene fortlaufende Pin-Nummerierung: Das Datenblatt benennt Signale, keine Pinnummern.&amp;lt;ref name=&amp;quot;oem&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Zeile von oben !! Linkes Pad !! Rechtes Pad&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC (+5 V USB) || VCC (+5 V USB)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || D− || D−&lt;br /&gt;
|-&lt;br /&gt;
| 3 || D+ || D+&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND (USB-Seite) || GND (USB-Seite)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || n.c. || n.c.&lt;br /&gt;
|}&lt;br /&gt;
Nicht blind einen beliebigen Mainboard-USB-Stecker aufsetzen: Position des fehlenden Pins und der freien Leitung am konkreten Kabel prüfen. USB-GND nicht mit CAN_GND brücken, wenn die galvanische Trennung erhalten bleiben soll. Mini-B und Header nicht gleichzeitig an zwei USB-Hosts anschließen.&lt;br /&gt;
&lt;br /&gt;
=== CAN-Pads / optionale Klemme ===&lt;br /&gt;
Die Zeichnung zeigt sechs Signalpositionen mit jeweils zwei horizontalen Lötpads. &#039;&#039;&#039;Von oben nach unten in der Herstellerzeichnung:&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;oem&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Position !! Signal !! Verbindung zum D-Sub&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CAN_H || Pin 7&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CAN_H || Pin 7&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CAN_L || Pin 2&lt;br /&gt;
|-&lt;br /&gt;
| 4 || CAN_L || Pin 2&lt;br /&gt;
|-&lt;br /&gt;
| 5 || CAN_GND || Pin 3&lt;br /&gt;
|-&lt;br /&gt;
| 6 || CAN_GND || Pin 3&lt;br /&gt;
|}&lt;br /&gt;
Signalreihenfolge aus der Zeichnung, D-Sub-Zuordnung aus den CANUSB-Anschlussangaben. Die Nummern 1–6 sind hier Positionshilfen, keine aufgedruckten Hersteller-Pinnummern. Masse auf der Busseite ist nicht USB-Masse.&lt;br /&gt;
&lt;br /&gt;
=== Praktischer Kabelaufbau ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Computer / Board !! Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| USB Mini-B || USB-Host über geeignetes Datenkabel&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 7 / CAN_H-Pad || CAN_H der Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 2 / CAN_L-Pad || CAN_L der Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 3 / CAN_GND-Pad || CAN-Bezugsmasse der Gegenstelle&lt;br /&gt;
|}&lt;br /&gt;
CAN_H/CAN_L als verdrilltes Paar führen. An beiden physikalischen Busenden jeweils 120 Ω zwischen H und L; einen zusätzlichen Abschluss nur setzen, wenn die Platine am Busende sitzt und dort noch kein Abschluss vorhanden ist. Bei ausgeschalteten Geräten ergeben zwei parallele 120-Ω-Abschlüsse rechnerisch etwa 60 Ω. &#039;&#039;&#039;Eine onboard zuschaltbare Terminierung ist in den recherchierten OEM-Unterlagen nicht belegt.&#039;&#039;&#039; Für normales Senden braucht es einen weiteren aktiven CAN-Knoten, der quittiert.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bauteile / Teilstückliste ==&lt;br /&gt;
&#039;&#039;&#039;Keine vollständige Hersteller-BOM gefunden.&#039;&#039;&#039; Die Tabelle ist eine Funktions- und Identifikationsliste, keine belastbare Einkaufsstückliste. Nicht lesbare Werte und Bestückungsreferenzen werden nicht ergänzt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Baugruppe / Bauteil !! Identifikation !! Belegstatus&lt;br /&gt;
|-&lt;br /&gt;
| USB-FIFO || FTDI FT245RL || In CANUSB-Unterlagen genannt; entsprechendes IC im OEM-Foto&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Controller || NXP/Philips SJA1000 || Dokumentiert; NXP-IC im Platinenfoto&lt;br /&gt;
|-&lt;br /&gt;
| Mikrocontroller || Atmel AVR || CANUSB-Handbuch; konkreten OEM-Typ am eigenen Board ablesen&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Transceiver || CANUSB nennt 82C251 || Nicht als verbindliche OEM-BOM behandeln; exakten Aufdruck prüfen&lt;br /&gt;
|-&lt;br /&gt;
| Isolations-Signalbauteile || Typ nicht sicher bestimmt || Im OEM-Foto sichtbar; keine öffentliche Bestückungsliste gefunden&lt;br /&gt;
|-&lt;br /&gt;
| Isolierte Versorgung || DC/DC-Funktionsblock plausibel || Bauteiltyp und Kennwerte nicht verifiziert&lt;br /&gt;
|-&lt;br /&gt;
| Taktbauteile || Quarz / Resonator || Foto; vollständige Frequenz- und Typzuordnung offen&lt;br /&gt;
|-&lt;br /&gt;
| USB-Buchse || Mini-B, SMD || OEM-Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Stecker || D-Sub9 male, SMD mit mechanischen TH-Pads || OEM-Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| Optionale USB-Stiftleiste || 2×5, 2,54 mm || Variante; Standardfoto zeigt freie Pads&lt;br /&gt;
|-&lt;br /&gt;
| Optionale CAN-Klemme || 6-polig, 5,08 mm || Variante; Standardfoto zeigt freie Pads&lt;br /&gt;
|-&lt;br /&gt;
| LEDs / R / C / Schutzbeschaltung || Einzelwerte unbekannt || Keine vollständige BOM gefunden&lt;br /&gt;
|}&lt;br /&gt;
Basis-ICs: CANUSB-Produktseite und Handbuch; Sichtbefunde: Herstellerfoto.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;manual&amp;quot;&amp;gt;https://www.canusb.com/files/canusb_manual.pdf – LAWICEL CANUSB User Manual, Rev. 1.1-en, 12.07.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schaltung und Schaltplan ==&lt;br /&gt;
[[Datei:CANUSB-OEM-ISO_funktionsschema.svg|thumb|800px|Eigenes vereinfachtes Funktionsschema; kein Hersteller-Schaltplan.]]&lt;br /&gt;
&#039;&#039;&#039;Ein vollständiger öffentlich zugänglicher OEM-Schaltplan wurde nicht gefunden.&#039;&#039;&#039; Ebenso fehlen verifizierte Gerberdaten, Netzliste und vollständige BOM. Das Schema zeigt nur die funktionale Architektur. Es ist weder eine Rekonstruktion der tatsächlichen Verdrahtung noch eine Nachbauvorlage. Ein SJA1000-Datenblatt ersetzt keinen OEM-Schaltplan.&lt;br /&gt;
&lt;br /&gt;
== Betrieb unter Windows ==&lt;br /&gt;
# Platine per USB-Datenkabel anschließen; FTDI-Treiber normalerweise automatisch installieren lassen, andernfalls das offizielle FTDI-Paket verwenden.&lt;br /&gt;
# Geräte-Manager: passenden „USB Serial Converter“ anhand Gerätebeschreibung „CANUSB“ identifizieren.&lt;br /&gt;
# Für COM-Port-Zugriff: Eigenschaften → Erweitert → „Load VCP“ aktivieren, USB abziehen und wieder einstecken.&lt;br /&gt;
# Zugewiesenen COM-Port notieren. Terminal mit 8N1, ohne Handshake und mit &#039;&#039;&#039;CR allein&#039;&#039;&#039; als Sendeabschluss öffnen. Laut Hersteller ist die eingestellte virtuelle Baudrate beliebig; sie ist nicht die CAN-Bitrate.&lt;br /&gt;
# Zuerst nur Version mit V abfragen; danach passende CAN-Bitrate setzen und Kanal öffnen.&lt;br /&gt;
Diese VCP-Schritte sind im Hersteller-Testtutorial beschrieben.&amp;lt;ref name=&amp;quot;test&amp;quot;&amp;gt;https://www.canusb.com/support/howto-check-canusb/ – Hersteller-Testanleitung, 02.02.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternative: D2XX und LAWICEL CANUSB-DLL. DLL-Architektur muss zur Anwendung passen: canusbdrv.dll für 32 Bit, canusbdrv64.dll für 64 Bit. Auch eine 32-Bit-Anwendung unter 64-Bit-Windows braucht die 32-Bit-DLL. Hersteller-Supportseite enthält DLL-Paket, Beispiele und CAN Monitor Lite. Alte Geräte vor Februar 2015 können PID FFA8 statt 6001 besitzen und benötigen besondere Behandlung. Derselbe Adapter sollte nicht parallel von Terminal und D2XX-Anwendung geöffnet werden.&amp;lt;ref name=&amp;quot;support&amp;quot;&amp;gt;https://www.canusb.com/support/canusb-support/ – Treiber, DLL, Beispiele, Legacy-Hinweise.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Windows 11 ist hier nicht als separat getestete OEM-Konfiguration nachgewiesen. Den passenden aktuellen FTDI-Treiber und die Anwendungskompatibilität prüfen; alte Windows-Treiber nicht ungeprüft übernehmen.&lt;br /&gt;
&lt;br /&gt;
== ASCII-Befehle ==&lt;br /&gt;
Groß-/Kleinschreibung beachten; jede Zeile endet mit CR (0x0D). Konfiguration bei geschlossenem CAN-Kanal.&amp;lt;ref name=&amp;quot;manual&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Befehl !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| V / N || Version / Seriennummer&lt;br /&gt;
|-&lt;br /&gt;
| S0, S1, S2, S3, S4 || 10, 20, 50, 100, 125 kbit/s&lt;br /&gt;
|-&lt;br /&gt;
| S5, S6, S7, S8 || 250, 500, 800, 1000 kbit/s&lt;br /&gt;
|-&lt;br /&gt;
| sxxyy || SJA1000 BTR0/BTR1 setzen&lt;br /&gt;
|-&lt;br /&gt;
| O / C || Kanal öffnen / schließen&lt;br /&gt;
|-&lt;br /&gt;
| tiiildd… / Tiiiiiiiildd… || 11-/29-Bit-Datenframe; DLC 0–8&lt;br /&gt;
|-&lt;br /&gt;
| riiil / Riiiiiiiil || RTR mit 11-/29-Bit-ID&lt;br /&gt;
|-&lt;br /&gt;
| F || Fehlerstatus&lt;br /&gt;
|-&lt;br /&gt;
| Mxxxxxxxx / mxxxxxxxx || Acceptance-Code / -Maske&lt;br /&gt;
|-&lt;br /&gt;
| Z0 / Z1 || Empfangszeitstempel aus / an&lt;br /&gt;
|}&lt;br /&gt;
Beispiel für einen eigenen Testbus mit 500 kbit/s; jede Zeile einzeln senden und Antwort abwarten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
V&lt;br /&gt;
S6&lt;br /&gt;
O&lt;br /&gt;
F&lt;br /&gt;
C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein Sendetest erst am geeigneten Testbus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
t12320102&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bedeutung: ID 0x123, zwei Datenbytes 01 02. &#039;&#039;&#039;Nicht als BMS-Abfrage oder sonstigen gerätespezifischen Befehl interpretieren.&#039;&#039;&#039; Erfolg bei Datenframes: z beziehungsweise Z plus CR; Fehler: BEL (0x07). Ein angenommenes Sendekommando ist kein Nachweis, dass die Zielanwendung die Daten verstanden hat.&lt;br /&gt;
&lt;br /&gt;
== Betrieb unter Linux ==&lt;br /&gt;
=== Erkennung ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsusb&lt;br /&gt;
sudo modprobe ftdi_sio&lt;br /&gt;
journalctl -k -n 50&lt;br /&gt;
ls -l /dev/serial/by-id/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Typischer Port: /dev/ttyUSB0; bei mehreren Adaptern stabilen by-id-Pfad bevorzugen. Moderne Geräte verwenden FTDI-PID 6001, alte FFA8.&amp;lt;ref name=&amp;quot;support&amp;quot; /&amp;gt; Kein ttyUSB-Port: USB-Datenkabel, Treiberbindung, PID und Zugriffsrechte prüfen. D2XX-Zugriff und ftdi_sio können um das Gerät konkurrieren.&lt;br /&gt;
&lt;br /&gt;
So wurde die Karte bei mir eingebunden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lrwxrwxrwx. 1 root root 13 11. Okt 19:24 usb-LAWICEL_CANUSB_LWZ2QLNW-if00-port0 -&amp;gt; ../../ttyUSB1&lt;br /&gt;
Bus 003 Device 056: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SocketCAN mit slcand ===&lt;br /&gt;
Benötigt can-utils, iproute2 und Kernelmodul slcan. Beispielinstallation je nach Distribution:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Debian / Ubuntu&lt;br /&gt;
sudo apt install can-utils iproute2&lt;br /&gt;
# Fedora&lt;br /&gt;
sudo dnf install can-utils iproute&lt;br /&gt;
# openSUSE: Paketverfügbarkeit im verwendeten Release prüfen&lt;br /&gt;
sudo zypper install can-utils iproute2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vorher andere Programme am seriellen Port schließen. 500-kbit/s-Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo modprobe slcan&lt;br /&gt;
sudo slcand -o -c -f -s6 -S 115200 /dev/ttyUSB0 can0&lt;br /&gt;
sudo ip link set can0 up&lt;br /&gt;
ip -details -statistics link show can0&lt;br /&gt;
candump -tz can0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-s6 setzt CAN auf 500 kbit/s; -S 115200 betrifft den seriellen Port. -c/-o schließen/öffnen den Kanal, -f liest Status. Dies ist die Verwendung des can-utils-Werkzeugs, kein nativer USB-CAN-Netzwerktreiber.&amp;lt;ref name=&amp;quot;slcand&amp;quot;&amp;gt;https://raw.githubusercontent.com/linux-can/can-utils/master/slcand.c – Offizieller can-utils-Quelltext, insbesondere print_usage; abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur am Testbus senden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cansend can0 123#0102&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Für das Beenden: can0 mit ip link herunterfahren und den zu diesem Adapter gehörenden slcand-Prozess gezielt beenden. Keine pauschale Beendigung anderer Adapterprozesse.&lt;br /&gt;
&lt;br /&gt;
=== Python unter Linux und Windows ===&lt;br /&gt;
Alternative ohne slcand; VCP muss erreichbar sein. Beispiel erzeugt &#039;&#039;&#039;keine eigenen Datenframes&#039;&#039;&#039;, arbeitet jedoch im normalen aktiven CAN-Modus und kann ACK/Fehlerverhalten des Busses beeinflussen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python -m venv .venv&lt;br /&gt;
# Linux:&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
# Windows PowerShell stattdessen:&lt;br /&gt;
# .venv\Scripts\Activate.ps1&lt;br /&gt;
python -m pip install python-can pyserial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import can&lt;br /&gt;
&lt;br /&gt;
PORT = &amp;quot;/dev/ttyUSB0&amp;quot;  # Windows: z. B. &amp;quot;COM5&amp;quot;&lt;br /&gt;
with can.Bus(interface=&amp;quot;slcan&amp;quot;, channel=PORT,&lt;br /&gt;
             tty_baudrate=115200, bitrate=500000,&lt;br /&gt;
             listen_only=False) as bus:&lt;br /&gt;
    try:&lt;br /&gt;
        while True:&lt;br /&gt;
            message = bus.recv(timeout=1.0)&lt;br /&gt;
            if message is not None:&lt;br /&gt;
                print(message)&lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
API gemäß python-can-SLCAN-Dokumentation.&amp;lt;ref name=&amp;quot;python&amp;quot;&amp;gt;https://python-can.readthedocs.io/en/stable/interfaces/slcan.html – Offizielle python-can-Dokumentation, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt; Das Beispiel ist dokumentationsbasiert, nicht mit einer realen CANUSB-OEM-ISO getestet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Listen-only nicht voraussetzen:&#039;&#039;&#039; python-can bietet listen_only=True und slcand bietet -l; beide senden dafür L. Dieser Befehl steht nicht im aktuellen CANUSB-Handbuch. Seine Unterstützung durch die konkrete Firmware muss gesondert nachgewiesen werden. Ein lediglich lesendes Programm ist kein garantierter Silent-Sniffer.&lt;br /&gt;
&lt;br /&gt;
== Fehlerdiagnose und Grenzen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Kein COM-Port unter Windows || Load VCP aktivieren; richtigen Converter auswählen; neu verbinden&lt;br /&gt;
|-&lt;br /&gt;
| Kein ttyUSB unter Linux || ftdi_sio, PID, Kabel und konkurrierender D2XX-Zugriff&lt;br /&gt;
|-&lt;br /&gt;
| V antwortet, aber keine CAN-Frames || CAN-Bitrate, H/L, Bezugsmasse, offene/geschlossene Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
| Rote LED / Busfehler || Terminierung, Verkabelung, aktiver quittierender Gegenknoten&lt;br /&gt;
|-&lt;br /&gt;
| Verluste bei hoher Last || FIFO/USB/ASCII-Durchsatz; Hardwarefilter und Buslast prüfen&lt;br /&gt;
|-&lt;br /&gt;
| 29-Bit-Nachrichten fehlen im Monitor || Fähigkeiten der Software prüfen; Hardware unterstützt 29-Bit-IDs&lt;br /&gt;
|}&lt;br /&gt;
Keine mitgelieferten höheren Protokolle wie CANopen/J1939/BMS-Decodierung; dafür zusätzliche Software und Protokollwissen erforderlich.&amp;lt;ref name=&amp;quot;support&amp;quot; /&amp;gt; Batterie-RJ45-Belegungen sind herstellerspezifisch und nicht aus dieser D-Sub-Belegung ableitbar.&lt;br /&gt;
&lt;br /&gt;
== Quellen und offene Punkte ==&lt;br /&gt;
Die Recherche begann bei der angegebenen canusb.com-Produktseite und umfasste ELMICRO-Datenblatt, aktuelle CANUSB-Unterlagen, Supportseite und Software-Primärquellen. Gefunden: Herstellerfoto, Datenblattfoto, mechanische Padzeichnung und Treiber-/Protokollunterlagen. Nicht gefunden: separate Rückseitenaufnahme, vollständiger OEM-Schaltplan, vollständige BOM oder eine belastbare OEM-spezifische Dokumentation zusätzlicher Test-/Programmierpads. Bestückung und Firmware können revisionsabhängig sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=MCP2515=&lt;br /&gt;
&lt;br /&gt;
Modul TODO&lt;br /&gt;
&lt;br /&gt;
=MCP2515 vs SJA10001=&lt;br /&gt;
&lt;br /&gt;
Wenn man den &#039;&#039;&#039;MCP2515&#039;&#039;&#039; einsetzen und mit einer klassischen industriellen Kombination wie dem &#039;&#039;&#039;SJA1000&#039;&#039;&#039; (CAN-Controller) und einem &#039;&#039;&#039;ISO1050&#039;&#039;&#039; (galvanisch isolierter CAN-Transceiver) vergleicht, muss man wesentliche Unterschiede in der Architektur, Leistungsfaehigkeit und Physik beachten. \[1, 2\]&lt;br /&gt;
&lt;br /&gt;
==Architektur und Performance (MCP2515 vs. SJA1000)==&lt;br /&gt;
&lt;br /&gt;
Der SJA1000 von NXP gilt als der &amp;quot;Panzer&amp;quot; unter den klassischen CAN-Controllern, waehrend der MCP2515 von Microchip ein kompakter Standalone-Controller fuer kleinere eingebettete Systeme ist. \[2, 3\]&lt;br /&gt;
&lt;br /&gt;
| Kriterium | MCP2515 | SJA1000 |&lt;br /&gt;
| :---- | :---- | :---- |&lt;br /&gt;
| &#039;&#039;&#039;Schnittstelle zum Host&#039;&#039;&#039; | &#039;&#039;&#039;SPI&#039;&#039;&#039; (seriell, max. 10 MHz) | &#039;&#039;&#039;Paraller Bus&#039;&#039;&#039; (8-Bit, direkt im Speicher-Interface) |&lt;br /&gt;
| &#039;&#039;&#039;Empfangspuffer (RX)&#039;&#039;&#039; | &#039;&#039;&#039;Sehr klein:&#039;&#039;&#039; Nur 2 Message Buffer | &#039;&#039;&#039;Groesser:&#039;&#039;&#039; 64-Byte FIFO-Puffer (PeliCAN-Modus) |&lt;br /&gt;
| &#039;&#039;&#039;Gefahr von Frame-Loss&#039;&#039;&#039; | &#039;&#039;&#039;Hoch&#039;&#039;&#039; bei hoher Buslast (Buffer Overflow) | &#039;&#039;&#039;Sehr gering&#039;&#039;&#039; durch echten Hardware-FIFO |&lt;br /&gt;
&lt;br /&gt;
&amp;gt; *   &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Das Puffer-Problem (Rx-Overflow):&#039;&#039;&#039; Da der MCP2515 nur zwei Empfangspuffer besitzt, muessen Sie eingehende Nachrichten extrem schnell via SPI auslesen. Bei einer Busgeschwindigkeit von 500 kbit/s oder 1 Mbit/s und hoher Buslast (\&amp;gt; 40–50 %) kommt es bei SPI-Controllern schnell zu einem &#039;&#039;&#039;Rx-Overflow&#039;&#039;&#039;, bei dem ungelesene CAN-Nachrichten einfach verworfen werden. Der SJA1000 faengt solche Bursts durch seinen 64-Byte-FIFO problemlos ab. \[2, 4\]  &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Interrupt-Handling:&#039;&#039;&#039; Beim MCP2515 muessen Sie zwingend mit dem Hardware-Interrupt-Pin (INT) arbeiten. Reines Polling ueber SPI ist bei schnellen Bussen zu langsam und fuehrt unweigerlich zu Datenverlust. \[5, 6\]  &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Hardware-Filter nutzen:&#039;&#039;&#039; Da der Host-Prozessor beim MCP2515 durch das langsame SPI-Protokoll gebremst wird, sollten Sie die integrierten &#039;&#039;&#039;6 Acceptance Filter und 2 Masken&#039;&#039;&#039; des MCP2515 penibel konfigurieren. Lassen Sie den MCP2515 nur die Nachrichten per Interrupt an den PC/Mikrocontroller weitergeben, die Sie wirklich auswerten wollen. \[2, 4\]  &lt;br /&gt;
&amp;gt; * &lt;br /&gt;
&lt;br /&gt;
==Transceiver und galvanische Trennung (Die Rolle des ISO1050)==&lt;br /&gt;
&lt;br /&gt;
Typische billige MCP2515-Fertigmodule (z. B. fuer Arduino oder Raspberry Pi) nutzen als Transceiver den &#039;&#039;&#039;TJA1050&#039;&#039;&#039; oder &#039;&#039;&#039;MCP2551&#039;&#039;&#039;. Wenn Sie dies mit einem &#039;&#039;&#039;ISO1050&#039;&#039;&#039; vergleichen, ergeben sich massive Sicherheits- und Layout-Unterschiede: \[7, 8\]&lt;br /&gt;
&lt;br /&gt;
&amp;gt; *   &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Fehlende Isolation beim Standard-MCP2515-Modul:&#039;&#039;&#039; Der ISO1050 ist ein *galvanisch isolierter* Transceiver (bis zu 5000 V), der die empfindliche Elektronik (PC/Raspberry Pi) vor Spannungsspitzen auf dem CAN-Bus (z.B. im Auto oder in der Industrie) schuetzt. Standard-MCP2515-Boards mit dem TJA1050 besitzen &#039;&#039;&#039;keine galvanische Trennung&#039;&#039;&#039;. Schliesst man diese direkt an ein Fahrzeug-Bordnetz an, kann eine Masseschleife oder Ueberspannung den gesamten PC zerstoeren. \[7\]  &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Spannungsversorgung (3.3V vs. 5V):&#039;&#039;&#039; Der ISO1050 besitzt getrennte Spannungsversorgungen fuer die Logikseite (VCC1: 3V bis 5.5V) und die Busseite (VCC2: 4.75V bis 5.25V). Guenstige MCP2515+TJA1050-Module laufen oft &#039;&#039;&#039;strikt mit 5V&#039;&#039;&#039;. Wenn Sie ein solches Modul an ein 3.3V-Geraet (wie den Raspberry Pi oder ESP32) anschliessen, benoetigen Sie Pegelwandler (Level Shifter) auf den SPI-Leitungen (vor allem auf der MISO-Leitung), um das Board nicht zu beschaedigen. \[7\]  &lt;br /&gt;
&amp;gt; * &lt;br /&gt;
&lt;br /&gt;
==Zusammenfassende Empfehlungen fuer die Praxis==&lt;br /&gt;
&lt;br /&gt;
&amp;gt; 1. &#039;&#039;&#039;Fuer Industrie &amp;amp; Automotive:&#039;&#039;&#039; Wenn Sie den MCP2515 in rauen Umgebungen einsetzen wollen, nutzen Sie &#039;&#039;&#039;kein&#039;&#039;&#039; billiges 2-Euro-Modul. Setzen Sie stattdessen auf Boards mit integrierter galvanischer Trennung (z. B. mit einem ISO1050 oder ADM3053 Transceiver) und integrierten TVS-Schutzdioden.  &lt;br /&gt;
&amp;gt; 2. &#039;&#039;&#039;SPI-Takt maximieren:&#039;&#039;&#039; Nutzen Sie einen moeglichst hohen SPI-Takt (der MCP2515 vertraegt bis zu 10 MHz), um die Puffer so schnell wie moeglich zu leeren. Achten Sie dabei auf kurze, gut geschirmte SPI-Leitungen.  &lt;br /&gt;
&amp;gt; 3. &#039;&#039;&#039;Taktquarz beachten:&#039;&#039;&#039; Achten Sie in der Software-Konfiguration (Bit-Timing) penibel darauf, ob auf Ihrem MCP2515-Board ein &#039;&#039;&#039;8-MHz- oder ein 16-MHz-Quarz&#039;&#039;&#039; verbaut ist. Eine falsche Angabe fuehrt dazu, dass die CAN-Baudrate halbiert oder verdoppelt wird und die Kommunikation komplett fehlschlaegt. \[2, 6, 7\]&lt;br /&gt;
&lt;br /&gt;
\[1\] [https\://adaptivesupport.amd.com](https://adaptivesupport.amd.com/s/question/0D52E00006iHjy4SAC/can-bus-implement-in-spartan-kit?language=zh_CN)  &lt;br /&gt;
\[2\] [https\://www\.flywing-tech.com](https://www.flywing-tech.com/blog/mcp2515-can-bus-overview-performance-and-alternatives/)  &lt;br /&gt;
\[3\] [https\://www\.mikrocontroller.net](https://www.mikrocontroller.net/topic/226261)  &lt;br /&gt;
\[4\] [https\://www\.flywing-tech.com](https://www.flywing-tech.com/blog/mcp2515-can-bus-overview-performance-and-alternatives/)  &lt;br /&gt;
\[5\] [https\://forum.arduino.cc](https://forum.arduino.cc/t/mcp2515-using-coryjfowler-library-on-esp32/1342270?page=2)  &lt;br /&gt;
\[6\] [https\://www\.kreatives-chaos.com](http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515)  &lt;br /&gt;
\[7\] [https\://microcontrollerslab.com](https://microcontrollerslab.com/best-can-bus-modules-mcp2515-buying-guide/)  &lt;br /&gt;
\[8\] [https\://www\.ebay.de](https://www.ebay.de/itm/314870492130)&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(CAN)_CAN-Bus_%26_Co&amp;diff=5505</id>
		<title>(CAN) CAN-Bus &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(CAN)_CAN-Bus_%26_Co&amp;diff=5505"/>
		<updated>2026-10-11T17:36:49Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* CANUSB-OEM-ISO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Hin und wieder begegnet mir der CAN-Bus auch außerhalb des Einsatzortes KFZ (z.B. [[(CAN) USB2CAN]]). Um nicht jedes mal recht mühsam die Infos zum weiteren Verständnis aus Büchern (ja, sowas gibt&#039;s auch noch;-)) und dem Internet zusammensuchen zu müssen, habe ich hier mal angefangen die für mich notwendigen Informationen zusammenzustellen.&lt;br /&gt;
&lt;br /&gt;
=Feldbusse=&lt;br /&gt;
&lt;br /&gt;
CAN (Controller Area Network) gehoert mit dem &lt;br /&gt;
* LIN-Bus&lt;br /&gt;
* FlexRay&lt;br /&gt;
* MOST&lt;br /&gt;
* Byteflight und&lt;br /&gt;
* Intellibus&lt;br /&gt;
zu den Fledbus-Systemen, die im Bereich Automotive die groeszte Verbreitung finden.&lt;br /&gt;
&lt;br /&gt;
Die Pseudodefinition aus [https://de.wikipedia.org/wiki/Feldbus Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 Ein Feldbus ist ein Bussystem, das in einer Anlage Feldgeräte wie Messfühler (Sensoren) und Stellglieder (Aktoren) zur Kommunikation mit einem Automatisierungsgerät verbindet.&lt;br /&gt;
&lt;br /&gt;
finde ich in sofern widerspruechlich, als auch zu eng gefasst, da weiter unten im Artikel die o. g. Bussysteme aufgelistet werden, aber ein Auto als Feldgeraet einzuordnen braucht doch ein wenig Fantasie.&lt;br /&gt;
&lt;br /&gt;
=Historie=&lt;br /&gt;
&lt;br /&gt;
Im Schnelldurchlauf:&lt;br /&gt;
&lt;br /&gt;
Das CAN ist ein serielles Bus-System. &lt;br /&gt;
&lt;br /&gt;
Entwickelt wurde es von der Robert-Bosch GmbH ab 1983.&lt;br /&gt;
&lt;br /&gt;
Das CAN-Protokoll ist durch Patente geschuetzt.&lt;br /&gt;
&lt;br /&gt;
Specification 2.0 wurde 1991 veroeffentlicht.&lt;br /&gt;
&lt;br /&gt;
CAN ist eine reine DataLinkLayer (Sicherungsschicht) Implementation.&lt;br /&gt;
&lt;br /&gt;
ISO 11898 wurde 1993 veroeffentlicht (Road vehicles - Interchange of digital information - Controller area network (CAN) for high speed communication.&lt;br /&gt;
&lt;br /&gt;
CANopen Protokoll von CiA (CANinAutomation) 1995 veroeffentlicht.&lt;br /&gt;
&lt;br /&gt;
CiA spezifiziert CAL (CAN Applikation Layer)&lt;br /&gt;
&lt;br /&gt;
2000 Entwicklung von TTCAN (Time-triggered communication)&lt;br /&gt;
&lt;br /&gt;
=Eigenschaften=&lt;br /&gt;
&lt;br /&gt;
* Busstruktur (Topologie) mit einem TrunkCable&lt;br /&gt;
* Zweileitungssystem (verdrillt)&lt;br /&gt;
* Busterminierung an jedem Ende des TrunkCables mit einem 120 Ohm Widerstand&lt;br /&gt;
* Anschluss der Teilnehmer mit einem DropCable&lt;br /&gt;
* Bis zu 1 Mbps, dann aber max TrunkCable-Laenge 40 m&lt;br /&gt;
* Bis zu 8 Bytes können mit einer Nachricht (Frames) uebertragen werden.&lt;br /&gt;
* Multi-Master Zugriff&lt;br /&gt;
* Bus Arbitration (Streit-Schlichter) bei gleichzeitigem Zugriff mehrerer Sender&lt;br /&gt;
* Broadcast Nachrichten&lt;br /&gt;
* Keine Teilnehmer-Adressen (relevante Nachrichten werden gefiltert)&lt;br /&gt;
* Nachrichten Anforderung moeglich&lt;br /&gt;
* Error Detection und Signaling durch spezielle Frames.&lt;br /&gt;
* Automatische Wiederholung der Nachricht bei einem Fehler.&lt;br /&gt;
* Automatische Deaktivierung von Teilnehmern (nodes) bei dauerhaften Fehlern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Controllerboard CANUSB-OEM-ISO INTERFACE ADAPTER TYP 122=&lt;br /&gt;
&lt;br /&gt;
= CANUSB-OEM-ISO =&lt;br /&gt;
&#039;&#039;&#039;Recherchestand: 11. Oktober 2026.&#039;&#039;&#039; Die CANUSB-OEM-ISO ist die galvanisch getrennte Einbauplatine des LAWICEL CANUSB. Hersteller/Fertigung: ELMICRO Computer. Treiber, ASCII-Protokoll und API sind mit CANUSB kompatibel.&amp;lt;ref name=&amp;quot;produkt&amp;quot;&amp;gt;https://www.canusb.com/products/canusb-oem-iso/ – Hersteller-Produktseite, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schnellanschluss:&#039;&#039;&#039; &lt;br /&gt;
*USB an den Computer&lt;br /&gt;
*CAN_H an D-Sub-Pin 7, CAN_L an Pin 2, CAN_GND an Pin 3. &lt;br /&gt;
*Keine externe Versorgung am CAN-Stecker einspeisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Platinenbilder ==&lt;br /&gt;
[[Datei:CANUSB-OEM_ISO_platine.jpg|thumb|600px|Paltinenfoto der Standardbestückung mit Mini-B und D-Sub9]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eckdaten und Varianten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! Angabe / Einordnung&lt;br /&gt;
|-&lt;br /&gt;
| Bauform || Offene FR4-Einbauplatine; kein Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| Isolation || Bauteile mindestens 1 kV; Kriechstrecke mindestens 3 mm&lt;br /&gt;
|-&lt;br /&gt;
| Bedeutung der Isolation || Kurzzeitige Bauteilprüfspannung, keine zulässige dauernde Betriebsspannung; Datenblatt sieht Versorgungsspannungen über 42 V DC nicht vor&lt;br /&gt;
|-&lt;br /&gt;
| Platinenmaß || 66,04 × 45,72 mm&lt;br /&gt;
|-&lt;br /&gt;
| Befestigung || Vier Bohrungen Ø 3,20 mm; Lochabstände 58,42 × 38,10 mm&lt;br /&gt;
|-&lt;br /&gt;
| Standardanschlüsse || USB Mini-B; CAN D-Sub9, männlich&lt;br /&gt;
|-&lt;br /&gt;
| Optionen || USB 2×5-Pads, Raster 2,54 mm; CAN sechspolige Federkraftklemme, Raster 5,08 mm&lt;br /&gt;
|-&lt;br /&gt;
| Bestellbezeichnung || CANUSB/OEM122: isoliert / Mini-B / D-Sub9&lt;br /&gt;
|}&lt;br /&gt;
OEM-spezifische Angaben: Datenblatt vom 24.06.2015.&amp;lt;ref name=&amp;quot;oem&amp;quot;&amp;gt;https://elmicro.com/files/elmicro/canusb-oem-iso_spec003.pdf – CANUSB-OEM-ISO Produktspezifikation, 24.06.2015, 2 Seiten.&amp;lt;/ref&amp;gt; Varianten und Lieferbestückung vor Bestellung bestätigen. Die Hersteller-Shopseite nennt 122,90 € netto zuzüglich Versand; das ist ein abgelesenes Angebot, kein verbindlicher aktueller Kaufpreis.&amp;lt;ref name=&amp;quot;shop&amp;quot;&amp;gt;https://elmicro.com/en/canusb-oem-iso.html – OEM-Produkt- und Bestellseite, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! CANUSB-Funktion !! Angabe&lt;br /&gt;
|-&lt;br /&gt;
| Bus || Classical CAN 2.0A/2.0B; 11-/29-Bit-Identifier, RTR; bis 1 Mbit/s&lt;br /&gt;
|-&lt;br /&gt;
| USB || USB 2.0 Full Speed, Versorgung über USB&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Controller || SJA1000, 16 MHz&lt;br /&gt;
|-&lt;br /&gt;
| Empfang || 32 Frames FIFO; optionale Millisekunden-Zeitstempel&lt;br /&gt;
|-&lt;br /&gt;
| Anzeigen || Grün: CAN-Aktivität; Rot: CAN-Fehler&lt;br /&gt;
|-&lt;br /&gt;
| Software || FTDI VCP oder D2XX; LAWICEL API-DLL 32/64 Bit&lt;br /&gt;
|}&lt;br /&gt;
Diese Funktionen stammen vom kompatiblen CANUSB.&amp;lt;ref name=&amp;quot;canusb&amp;quot;&amp;gt;https://www.canusb.com/products/canusb/ – LAWICEL CANUSB, Spezifikationen und Anschlussinformationen.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;CAN FD wird nicht unterstützt.&#039;&#039;&#039; Die Gehäusemaße, Stromaufnahme und Temperaturfreigabe des normalen Dongles sind kein eigenständiger OEM-Nachweis. Ebenso darf 1 Mbit/s nicht als Garantie verlustfreier Aufzeichnung eines voll ausgelasteten Busses verstanden werden.&lt;br /&gt;
&lt;br /&gt;
== Anschlussbelegungen ==&lt;br /&gt;
=== D-Sub9: CAN ===&lt;br /&gt;
Pinzahlen am Steckverbinder verwenden: Lötseite und Steckseite sind spiegelverkehrt. Die folgenden drei Signale sind vom Hersteller ausdrücklich für den Betrieb genannt.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Pin !! Verwendung an dieser Baugruppe&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Für Betrieb nicht verwenden; tatsächliche OEM-Verschaltung nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CAN_L&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CAN_GND, galvanisch getrennte Busseite&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Für Betrieb nicht verwenden; nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Für Betrieb nicht verwenden; Schirmbehandlung nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Für Betrieb nicht verwenden; zusätzliche Masseverbindung nicht separat bestätigt&lt;br /&gt;
|-&lt;br /&gt;
| 7 || CAN_H&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Für Betrieb nicht verwenden; nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Keine externe Versorgung erforderlich; nicht mit Batteriespannung verbinden&lt;br /&gt;
|}&lt;br /&gt;
Ein D-Sub9-Stecker macht das Gerät nicht zu RS232. Insbesondere nicht an einen seriellen PC-Port anschließen.&lt;br /&gt;
&lt;br /&gt;
=== USB-Pads: 2×5 ===&lt;br /&gt;
&#039;&#039;&#039;Orientierung wie in der Maßzeichnung: USB-Pads links, CAN-Pads rechts.&#039;&#039;&#039; Beide Spalten haben dieselbe Zeilenbelegung. Keine erfundene fortlaufende Pin-Nummerierung: Das Datenblatt benennt Signale, keine Pinnummern.&amp;lt;ref name=&amp;quot;oem&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Zeile von oben !! Linkes Pad !! Rechtes Pad&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC (+5 V USB) || VCC (+5 V USB)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || D− || D−&lt;br /&gt;
|-&lt;br /&gt;
| 3 || D+ || D+&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND (USB-Seite) || GND (USB-Seite)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || n.c. || n.c.&lt;br /&gt;
|}&lt;br /&gt;
Nicht blind einen beliebigen Mainboard-USB-Stecker aufsetzen: Position des fehlenden Pins und der freien Leitung am konkreten Kabel prüfen. USB-GND nicht mit CAN_GND brücken, wenn die galvanische Trennung erhalten bleiben soll. Mini-B und Header nicht gleichzeitig an zwei USB-Hosts anschließen.&lt;br /&gt;
&lt;br /&gt;
=== CAN-Pads / optionale Klemme ===&lt;br /&gt;
Die Zeichnung zeigt sechs Signalpositionen mit jeweils zwei horizontalen Lötpads. &#039;&#039;&#039;Von oben nach unten in der Herstellerzeichnung:&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;oem&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Position !! Signal !! Verbindung zum D-Sub&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CAN_H || Pin 7&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CAN_H || Pin 7&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CAN_L || Pin 2&lt;br /&gt;
|-&lt;br /&gt;
| 4 || CAN_L || Pin 2&lt;br /&gt;
|-&lt;br /&gt;
| 5 || CAN_GND || Pin 3&lt;br /&gt;
|-&lt;br /&gt;
| 6 || CAN_GND || Pin 3&lt;br /&gt;
|}&lt;br /&gt;
Signalreihenfolge aus der Zeichnung, D-Sub-Zuordnung aus den CANUSB-Anschlussangaben. Die Nummern 1–6 sind hier Positionshilfen, keine aufgedruckten Hersteller-Pinnummern. Masse auf der Busseite ist nicht USB-Masse.&lt;br /&gt;
&lt;br /&gt;
=== Praktischer Kabelaufbau ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Computer / Board !! Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| USB Mini-B || USB-Host über geeignetes Datenkabel&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 7 / CAN_H-Pad || CAN_H der Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 2 / CAN_L-Pad || CAN_L der Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 3 / CAN_GND-Pad || CAN-Bezugsmasse der Gegenstelle&lt;br /&gt;
|}&lt;br /&gt;
CAN_H/CAN_L als verdrilltes Paar führen. An beiden physikalischen Busenden jeweils 120 Ω zwischen H und L; einen zusätzlichen Abschluss nur setzen, wenn die Platine am Busende sitzt und dort noch kein Abschluss vorhanden ist. Bei ausgeschalteten Geräten ergeben zwei parallele 120-Ω-Abschlüsse rechnerisch etwa 60 Ω. &#039;&#039;&#039;Eine onboard zuschaltbare Terminierung ist in den recherchierten OEM-Unterlagen nicht belegt.&#039;&#039;&#039; Für normales Senden braucht es einen weiteren aktiven CAN-Knoten, der quittiert.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bauteile / Teilstückliste ==&lt;br /&gt;
&#039;&#039;&#039;Keine vollständige Hersteller-BOM gefunden.&#039;&#039;&#039; Die Tabelle ist eine Funktions- und Identifikationsliste, keine belastbare Einkaufsstückliste. Nicht lesbare Werte und Bestückungsreferenzen werden nicht ergänzt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Baugruppe / Bauteil !! Identifikation !! Belegstatus&lt;br /&gt;
|-&lt;br /&gt;
| USB-FIFO || FTDI FT245RL || In CANUSB-Unterlagen genannt; entsprechendes IC im OEM-Foto&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Controller || NXP/Philips SJA1000 || Dokumentiert; NXP-IC im Platinenfoto&lt;br /&gt;
|-&lt;br /&gt;
| Mikrocontroller || Atmel AVR || CANUSB-Handbuch; konkreten OEM-Typ am eigenen Board ablesen&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Transceiver || CANUSB nennt 82C251 || Nicht als verbindliche OEM-BOM behandeln; exakten Aufdruck prüfen&lt;br /&gt;
|-&lt;br /&gt;
| Isolations-Signalbauteile || Typ nicht sicher bestimmt || Im OEM-Foto sichtbar; keine öffentliche Bestückungsliste gefunden&lt;br /&gt;
|-&lt;br /&gt;
| Isolierte Versorgung || DC/DC-Funktionsblock plausibel || Bauteiltyp und Kennwerte nicht verifiziert&lt;br /&gt;
|-&lt;br /&gt;
| Taktbauteile || Quarz / Resonator || Foto; vollständige Frequenz- und Typzuordnung offen&lt;br /&gt;
|-&lt;br /&gt;
| USB-Buchse || Mini-B, SMD || OEM-Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Stecker || D-Sub9 male, SMD mit mechanischen TH-Pads || OEM-Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| Optionale USB-Stiftleiste || 2×5, 2,54 mm || Variante; Standardfoto zeigt freie Pads&lt;br /&gt;
|-&lt;br /&gt;
| Optionale CAN-Klemme || 6-polig, 5,08 mm || Variante; Standardfoto zeigt freie Pads&lt;br /&gt;
|-&lt;br /&gt;
| LEDs / R / C / Schutzbeschaltung || Einzelwerte unbekannt || Keine vollständige BOM gefunden&lt;br /&gt;
|}&lt;br /&gt;
Basis-ICs: CANUSB-Produktseite und Handbuch; Sichtbefunde: Herstellerfoto.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;manual&amp;quot;&amp;gt;https://www.canusb.com/files/canusb_manual.pdf – LAWICEL CANUSB User Manual, Rev. 1.1-en, 12.07.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schaltung und Schaltplan ==&lt;br /&gt;
[[Datei:CANUSB-OEM-ISO_funktionsschema.svg|thumb|800px|Eigenes vereinfachtes Funktionsschema; kein Hersteller-Schaltplan.]]&lt;br /&gt;
&#039;&#039;&#039;Ein vollständiger öffentlich zugänglicher OEM-Schaltplan wurde nicht gefunden.&#039;&#039;&#039; Ebenso fehlen verifizierte Gerberdaten, Netzliste und vollständige BOM. Das Schema zeigt nur die funktionale Architektur. Es ist weder eine Rekonstruktion der tatsächlichen Verdrahtung noch eine Nachbauvorlage. Ein SJA1000-Datenblatt ersetzt keinen OEM-Schaltplan.&lt;br /&gt;
&lt;br /&gt;
== Betrieb unter Windows ==&lt;br /&gt;
# Platine per USB-Datenkabel anschließen; FTDI-Treiber normalerweise automatisch installieren lassen, andernfalls das offizielle FTDI-Paket verwenden.&lt;br /&gt;
# Geräte-Manager: passenden „USB Serial Converter“ anhand Gerätebeschreibung „CANUSB“ identifizieren.&lt;br /&gt;
# Für COM-Port-Zugriff: Eigenschaften → Erweitert → „Load VCP“ aktivieren, USB abziehen und wieder einstecken.&lt;br /&gt;
# Zugewiesenen COM-Port notieren. Terminal mit 8N1, ohne Handshake und mit &#039;&#039;&#039;CR allein&#039;&#039;&#039; als Sendeabschluss öffnen. Laut Hersteller ist die eingestellte virtuelle Baudrate beliebig; sie ist nicht die CAN-Bitrate.&lt;br /&gt;
# Zuerst nur Version mit V abfragen; danach passende CAN-Bitrate setzen und Kanal öffnen.&lt;br /&gt;
Diese VCP-Schritte sind im Hersteller-Testtutorial beschrieben.&amp;lt;ref name=&amp;quot;test&amp;quot;&amp;gt;https://www.canusb.com/support/howto-check-canusb/ – Hersteller-Testanleitung, 02.02.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternative: D2XX und LAWICEL CANUSB-DLL. DLL-Architektur muss zur Anwendung passen: canusbdrv.dll für 32 Bit, canusbdrv64.dll für 64 Bit. Auch eine 32-Bit-Anwendung unter 64-Bit-Windows braucht die 32-Bit-DLL. Hersteller-Supportseite enthält DLL-Paket, Beispiele und CAN Monitor Lite. Alte Geräte vor Februar 2015 können PID FFA8 statt 6001 besitzen und benötigen besondere Behandlung. Derselbe Adapter sollte nicht parallel von Terminal und D2XX-Anwendung geöffnet werden.&amp;lt;ref name=&amp;quot;support&amp;quot;&amp;gt;https://www.canusb.com/support/canusb-support/ – Treiber, DLL, Beispiele, Legacy-Hinweise.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Windows 11 ist hier nicht als separat getestete OEM-Konfiguration nachgewiesen. Den passenden aktuellen FTDI-Treiber und die Anwendungskompatibilität prüfen; alte Windows-Treiber nicht ungeprüft übernehmen.&lt;br /&gt;
&lt;br /&gt;
== ASCII-Befehle ==&lt;br /&gt;
Groß-/Kleinschreibung beachten; jede Zeile endet mit CR (0x0D). Konfiguration bei geschlossenem CAN-Kanal.&amp;lt;ref name=&amp;quot;manual&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Befehl !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| V / N || Version / Seriennummer&lt;br /&gt;
|-&lt;br /&gt;
| S0, S1, S2, S3, S4 || 10, 20, 50, 100, 125 kbit/s&lt;br /&gt;
|-&lt;br /&gt;
| S5, S6, S7, S8 || 250, 500, 800, 1000 kbit/s&lt;br /&gt;
|-&lt;br /&gt;
| sxxyy || SJA1000 BTR0/BTR1 setzen&lt;br /&gt;
|-&lt;br /&gt;
| O / C || Kanal öffnen / schließen&lt;br /&gt;
|-&lt;br /&gt;
| tiiildd… / Tiiiiiiiildd… || 11-/29-Bit-Datenframe; DLC 0–8&lt;br /&gt;
|-&lt;br /&gt;
| riiil / Riiiiiiiil || RTR mit 11-/29-Bit-ID&lt;br /&gt;
|-&lt;br /&gt;
| F || Fehlerstatus&lt;br /&gt;
|-&lt;br /&gt;
| Mxxxxxxxx / mxxxxxxxx || Acceptance-Code / -Maske&lt;br /&gt;
|-&lt;br /&gt;
| Z0 / Z1 || Empfangszeitstempel aus / an&lt;br /&gt;
|}&lt;br /&gt;
Beispiel für einen eigenen Testbus mit 500 kbit/s; jede Zeile einzeln senden und Antwort abwarten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
V&lt;br /&gt;
S6&lt;br /&gt;
O&lt;br /&gt;
F&lt;br /&gt;
C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein Sendetest erst am geeigneten Testbus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
t12320102&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bedeutung: ID 0x123, zwei Datenbytes 01 02. &#039;&#039;&#039;Nicht als BMS-Abfrage oder sonstigen gerätespezifischen Befehl interpretieren.&#039;&#039;&#039; Erfolg bei Datenframes: z beziehungsweise Z plus CR; Fehler: BEL (0x07). Ein angenommenes Sendekommando ist kein Nachweis, dass die Zielanwendung die Daten verstanden hat.&lt;br /&gt;
&lt;br /&gt;
== Betrieb unter Linux ==&lt;br /&gt;
=== Erkennung ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsusb&lt;br /&gt;
sudo modprobe ftdi_sio&lt;br /&gt;
journalctl -k -n 50&lt;br /&gt;
ls -l /dev/serial/by-id/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Typischer Port: /dev/ttyUSB0; bei mehreren Adaptern stabilen by-id-Pfad bevorzugen. Moderne Geräte verwenden FTDI-PID 6001, alte FFA8.&amp;lt;ref name=&amp;quot;support&amp;quot; /&amp;gt; Kein ttyUSB-Port: USB-Datenkabel, Treiberbindung, PID und Zugriffsrechte prüfen. D2XX-Zugriff und ftdi_sio können um das Gerät konkurrieren.&lt;br /&gt;
&lt;br /&gt;
So wurde die Karte bei mir eingebunden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lrwxrwxrwx. 1 root root 13 11. Okt 19:24 usb-LAWICEL_CANUSB_LWZ2QLNW-if00-port0 -&amp;gt; ../../ttyUSB1&lt;br /&gt;
Bus 003 Device 056: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SocketCAN mit slcand ===&lt;br /&gt;
Benötigt can-utils, iproute2 und Kernelmodul slcan. Beispielinstallation je nach Distribution:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Debian / Ubuntu&lt;br /&gt;
sudo apt install can-utils iproute2&lt;br /&gt;
# Fedora&lt;br /&gt;
sudo dnf install can-utils iproute&lt;br /&gt;
# openSUSE: Paketverfügbarkeit im verwendeten Release prüfen&lt;br /&gt;
sudo zypper install can-utils iproute2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vorher andere Programme am seriellen Port schließen. 500-kbit/s-Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo modprobe slcan&lt;br /&gt;
sudo slcand -o -c -f -s6 -S 115200 /dev/ttyUSB0 can0&lt;br /&gt;
sudo ip link set can0 up&lt;br /&gt;
ip -details -statistics link show can0&lt;br /&gt;
candump -tz can0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-s6 setzt CAN auf 500 kbit/s; -S 115200 betrifft den seriellen Port. -c/-o schließen/öffnen den Kanal, -f liest Status. Dies ist die Verwendung des can-utils-Werkzeugs, kein nativer USB-CAN-Netzwerktreiber.&amp;lt;ref name=&amp;quot;slcand&amp;quot;&amp;gt;https://raw.githubusercontent.com/linux-can/can-utils/master/slcand.c – Offizieller can-utils-Quelltext, insbesondere print_usage; abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur am Testbus senden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cansend can0 123#0102&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Für das Beenden: can0 mit ip link herunterfahren und den zu diesem Adapter gehörenden slcand-Prozess gezielt beenden. Keine pauschale Beendigung anderer Adapterprozesse.&lt;br /&gt;
&lt;br /&gt;
=== Python unter Linux und Windows ===&lt;br /&gt;
Alternative ohne slcand; VCP muss erreichbar sein. Beispiel erzeugt &#039;&#039;&#039;keine eigenen Datenframes&#039;&#039;&#039;, arbeitet jedoch im normalen aktiven CAN-Modus und kann ACK/Fehlerverhalten des Busses beeinflussen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python -m venv .venv&lt;br /&gt;
# Linux:&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
# Windows PowerShell stattdessen:&lt;br /&gt;
# .venv\Scripts\Activate.ps1&lt;br /&gt;
python -m pip install python-can pyserial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import can&lt;br /&gt;
&lt;br /&gt;
PORT = &amp;quot;/dev/ttyUSB0&amp;quot;  # Windows: z. B. &amp;quot;COM5&amp;quot;&lt;br /&gt;
with can.Bus(interface=&amp;quot;slcan&amp;quot;, channel=PORT,&lt;br /&gt;
             tty_baudrate=115200, bitrate=500000,&lt;br /&gt;
             listen_only=False) as bus:&lt;br /&gt;
    try:&lt;br /&gt;
        while True:&lt;br /&gt;
            message = bus.recv(timeout=1.0)&lt;br /&gt;
            if message is not None:&lt;br /&gt;
                print(message)&lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
API gemäß python-can-SLCAN-Dokumentation.&amp;lt;ref name=&amp;quot;python&amp;quot;&amp;gt;https://python-can.readthedocs.io/en/stable/interfaces/slcan.html – Offizielle python-can-Dokumentation, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt; Das Beispiel ist dokumentationsbasiert, nicht mit einer realen CANUSB-OEM-ISO getestet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Listen-only nicht voraussetzen:&#039;&#039;&#039; python-can bietet listen_only=True und slcand bietet -l; beide senden dafür L. Dieser Befehl steht nicht im aktuellen CANUSB-Handbuch. Seine Unterstützung durch die konkrete Firmware muss gesondert nachgewiesen werden. Ein lediglich lesendes Programm ist kein garantierter Silent-Sniffer.&lt;br /&gt;
&lt;br /&gt;
== Fehlerdiagnose und Grenzen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Kein COM-Port unter Windows || Load VCP aktivieren; richtigen Converter auswählen; neu verbinden&lt;br /&gt;
|-&lt;br /&gt;
| Kein ttyUSB unter Linux || ftdi_sio, PID, Kabel und konkurrierender D2XX-Zugriff&lt;br /&gt;
|-&lt;br /&gt;
| V antwortet, aber keine CAN-Frames || CAN-Bitrate, H/L, Bezugsmasse, offene/geschlossene Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
| Rote LED / Busfehler || Terminierung, Verkabelung, aktiver quittierender Gegenknoten&lt;br /&gt;
|-&lt;br /&gt;
| Verluste bei hoher Last || FIFO/USB/ASCII-Durchsatz; Hardwarefilter und Buslast prüfen&lt;br /&gt;
|-&lt;br /&gt;
| 29-Bit-Nachrichten fehlen im Monitor || Fähigkeiten der Software prüfen; Hardware unterstützt 29-Bit-IDs&lt;br /&gt;
|}&lt;br /&gt;
Keine mitgelieferten höheren Protokolle wie CANopen/J1939/BMS-Decodierung; dafür zusätzliche Software und Protokollwissen erforderlich.&amp;lt;ref name=&amp;quot;support&amp;quot; /&amp;gt; Batterie-RJ45-Belegungen sind herstellerspezifisch und nicht aus dieser D-Sub-Belegung ableitbar.&lt;br /&gt;
&lt;br /&gt;
== Quellen und offene Punkte ==&lt;br /&gt;
Die Recherche begann bei der angegebenen canusb.com-Produktseite und umfasste ELMICRO-Datenblatt, aktuelle CANUSB-Unterlagen, Supportseite und Software-Primärquellen. Gefunden: Herstellerfoto, Datenblattfoto, mechanische Padzeichnung und Treiber-/Protokollunterlagen. Nicht gefunden: separate Rückseitenaufnahme, vollständiger OEM-Schaltplan, vollständige BOM oder eine belastbare OEM-spezifische Dokumentation zusätzlicher Test-/Programmierpads. Bestückung und Firmware können revisionsabhängig sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=MCP2515=&lt;br /&gt;
&lt;br /&gt;
Modul TODO&lt;br /&gt;
&lt;br /&gt;
=MCP2515 vs SJA10001=&lt;br /&gt;
&lt;br /&gt;
Wenn man den &#039;&#039;&#039;MCP2515&#039;&#039;&#039; einsetzen und mit einer klassischen industriellen Kombination wie dem &#039;&#039;&#039;SJA1000&#039;&#039;&#039; (CAN-Controller) und einem &#039;&#039;&#039;ISO1050&#039;&#039;&#039; (galvanisch isolierter CAN-Transceiver) vergleicht, muss man wesentliche Unterschiede in der Architektur, Leistungsfaehigkeit und Physik beachten. \[1, 2\]&lt;br /&gt;
&lt;br /&gt;
==Architektur und Performance (MCP2515 vs. SJA1000)==&lt;br /&gt;
&lt;br /&gt;
Der SJA1000 von NXP gilt als der &amp;quot;Panzer&amp;quot; unter den klassischen CAN-Controllern, waehrend der MCP2515 von Microchip ein kompakter Standalone-Controller fuer kleinere eingebettete Systeme ist. \[2, 3\]&lt;br /&gt;
&lt;br /&gt;
| Kriterium | MCP2515 | SJA1000 |&lt;br /&gt;
| :---- | :---- | :---- |&lt;br /&gt;
| &#039;&#039;&#039;Schnittstelle zum Host&#039;&#039;&#039; | &#039;&#039;&#039;SPI&#039;&#039;&#039; (seriell, max. 10 MHz) | &#039;&#039;&#039;Paraller Bus&#039;&#039;&#039; (8-Bit, direkt im Speicher-Interface) |&lt;br /&gt;
| &#039;&#039;&#039;Empfangspuffer (RX)&#039;&#039;&#039; | &#039;&#039;&#039;Sehr klein:&#039;&#039;&#039; Nur 2 Message Buffer | &#039;&#039;&#039;Groesser:&#039;&#039;&#039; 64-Byte FIFO-Puffer (PeliCAN-Modus) |&lt;br /&gt;
| &#039;&#039;&#039;Gefahr von Frame-Loss&#039;&#039;&#039; | &#039;&#039;&#039;Hoch&#039;&#039;&#039; bei hoher Buslast (Buffer Overflow) | &#039;&#039;&#039;Sehr gering&#039;&#039;&#039; durch echten Hardware-FIFO |&lt;br /&gt;
&lt;br /&gt;
&amp;gt; *   &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Das Puffer-Problem (Rx-Overflow):&#039;&#039;&#039; Da der MCP2515 nur zwei Empfangspuffer besitzt, muessen Sie eingehende Nachrichten extrem schnell via SPI auslesen. Bei einer Busgeschwindigkeit von 500 kbit/s oder 1 Mbit/s und hoher Buslast (\&amp;gt; 40–50 %) kommt es bei SPI-Controllern schnell zu einem &#039;&#039;&#039;Rx-Overflow&#039;&#039;&#039;, bei dem ungelesene CAN-Nachrichten einfach verworfen werden. Der SJA1000 faengt solche Bursts durch seinen 64-Byte-FIFO problemlos ab. \[2, 4\]  &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Interrupt-Handling:&#039;&#039;&#039; Beim MCP2515 muessen Sie zwingend mit dem Hardware-Interrupt-Pin (INT) arbeiten. Reines Polling ueber SPI ist bei schnellen Bussen zu langsam und fuehrt unweigerlich zu Datenverlust. \[5, 6\]  &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Hardware-Filter nutzen:&#039;&#039;&#039; Da der Host-Prozessor beim MCP2515 durch das langsame SPI-Protokoll gebremst wird, sollten Sie die integrierten &#039;&#039;&#039;6 Acceptance Filter und 2 Masken&#039;&#039;&#039; des MCP2515 penibel konfigurieren. Lassen Sie den MCP2515 nur die Nachrichten per Interrupt an den PC/Mikrocontroller weitergeben, die Sie wirklich auswerten wollen. \[2, 4\]  &lt;br /&gt;
&amp;gt; * &lt;br /&gt;
&lt;br /&gt;
==Transceiver und galvanische Trennung (Die Rolle des ISO1050)==&lt;br /&gt;
&lt;br /&gt;
Typische billige MCP2515-Fertigmodule (z. B. fuer Arduino oder Raspberry Pi) nutzen als Transceiver den &#039;&#039;&#039;TJA1050&#039;&#039;&#039; oder &#039;&#039;&#039;MCP2551&#039;&#039;&#039;. Wenn Sie dies mit einem &#039;&#039;&#039;ISO1050&#039;&#039;&#039; vergleichen, ergeben sich massive Sicherheits- und Layout-Unterschiede: \[7, 8\]&lt;br /&gt;
&lt;br /&gt;
&amp;gt; *   &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Fehlende Isolation beim Standard-MCP2515-Modul:&#039;&#039;&#039; Der ISO1050 ist ein *galvanisch isolierter* Transceiver (bis zu 5000 V), der die empfindliche Elektronik (PC/Raspberry Pi) vor Spannungsspitzen auf dem CAN-Bus (z.B. im Auto oder in der Industrie) schuetzt. Standard-MCP2515-Boards mit dem TJA1050 besitzen &#039;&#039;&#039;keine galvanische Trennung&#039;&#039;&#039;. Schliesst man diese direkt an ein Fahrzeug-Bordnetz an, kann eine Masseschleife oder Ueberspannung den gesamten PC zerstoeren. \[7\]  &lt;br /&gt;
&amp;gt; * &#039;&#039;&#039;Spannungsversorgung (3.3V vs. 5V):&#039;&#039;&#039; Der ISO1050 besitzt getrennte Spannungsversorgungen fuer die Logikseite (VCC1: 3V bis 5.5V) und die Busseite (VCC2: 4.75V bis 5.25V). Guenstige MCP2515+TJA1050-Module laufen oft &#039;&#039;&#039;strikt mit 5V&#039;&#039;&#039;. Wenn Sie ein solches Modul an ein 3.3V-Geraet (wie den Raspberry Pi oder ESP32) anschliessen, benoetigen Sie Pegelwandler (Level Shifter) auf den SPI-Leitungen (vor allem auf der MISO-Leitung), um das Board nicht zu beschaedigen. \[7\]  &lt;br /&gt;
&amp;gt; * &lt;br /&gt;
&lt;br /&gt;
==Zusammenfassende Empfehlungen fuer die Praxis==&lt;br /&gt;
&lt;br /&gt;
&amp;gt; 1. &#039;&#039;&#039;Fuer Industrie &amp;amp; Automotive:&#039;&#039;&#039; Wenn Sie den MCP2515 in rauen Umgebungen einsetzen wollen, nutzen Sie &#039;&#039;&#039;kein&#039;&#039;&#039; billiges 2-Euro-Modul. Setzen Sie stattdessen auf Boards mit integrierter galvanischer Trennung (z. B. mit einem ISO1050 oder ADM3053 Transceiver) und integrierten TVS-Schutzdioden.  &lt;br /&gt;
&amp;gt; 2. &#039;&#039;&#039;SPI-Takt maximieren:&#039;&#039;&#039; Nutzen Sie einen moeglichst hohen SPI-Takt (der MCP2515 vertraegt bis zu 10 MHz), um die Puffer so schnell wie moeglich zu leeren. Achten Sie dabei auf kurze, gut geschirmte SPI-Leitungen.  &lt;br /&gt;
&amp;gt; 3. &#039;&#039;&#039;Taktquarz beachten:&#039;&#039;&#039; Achten Sie in der Software-Konfiguration (Bit-Timing) penibel darauf, ob auf Ihrem MCP2515-Board ein &#039;&#039;&#039;8-MHz- oder ein 16-MHz-Quarz&#039;&#039;&#039; verbaut ist. Eine falsche Angabe fuehrt dazu, dass die CAN-Baudrate halbiert oder verdoppelt wird und die Kommunikation komplett fehlschlaegt. \[2, 6, 7\]&lt;br /&gt;
&lt;br /&gt;
\[1\] [https\://adaptivesupport.amd.com](https://adaptivesupport.amd.com/s/question/0D52E00006iHjy4SAC/can-bus-implement-in-spartan-kit?language=zh_CN)  &lt;br /&gt;
\[2\] [https\://www\.flywing-tech.com](https://www.flywing-tech.com/blog/mcp2515-can-bus-overview-performance-and-alternatives/)  &lt;br /&gt;
\[3\] [https\://www\.mikrocontroller.net](https://www.mikrocontroller.net/topic/226261)  &lt;br /&gt;
\[4\] [https\://www\.flywing-tech.com](https://www.flywing-tech.com/blog/mcp2515-can-bus-overview-performance-and-alternatives/)  &lt;br /&gt;
\[5\] [https\://forum.arduino.cc](https://forum.arduino.cc/t/mcp2515-using-coryjfowler-library-on-esp32/1342270?page=2)  &lt;br /&gt;
\[6\] [https\://www\.kreatives-chaos.com](http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515)  &lt;br /&gt;
\[7\] [https\://microcontrollerslab.com](https://microcontrollerslab.com/best-can-bus-modules-mcp2515-buying-guide/)  &lt;br /&gt;
\[8\] [https\://www\.ebay.de](https://www.ebay.de/itm/314870492130)&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:CANUSB-OEM_ISO_platine.jpg&amp;diff=5504</id>
		<title>Datei:CANUSB-OEM ISO platine.jpg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:CANUSB-OEM_ISO_platine.jpg&amp;diff=5504"/>
		<updated>2026-10-11T16:41:37Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:CANUSB-OEM-ISO_funktionsschema.svg&amp;diff=5503</id>
		<title>Datei:CANUSB-OEM-ISO funktionsschema.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:CANUSB-OEM-ISO_funktionsschema.svg&amp;diff=5503"/>
		<updated>2026-10-11T16:27:47Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(CAN)_CAN-Bus_%26_Co&amp;diff=5502</id>
		<title>(CAN) CAN-Bus &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(CAN)_CAN-Bus_%26_Co&amp;diff=5502"/>
		<updated>2026-10-11T16:22:02Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Eigenschaften */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Hin und wieder begegnet mir der CAN-Bus auch außerhalb des Einsatzortes KFZ (z.B. [[(CAN) USB2CAN]]). Um nicht jedes mal recht mühsam die Infos zum weiteren Verständnis aus Büchern (ja, sowas gibt&#039;s auch noch;-)) und dem Internet zusammensuchen zu müssen, habe ich hier mal angefangen die für mich notwendigen Informationen zusammenzustellen.&lt;br /&gt;
&lt;br /&gt;
=Feldbusse=&lt;br /&gt;
&lt;br /&gt;
CAN (Controller Area Network) gehoert mit dem &lt;br /&gt;
* LIN-Bus&lt;br /&gt;
* FlexRay&lt;br /&gt;
* MOST&lt;br /&gt;
* Byteflight und&lt;br /&gt;
* Intellibus&lt;br /&gt;
zu den Fledbus-Systemen, die im Bereich Automotive die groeszte Verbreitung finden.&lt;br /&gt;
&lt;br /&gt;
Die Pseudodefinition aus [https://de.wikipedia.org/wiki/Feldbus Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 Ein Feldbus ist ein Bussystem, das in einer Anlage Feldgeräte wie Messfühler (Sensoren) und Stellglieder (Aktoren) zur Kommunikation mit einem Automatisierungsgerät verbindet.&lt;br /&gt;
&lt;br /&gt;
finde ich in sofern widerspruechlich, als auch zu eng gefasst, da weiter unten im Artikel die o. g. Bussysteme aufgelistet werden, aber ein Auto als Feldgeraet einzuordnen braucht doch ein wenig Fantasie.&lt;br /&gt;
&lt;br /&gt;
=Historie=&lt;br /&gt;
&lt;br /&gt;
Im Schnelldurchlauf:&lt;br /&gt;
&lt;br /&gt;
Das CAN ist ein serielles Bus-System. &lt;br /&gt;
&lt;br /&gt;
Entwickelt wurde es von der Robert-Bosch GmbH ab 1983.&lt;br /&gt;
&lt;br /&gt;
Das CAN-Protokoll ist durch Patente geschuetzt.&lt;br /&gt;
&lt;br /&gt;
Specification 2.0 wurde 1991 veroeffentlicht.&lt;br /&gt;
&lt;br /&gt;
CAN ist eine reine DataLinkLayer (Sicherungsschicht) Implementation.&lt;br /&gt;
&lt;br /&gt;
ISO 11898 wurde 1993 veroeffentlicht (Road vehicles - Interchange of digital information - Controller area network (CAN) for high speed communication.&lt;br /&gt;
&lt;br /&gt;
CANopen Protokoll von CiA (CANinAutomation) 1995 veroeffentlicht.&lt;br /&gt;
&lt;br /&gt;
CiA spezifiziert CAL (CAN Applikation Layer)&lt;br /&gt;
&lt;br /&gt;
2000 Entwicklung von TTCAN (Time-triggered communication)&lt;br /&gt;
&lt;br /&gt;
=Eigenschaften=&lt;br /&gt;
&lt;br /&gt;
* Busstruktur (Topologie) mit einem TrunkCable&lt;br /&gt;
* Zweileitungssystem (verdrillt)&lt;br /&gt;
* Busterminierung an jedem Ende des TrunkCables mit einem 120 Ohm Widerstand&lt;br /&gt;
* Anschluss der Teilnehmer mit einem DropCable&lt;br /&gt;
* Bis zu 1 Mbps, dann aber max TrunkCable-Laenge 40 m&lt;br /&gt;
* Bis zu 8 Bytes können mit einer Nachricht (Frames) uebertragen werden.&lt;br /&gt;
* Multi-Master Zugriff&lt;br /&gt;
* Bus Arbitration (Streit-Schlichter) bei gleichzeitigem Zugriff mehrerer Sender&lt;br /&gt;
* Broadcast Nachrichten&lt;br /&gt;
* Keine Teilnehmer-Adressen (relevante Nachrichten werden gefiltert)&lt;br /&gt;
* Nachrichten Anforderung moeglich&lt;br /&gt;
* Error Detection und Signaling durch spezielle Frames.&lt;br /&gt;
* Automatische Wiederholung der Nachricht bei einem Fehler.&lt;br /&gt;
* Automatische Deaktivierung von Teilnehmern (nodes) bei dauerhaften Fehlern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Controllerboard CANUSB-OEM-ISO INTERFACE ADAPTER TYP 122=&lt;br /&gt;
&lt;br /&gt;
= CANUSB-OEM-ISO =&lt;br /&gt;
&#039;&#039;&#039;Recherchestand: 11. Oktober 2026.&#039;&#039;&#039; Die CANUSB-OEM-ISO ist die galvanisch getrennte Einbauplatine des LAWICEL CANUSB. Hersteller/Fertigung: ELMICRO Computer. Treiber, ASCII-Protokoll und API sind mit CANUSB kompatibel.&amp;lt;ref name=&amp;quot;produkt&amp;quot;&amp;gt;https://www.canusb.com/products/canusb-oem-iso/ – Hersteller-Produktseite, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schnellanschluss:&#039;&#039;&#039; USB an den Computer; CAN_H an D-Sub-Pin 7, CAN_L an Pin 2, CAN_GND an Pin 3. Keine externe Versorgung am CAN-Stecker einspeisen. Windows und Linux verwenden dieselbe elektrische Belegung.&lt;br /&gt;
&lt;br /&gt;
== Platinenbilder ==&lt;br /&gt;
[[Datei:CANUSB-OEM-ISO_platine.jpg|thumb|600px|Herstellerfoto der Standardbestückung mit Mini-B und D-Sub9. Quelle: ELMICRO.]]&lt;br /&gt;
[[Datei:CANUSB-OEM-ISO_datenblattfoto.jpg|thumb|500px|Platinenfoto aus dem OEM-Datenblatt; keine separate Rückseitenaufnahme. Quelle: ELMICRO.]]&lt;br /&gt;
[[Datei:CANUSB-OEM-ISO_masszeichnung.png|thumb|700px|Originale Maß- und Padzeichnung aus dem Datenblatt, Seite 2.]]&lt;br /&gt;
&lt;br /&gt;
Die Bilddateien liegen im Begleitpaket. Vor Verwendung der Seite unter exakt diesen Namen in das Wiki hochladen. MediaWiki lädt Bilder nicht automatisch aus dem ZIP. Die Herstellerbilder und Zeichnung sind keine frei lizenzierten Eigenaufnahmen; für öffentliche Weiterveröffentlichung Nutzungsrechte prüfen. Originalfoto: https://elmicro.com/site/assets/files/10794/canusboemiso.jpg&lt;br /&gt;
&lt;br /&gt;
== Eckdaten und Varianten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! Angabe / Einordnung&lt;br /&gt;
|-&lt;br /&gt;
| Bauform || Offene FR4-Einbauplatine; kein Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| Isolation || Bauteile mindestens 1 kV; Kriechstrecke mindestens 3 mm&lt;br /&gt;
|-&lt;br /&gt;
| Bedeutung der Isolation || Kurzzeitige Bauteilprüfspannung, keine zulässige dauernde Betriebsspannung; Datenblatt sieht Versorgungsspannungen über 42 V DC nicht vor&lt;br /&gt;
|-&lt;br /&gt;
| Platinenmaß || 66,04 × 45,72 mm&lt;br /&gt;
|-&lt;br /&gt;
| Befestigung || Vier Bohrungen Ø 3,20 mm; Lochabstände 58,42 × 38,10 mm&lt;br /&gt;
|-&lt;br /&gt;
| Standardanschlüsse || USB Mini-B; CAN D-Sub9, männlich&lt;br /&gt;
|-&lt;br /&gt;
| Optionen || USB 2×5-Pads, Raster 2,54 mm; CAN sechspolige Federkraftklemme, Raster 5,08 mm&lt;br /&gt;
|-&lt;br /&gt;
| Bestellbezeichnung || CANUSB/OEM122: isoliert / Mini-B / D-Sub9&lt;br /&gt;
|}&lt;br /&gt;
OEM-spezifische Angaben: Datenblatt vom 24.06.2015.&amp;lt;ref name=&amp;quot;oem&amp;quot;&amp;gt;https://elmicro.com/files/elmicro/canusb-oem-iso_spec003.pdf – CANUSB-OEM-ISO Produktspezifikation, 24.06.2015, 2 Seiten.&amp;lt;/ref&amp;gt; Varianten und Lieferbestückung vor Bestellung bestätigen. Die Hersteller-Shopseite nennt 122,90 € netto zuzüglich Versand; das ist ein abgelesenes Angebot, kein verbindlicher aktueller Kaufpreis.&amp;lt;ref name=&amp;quot;shop&amp;quot;&amp;gt;https://elmicro.com/en/canusb-oem-iso.html – OEM-Produkt- und Bestellseite, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! CANUSB-Funktion !! Angabe&lt;br /&gt;
|-&lt;br /&gt;
| Bus || Classical CAN 2.0A/2.0B; 11-/29-Bit-Identifier, RTR; bis 1 Mbit/s&lt;br /&gt;
|-&lt;br /&gt;
| USB || USB 2.0 Full Speed, Versorgung über USB&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Controller || SJA1000, 16 MHz&lt;br /&gt;
|-&lt;br /&gt;
| Empfang || 32 Frames FIFO; optionale Millisekunden-Zeitstempel&lt;br /&gt;
|-&lt;br /&gt;
| Anzeigen || Grün: CAN-Aktivität; Rot: CAN-Fehler&lt;br /&gt;
|-&lt;br /&gt;
| Software || FTDI VCP oder D2XX; LAWICEL API-DLL 32/64 Bit&lt;br /&gt;
|}&lt;br /&gt;
Diese Funktionen stammen vom kompatiblen CANUSB.&amp;lt;ref name=&amp;quot;canusb&amp;quot;&amp;gt;https://www.canusb.com/products/canusb/ – LAWICEL CANUSB, Spezifikationen und Anschlussinformationen.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;CAN FD wird nicht unterstützt.&#039;&#039;&#039; Die Gehäusemaße, Stromaufnahme und Temperaturfreigabe des normalen Dongles sind kein eigenständiger OEM-Nachweis. Ebenso darf 1 Mbit/s nicht als Garantie verlustfreier Aufzeichnung eines voll ausgelasteten Busses verstanden werden.&lt;br /&gt;
&lt;br /&gt;
== Anschlussbelegungen ==&lt;br /&gt;
=== D-Sub9: CAN ===&lt;br /&gt;
Pinzahlen am Steckverbinder verwenden: Lötseite und Steckseite sind spiegelverkehrt. Die folgenden drei Signale sind vom Hersteller ausdrücklich für den Betrieb genannt.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Pin !! Verwendung an dieser Baugruppe&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Für Betrieb nicht verwenden; tatsächliche OEM-Verschaltung nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CAN_L&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CAN_GND, galvanisch getrennte Busseite&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Für Betrieb nicht verwenden; nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Für Betrieb nicht verwenden; Schirmbehandlung nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Für Betrieb nicht verwenden; zusätzliche Masseverbindung nicht separat bestätigt&lt;br /&gt;
|-&lt;br /&gt;
| 7 || CAN_H&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Für Betrieb nicht verwenden; nicht separat dokumentiert&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Keine externe Versorgung erforderlich; nicht mit Batteriespannung verbinden&lt;br /&gt;
|}&lt;br /&gt;
Ein D-Sub9-Stecker macht das Gerät nicht zu RS232. Insbesondere nicht an einen seriellen PC-Port anschließen.&lt;br /&gt;
&lt;br /&gt;
=== USB-Pads: 2×5 ===&lt;br /&gt;
&#039;&#039;&#039;Orientierung wie in der Maßzeichnung: USB-Pads links, CAN-Pads rechts.&#039;&#039;&#039; Beide Spalten haben dieselbe Zeilenbelegung. Keine erfundene fortlaufende Pin-Nummerierung: Das Datenblatt benennt Signale, keine Pinnummern.&amp;lt;ref name=&amp;quot;oem&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Zeile von oben !! Linkes Pad !! Rechtes Pad&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC (+5 V USB) || VCC (+5 V USB)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || D− || D−&lt;br /&gt;
|-&lt;br /&gt;
| 3 || D+ || D+&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND (USB-Seite) || GND (USB-Seite)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || n.c. || n.c.&lt;br /&gt;
|}&lt;br /&gt;
Nicht blind einen beliebigen Mainboard-USB-Stecker aufsetzen: Position des fehlenden Pins und der freien Leitung am konkreten Kabel prüfen. USB-GND nicht mit CAN_GND brücken, wenn die galvanische Trennung erhalten bleiben soll. Mini-B und Header nicht gleichzeitig an zwei USB-Hosts anschließen.&lt;br /&gt;
&lt;br /&gt;
=== CAN-Pads / optionale Klemme ===&lt;br /&gt;
Die Zeichnung zeigt sechs Signalpositionen mit jeweils zwei horizontalen Lötpads. &#039;&#039;&#039;Von oben nach unten in der Herstellerzeichnung:&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;oem&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Position !! Signal !! Verbindung zum D-Sub&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CAN_H || Pin 7&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CAN_H || Pin 7&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CAN_L || Pin 2&lt;br /&gt;
|-&lt;br /&gt;
| 4 || CAN_L || Pin 2&lt;br /&gt;
|-&lt;br /&gt;
| 5 || CAN_GND || Pin 3&lt;br /&gt;
|-&lt;br /&gt;
| 6 || CAN_GND || Pin 3&lt;br /&gt;
|}&lt;br /&gt;
Signalreihenfolge aus der Zeichnung, D-Sub-Zuordnung aus den CANUSB-Anschlussangaben. Die Nummern 1–6 sind hier Positionshilfen, keine aufgedruckten Hersteller-Pinnummern. Masse auf der Busseite ist nicht USB-Masse.&lt;br /&gt;
&lt;br /&gt;
=== Praktischer Kabelaufbau ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Computer / Board !! Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| USB Mini-B || USB-Host über geeignetes Datenkabel&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 7 / CAN_H-Pad || CAN_H der Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 2 / CAN_L-Pad || CAN_L der Gegenstelle&lt;br /&gt;
|-&lt;br /&gt;
| D-Sub 3 / CAN_GND-Pad || CAN-Bezugsmasse der Gegenstelle&lt;br /&gt;
|}&lt;br /&gt;
CAN_H/CAN_L als verdrilltes Paar führen. An beiden physikalischen Busenden jeweils 120 Ω zwischen H und L; einen zusätzlichen Abschluss nur setzen, wenn die Platine am Busende sitzt und dort noch kein Abschluss vorhanden ist. Bei ausgeschalteten Geräten ergeben zwei parallele 120-Ω-Abschlüsse rechnerisch etwa 60 Ω. &#039;&#039;&#039;Eine onboard zuschaltbare Terminierung ist in den recherchierten OEM-Unterlagen nicht belegt.&#039;&#039;&#039; Für normales Senden braucht es einen weiteren aktiven CAN-Knoten, der quittiert.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bauteile / Teilstückliste ==&lt;br /&gt;
&#039;&#039;&#039;Keine vollständige Hersteller-BOM gefunden.&#039;&#039;&#039; Die Tabelle ist eine Funktions- und Identifikationsliste, keine belastbare Einkaufsstückliste. Nicht lesbare Werte und Bestückungsreferenzen werden nicht ergänzt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Baugruppe / Bauteil !! Identifikation !! Belegstatus&lt;br /&gt;
|-&lt;br /&gt;
| USB-FIFO || FTDI FT245RL || In CANUSB-Unterlagen genannt; entsprechendes IC im OEM-Foto&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Controller || NXP/Philips SJA1000 || Dokumentiert; NXP-IC im Platinenfoto&lt;br /&gt;
|-&lt;br /&gt;
| Mikrocontroller || Atmel AVR || CANUSB-Handbuch; konkreten OEM-Typ am eigenen Board ablesen&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Transceiver || CANUSB nennt 82C251 || Nicht als verbindliche OEM-BOM behandeln; exakten Aufdruck prüfen&lt;br /&gt;
|-&lt;br /&gt;
| Isolations-Signalbauteile || Typ nicht sicher bestimmt || Im OEM-Foto sichtbar; keine öffentliche Bestückungsliste gefunden&lt;br /&gt;
|-&lt;br /&gt;
| Isolierte Versorgung || DC/DC-Funktionsblock plausibel || Bauteiltyp und Kennwerte nicht verifiziert&lt;br /&gt;
|-&lt;br /&gt;
| Taktbauteile || Quarz / Resonator || Foto; vollständige Frequenz- und Typzuordnung offen&lt;br /&gt;
|-&lt;br /&gt;
| USB-Buchse || Mini-B, SMD || OEM-Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| CAN-Stecker || D-Sub9 male, SMD mit mechanischen TH-Pads || OEM-Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| Optionale USB-Stiftleiste || 2×5, 2,54 mm || Variante; Standardfoto zeigt freie Pads&lt;br /&gt;
|-&lt;br /&gt;
| Optionale CAN-Klemme || 6-polig, 5,08 mm || Variante; Standardfoto zeigt freie Pads&lt;br /&gt;
|-&lt;br /&gt;
| LEDs / R / C / Schutzbeschaltung || Einzelwerte unbekannt || Keine vollständige BOM gefunden&lt;br /&gt;
|}&lt;br /&gt;
Basis-ICs: CANUSB-Produktseite und Handbuch; Sichtbefunde: Herstellerfoto.&amp;lt;ref name=&amp;quot;canusb&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;manual&amp;quot;&amp;gt;https://www.canusb.com/files/canusb_manual.pdf – LAWICEL CANUSB User Manual, Rev. 1.1-en, 12.07.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schaltung und Schaltplan ==&lt;br /&gt;
[[Datei:CANUSB-OEM-ISO_funktionsschema.svg|thumb|800px|Eigenes vereinfachtes Funktionsschema; kein Hersteller-Schaltplan.]]&lt;br /&gt;
&#039;&#039;&#039;Ein vollständiger öffentlich zugänglicher OEM-Schaltplan wurde nicht gefunden.&#039;&#039;&#039; Ebenso fehlen verifizierte Gerberdaten, Netzliste und vollständige BOM. Das Schema zeigt nur die funktionale Architektur. Es ist weder eine Rekonstruktion der tatsächlichen Verdrahtung noch eine Nachbauvorlage. Ein SJA1000-Datenblatt ersetzt keinen OEM-Schaltplan.&lt;br /&gt;
&lt;br /&gt;
== Betrieb unter Windows ==&lt;br /&gt;
# Platine per USB-Datenkabel anschließen; FTDI-Treiber normalerweise automatisch installieren lassen, andernfalls das offizielle FTDI-Paket verwenden.&lt;br /&gt;
# Geräte-Manager: passenden „USB Serial Converter“ anhand Gerätebeschreibung „CANUSB“ identifizieren.&lt;br /&gt;
# Für COM-Port-Zugriff: Eigenschaften → Erweitert → „Load VCP“ aktivieren, USB abziehen und wieder einstecken.&lt;br /&gt;
# Zugewiesenen COM-Port notieren. Terminal mit 8N1, ohne Handshake und mit &#039;&#039;&#039;CR allein&#039;&#039;&#039; als Sendeabschluss öffnen. Laut Hersteller ist die eingestellte virtuelle Baudrate beliebig; sie ist nicht die CAN-Bitrate.&lt;br /&gt;
# Zuerst nur Version mit V abfragen; danach passende CAN-Bitrate setzen und Kanal öffnen.&lt;br /&gt;
Diese VCP-Schritte sind im Hersteller-Testtutorial beschrieben.&amp;lt;ref name=&amp;quot;test&amp;quot;&amp;gt;https://www.canusb.com/support/howto-check-canusb/ – Hersteller-Testanleitung, 02.02.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternative: D2XX und LAWICEL CANUSB-DLL. DLL-Architektur muss zur Anwendung passen: canusbdrv.dll für 32 Bit, canusbdrv64.dll für 64 Bit. Auch eine 32-Bit-Anwendung unter 64-Bit-Windows braucht die 32-Bit-DLL. Hersteller-Supportseite enthält DLL-Paket, Beispiele und CAN Monitor Lite. Alte Geräte vor Februar 2015 können PID FFA8 statt 6001 besitzen und benötigen besondere Behandlung. Derselbe Adapter sollte nicht parallel von Terminal und D2XX-Anwendung geöffnet werden.&amp;lt;ref name=&amp;quot;support&amp;quot;&amp;gt;https://www.canusb.com/support/canusb-support/ – Treiber, DLL, Beispiele, Legacy-Hinweise.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Windows 11 ist hier nicht als separat getestete OEM-Konfiguration nachgewiesen. Den passenden aktuellen FTDI-Treiber und die Anwendungskompatibilität prüfen; alte Windows-Treiber nicht ungeprüft übernehmen.&lt;br /&gt;
&lt;br /&gt;
== ASCII-Befehle ==&lt;br /&gt;
Groß-/Kleinschreibung beachten; jede Zeile endet mit CR (0x0D). Konfiguration bei geschlossenem CAN-Kanal.&amp;lt;ref name=&amp;quot;manual&amp;quot; /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Befehl !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| V / N || Version / Seriennummer&lt;br /&gt;
|-&lt;br /&gt;
| S0, S1, S2, S3, S4 || 10, 20, 50, 100, 125 kbit/s&lt;br /&gt;
|-&lt;br /&gt;
| S5, S6, S7, S8 || 250, 500, 800, 1000 kbit/s&lt;br /&gt;
|-&lt;br /&gt;
| sxxyy || SJA1000 BTR0/BTR1 setzen&lt;br /&gt;
|-&lt;br /&gt;
| O / C || Kanal öffnen / schließen&lt;br /&gt;
|-&lt;br /&gt;
| tiiildd… / Tiiiiiiiildd… || 11-/29-Bit-Datenframe; DLC 0–8&lt;br /&gt;
|-&lt;br /&gt;
| riiil / Riiiiiiiil || RTR mit 11-/29-Bit-ID&lt;br /&gt;
|-&lt;br /&gt;
| F || Fehlerstatus&lt;br /&gt;
|-&lt;br /&gt;
| Mxxxxxxxx / mxxxxxxxx || Acceptance-Code / -Maske&lt;br /&gt;
|-&lt;br /&gt;
| Z0 / Z1 || Empfangszeitstempel aus / an&lt;br /&gt;
|}&lt;br /&gt;
Beispiel für einen eigenen Testbus mit 500 kbit/s; jede Zeile einzeln senden und Antwort abwarten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
V&lt;br /&gt;
S6&lt;br /&gt;
O&lt;br /&gt;
F&lt;br /&gt;
C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein Sendetest erst am geeigneten Testbus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
t12320102&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bedeutung: ID 0x123, zwei Datenbytes 01 02. &#039;&#039;&#039;Nicht als BMS-Abfrage oder sonstigen gerätespezifischen Befehl interpretieren.&#039;&#039;&#039; Erfolg bei Datenframes: z beziehungsweise Z plus CR; Fehler: BEL (0x07). Ein angenommenes Sendekommando ist kein Nachweis, dass die Zielanwendung die Daten verstanden hat.&lt;br /&gt;
&lt;br /&gt;
== Betrieb unter Linux ==&lt;br /&gt;
=== Erkennung ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsusb&lt;br /&gt;
sudo modprobe ftdi_sio&lt;br /&gt;
journalctl -k -n 50&lt;br /&gt;
ls -l /dev/serial/by-id/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Typischer Port: /dev/ttyUSB0; bei mehreren Adaptern stabilen by-id-Pfad bevorzugen. Moderne Geräte verwenden FTDI-PID 6001, alte FFA8.&amp;lt;ref name=&amp;quot;support&amp;quot; /&amp;gt; Kein ttyUSB-Port: USB-Datenkabel, Treiberbindung, PID und Zugriffsrechte prüfen. D2XX-Zugriff und ftdi_sio können um das Gerät konkurrieren.&lt;br /&gt;
&lt;br /&gt;
=== SocketCAN mit slcand ===&lt;br /&gt;
Benötigt can-utils, iproute2 und Kernelmodul slcan. Beispielinstallation je nach Distribution:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Debian / Ubuntu&lt;br /&gt;
sudo apt install can-utils iproute2&lt;br /&gt;
# Fedora&lt;br /&gt;
sudo dnf install can-utils iproute&lt;br /&gt;
# openSUSE: Paketverfügbarkeit im verwendeten Release prüfen&lt;br /&gt;
sudo zypper install can-utils iproute2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vorher andere Programme am seriellen Port schließen. 500-kbit/s-Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo modprobe slcan&lt;br /&gt;
sudo slcand -o -c -f -s6 -S 115200 /dev/ttyUSB0 can0&lt;br /&gt;
sudo ip link set can0 up&lt;br /&gt;
ip -details -statistics link show can0&lt;br /&gt;
candump -tz can0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-s6 setzt CAN auf 500 kbit/s; -S 115200 betrifft den seriellen Port. -c/-o schließen/öffnen den Kanal, -f liest Status. Dies ist die Verwendung des can-utils-Werkzeugs, kein nativer USB-CAN-Netzwerktreiber.&amp;lt;ref name=&amp;quot;slcand&amp;quot;&amp;gt;https://raw.githubusercontent.com/linux-can/can-utils/master/slcand.c – Offizieller can-utils-Quelltext, insbesondere print_usage; abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur am Testbus senden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cansend can0 123#0102&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Für das Beenden: can0 mit ip link herunterfahren und den zu diesem Adapter gehörenden slcand-Prozess gezielt beenden. Keine pauschale Beendigung anderer Adapterprozesse.&lt;br /&gt;
&lt;br /&gt;
=== Python unter Linux und Windows ===&lt;br /&gt;
Alternative ohne slcand; VCP muss erreichbar sein. Beispiel erzeugt &#039;&#039;&#039;keine eigenen Datenframes&#039;&#039;&#039;, arbeitet jedoch im normalen aktiven CAN-Modus und kann ACK/Fehlerverhalten des Busses beeinflussen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python -m venv .venv&lt;br /&gt;
# Linux:&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
# Windows PowerShell stattdessen:&lt;br /&gt;
# .venv\Scripts\Activate.ps1&lt;br /&gt;
python -m pip install python-can pyserial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import can&lt;br /&gt;
&lt;br /&gt;
PORT = &amp;quot;/dev/ttyUSB0&amp;quot;  # Windows: z. B. &amp;quot;COM5&amp;quot;&lt;br /&gt;
with can.Bus(interface=&amp;quot;slcan&amp;quot;, channel=PORT,&lt;br /&gt;
             tty_baudrate=115200, bitrate=500000,&lt;br /&gt;
             listen_only=False) as bus:&lt;br /&gt;
    try:&lt;br /&gt;
        while True:&lt;br /&gt;
            message = bus.recv(timeout=1.0)&lt;br /&gt;
            if message is not None:&lt;br /&gt;
                print(message)&lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
API gemäß python-can-SLCAN-Dokumentation.&amp;lt;ref name=&amp;quot;python&amp;quot;&amp;gt;https://python-can.readthedocs.io/en/stable/interfaces/slcan.html – Offizielle python-can-Dokumentation, abgerufen am 11.10.2026.&amp;lt;/ref&amp;gt; Das Beispiel ist dokumentationsbasiert, nicht mit einer realen CANUSB-OEM-ISO getestet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Listen-only nicht voraussetzen:&#039;&#039;&#039; python-can bietet listen_only=True und slcand bietet -l; beide senden dafür L. Dieser Befehl steht nicht im aktuellen CANUSB-Handbuch. Seine Unterstützung durch die konkrete Firmware muss gesondert nachgewiesen werden. Ein lediglich lesendes Programm ist kein garantierter Silent-Sniffer.&lt;br /&gt;
&lt;br /&gt;
== Fehlerdiagnose und Grenzen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Kein COM-Port unter Windows || Load VCP aktivieren; richtigen Converter auswählen; neu verbinden&lt;br /&gt;
|-&lt;br /&gt;
| Kein ttyUSB unter Linux || ftdi_sio, PID, Kabel und konkurrierender D2XX-Zugriff&lt;br /&gt;
|-&lt;br /&gt;
| V antwortet, aber keine CAN-Frames || CAN-Bitrate, H/L, Bezugsmasse, offene/geschlossene Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
| Rote LED / Busfehler || Terminierung, Verkabelung, aktiver quittierender Gegenknoten&lt;br /&gt;
|-&lt;br /&gt;
| Verluste bei hoher Last || FIFO/USB/ASCII-Durchsatz; Hardwarefilter und Buslast prüfen&lt;br /&gt;
|-&lt;br /&gt;
| 29-Bit-Nachrichten fehlen im Monitor || Fähigkeiten der Software prüfen; Hardware unterstützt 29-Bit-IDs&lt;br /&gt;
|}&lt;br /&gt;
Keine mitgelieferten höheren Protokolle wie CANopen/J1939/BMS-Decodierung; dafür zusätzliche Software und Protokollwissen erforderlich.&amp;lt;ref name=&amp;quot;support&amp;quot; /&amp;gt; Batterie-RJ45-Belegungen sind herstellerspezifisch und nicht aus dieser D-Sub-Belegung ableitbar.&lt;br /&gt;
&lt;br /&gt;
== Quellen und offene Punkte ==&lt;br /&gt;
Die Recherche begann bei der angegebenen canusb.com-Produktseite und umfasste ELMICRO-Datenblatt, aktuelle CANUSB-Unterlagen, Supportseite und Software-Primärquellen. Gefunden: Herstellerfoto, Datenblattfoto, mechanische Padzeichnung und Treiber-/Protokollunterlagen. Nicht gefunden: separate Rückseitenaufnahme, vollständiger OEM-Schaltplan, vollständige BOM oder eine belastbare OEM-spezifische Dokumentation zusätzlicher Test-/Programmierpads. Bestückung und Firmware können revisionsabhängig sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&#039;&#039;Für die Referenzanzeige wird die MediaWiki-Erweiterung Cite benötigt. Bei fehlender Cite-Erweiterung die Quellen als gewöhnliche externe Links übernehmen. Die Seite benötigt keine Infobox-Vorlage oder SyntaxHighlight-Erweiterung.&#039;&#039;&lt;br /&gt;
&#039;&#039;Originalunterlagen werden verlinkt; ihre vollständigen Texte sind nicht Bestandteil dieses Artikels.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(Eco_Worthy)_Battery_Charger_48V_50A&amp;diff=5501</id>
		<title>(Eco Worthy) Battery Charger 48V 50A</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(Eco_Worthy)_Battery_Charger_48V_50A&amp;diff=5501"/>
		<updated>2026-10-11T14:57:32Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Handbuch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Da ich meine Victron/Pylontech-Kombi als PV-unterstuetzte-Notstrom-Anlage mittlerweile anmeldefrei als Inselanlage betreibe und ich dadurch notgedrungen, das interne Ladegeraet des Multiplus abschalten musste, habe ich mich fuer ein ECO-WORTHY 48V 50A Ladegeraet (EWBC) als Ersatz entschieden.&lt;br /&gt;
&lt;br /&gt;
Ob und wie der EWBC von Cerbo bzw. von Venus OS unterstuetzt wird muss ich noch herausfinden.&lt;br /&gt;
&lt;br /&gt;
=Handbuch=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf width=&amp;quot;1000&amp;quot; height=&amp;quot;500&amp;quot;&amp;gt;File:EcoWorthy_BatteryCharger_Manual_korrigiert.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Fotos=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:ECOWORTHY_Trafo_1.jpg&lt;br /&gt;
File:ECOWORTHY_PCB_2.jpg&lt;br /&gt;
File:ECOWORTHY_Typenschild_2.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:ECOWORTHY_Typenschild_2.jpg&amp;diff=5500</id>
		<title>Datei:ECOWORTHY Typenschild 2.jpg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:ECOWORTHY_Typenschild_2.jpg&amp;diff=5500"/>
		<updated>2026-10-11T14:51:28Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:ECOWORTHY_PCB_2.jpg&amp;diff=5499</id>
		<title>Datei:ECOWORTHY PCB 2.jpg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:ECOWORTHY_PCB_2.jpg&amp;diff=5499"/>
		<updated>2026-10-11T14:51:23Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:ECOWORTHY_Trafo_1.jpg&amp;diff=5498</id>
		<title>Datei:ECOWORTHY Trafo 1.jpg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:ECOWORTHY_Trafo_1.jpg&amp;diff=5498"/>
		<updated>2026-10-11T14:51:21Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(Eco_Worthy)_Battery_Charger_48V_50A&amp;diff=5497</id>
		<title>(Eco Worthy) Battery Charger 48V 50A</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(Eco_Worthy)_Battery_Charger_48V_50A&amp;diff=5497"/>
		<updated>2026-10-11T14:39:59Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Handbuch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Da ich meine Victron/Pylontech-Kombi als PV-unterstuetzte-Notstrom-Anlage mittlerweile anmeldefrei als Inselanlage betreibe und ich dadurch notgedrungen, das interne Ladegeraet des Multiplus abschalten musste, habe ich mich fuer ein ECO-WORTHY 48V 50A Ladegeraet (EWBC) als Ersatz entschieden.&lt;br /&gt;
&lt;br /&gt;
Ob und wie der EWBC von Cerbo bzw. von Venus OS unterstuetzt wird muss ich noch herausfinden.&lt;br /&gt;
&lt;br /&gt;
=Handbuch=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf width=&amp;quot;1000&amp;quot; height=&amp;quot;500&amp;quot;&amp;gt;File:EcoWorthy_BatteryCharger_Manual_korrigiert.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(Eco_Worthy)_Battery_Charger_48V_50A&amp;diff=5496</id>
		<title>(Eco Worthy) Battery Charger 48V 50A</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(Eco_Worthy)_Battery_Charger_48V_50A&amp;diff=5496"/>
		<updated>2026-10-11T10:28:35Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Die Seite wurde neu angelegt: „=Allgemeines= Da ich meine Victron/Pylontech-Kombi als PV-unterstuetzte-Notstrom-Anlage mittlerweile anmeldefrei als Inselanlage betreibe und ich dadurch notgedrungen, das interne Ladegeraet des Multiplus abschalten musste, habe ich mich fuer ein ECO-WORTHY 48V 50A Ladegeraet (EWBC) als Ersatz entschieden.  Ob und wie der EWBC von Cerbo bzw. von Venus OS unterstuetzt wird muss ich noch herausfinden.  =Handbuch=  &amp;lt;pdf width=&amp;quot;1000&amp;quot; height=&amp;quot;500&amp;quot;&amp;gt;EcoWorthy_Ba…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Da ich meine Victron/Pylontech-Kombi als PV-unterstuetzte-Notstrom-Anlage mittlerweile anmeldefrei als Inselanlage betreibe und ich dadurch notgedrungen, das interne Ladegeraet des Multiplus abschalten musste, habe ich mich fuer ein ECO-WORTHY 48V 50A Ladegeraet (EWBC) als Ersatz entschieden.&lt;br /&gt;
&lt;br /&gt;
Ob und wie der EWBC von Cerbo bzw. von Venus OS unterstuetzt wird muss ich noch herausfinden.&lt;br /&gt;
&lt;br /&gt;
=Handbuch=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf width=&amp;quot;1000&amp;quot; height=&amp;quot;500&amp;quot;&amp;gt;EcoWorthy_BatteryCharger_Manual_korrigiert.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:EcoWorthy_BatteryCharger_Manual_korrigiert.pdf&amp;diff=5495</id>
		<title>Datei:EcoWorthy BatteryCharger Manual korrigiert.pdf</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:EcoWorthy_BatteryCharger_Manual_korrigiert.pdf&amp;diff=5495"/>
		<updated>2026-10-11T10:28:01Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=KI_Einf%C3%BChrung_in_maschinelles_Lernen_mit_Python_und_PyTorch&amp;diff=5494</id>
		<title>KI Einführung in maschinelles Lernen mit Python und PyTorch</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=KI_Einf%C3%BChrung_in_maschinelles_Lernen_mit_Python_und_PyTorch&amp;diff=5494"/>
		<updated>2026-10-11T08:45:44Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Request for Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Ich habe hier für mich Informationen zusammengetragen, die mir das Implementieren von eigenen Neuronalen Netzen erlaubt. &lt;br /&gt;
&lt;br /&gt;
Mein Ausgangspunkt sind Experimente mit meiner RTX3060 12GB. Diese laeuft parallel zu meiner Hauptgrafikkarte als reine &amp;quot;KI-Karte&amp;quot; um kein VRAM zu verschenken.&lt;br /&gt;
&lt;br /&gt;
Ein erster Test mit OpenAI Whisper war schnell installiert und laeuft erstaunlich fluessig.&lt;br /&gt;
&lt;br /&gt;
Jetzt ist es aber an der Zeit eigene Modelle zu programmieren und zu trainieren.&lt;br /&gt;
Zu diesem Zweck habe ich mir ein vorlesungsaehnliches Script erzeugen lassen, das ich als Leitfaden nutze.&lt;br /&gt;
&lt;br /&gt;
=Skript=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf width=&amp;quot;1000&amp;quot; height=&amp;quot;300&amp;quot;&amp;gt;File:KI_PyTorch_Semesterskript.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Einrichtung (Kapitel 1)==&lt;br /&gt;
===CopyBox===&lt;br /&gt;
 mkdir -p TorchSkript&lt;br /&gt;
 cd TorchSkript/&lt;br /&gt;
 source .venv/bin/activate&lt;br /&gt;
 python -m pip install --upgrade pip&lt;br /&gt;
 pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu126&lt;br /&gt;
 python -m pip install jupyterlab matplotlib. NumPy&lt;br /&gt;
 python -m pip install jupyterlab matplotlib NumPy&lt;br /&gt;
 python kurs.py --smoke&lt;br /&gt;
 python kurs.py --model linear --epochs 1 --limit 2000 --out run_probe&lt;br /&gt;
&lt;br /&gt;
===MNIST===&lt;br /&gt;
&lt;br /&gt;
Nach der Installation existiert ein Verzeichnis /data/MNIST/raw.&lt;br /&gt;
&lt;br /&gt;
In diesem Verzeichnis liegen die Trainingsgrafiken mit Ihren Labeln.&lt;br /&gt;
&lt;br /&gt;
 Die MNIST-Datenbank (Modified National Institute of Standards and Technology database[1]) ist eine öffentlich verfügbare Datenbank von handgeschriebenen Ziffern. Wobei jede Ziffer als 28 × 28 Pixel großes Graustufen-Bild gespeichert ist[1]. Die MNIST-Datenbank besteht aus 60.000 Beispielen im Trainingsdatensatz und 10.000 Beispielen im Testdatensatz. Der Datensatz dient dem Trainieren von Klassifikatoren, unter anderem Convolutional Neural Networks, im weiteren Sinne dem Maschinellen Lernen bzw. der Künstlichen Intelligenz.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
-rw-r--r--. 1 chris users  7840016  6. Okt 20:28 t10k-images-idx3-ubyte&lt;br /&gt;
-rw-r--r--. 1 chris users  1648877  6. Okt 20:28 t10k-images-idx3-ubyte.gz&lt;br /&gt;
-rw-r--r--. 1 chris users    10008  6. Okt 20:28 t10k-labels-idx1-ubyte&lt;br /&gt;
-rw-r--r--. 1 chris users     4542  6. Okt 20:28 t10k-labels-idx1-ubyte.gz&lt;br /&gt;
-rw-r--r--. 1 chris users 47040016  6. Okt 20:28 train-images-idx3-ubyte&lt;br /&gt;
-rw-r--r--. 1 chris users  9912422  6. Okt 20:28 train-images-idx3-ubyte.gz&lt;br /&gt;
-rw-r--r--. 1 chris users    60008  6. Okt 20:28 train-labels-idx1-ubyte&lt;br /&gt;
-rw-r--r--. 1 chris users    28881  6. Okt 20:28 train-labels-idx1-ubyte.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die .gz sind immer die gezippte Variante. &lt;br /&gt;
IDX ist ein einfaches binaeres Format für mehrdimensionale Datenfelder, also Arrays oder Tensoren. &lt;br /&gt;
Der Dateiname beschreibt den Inhalt:&lt;br /&gt;
Bestandteil	Bedeutung&lt;br /&gt;
*idx1	Eindimensionales Datenfeld, beispielsweise eine Liste von Ziffernlabels&lt;br /&gt;
*idx3	Dreidimensionales Datenfeld, beispielsweise viele zweidimensionale Bilder&lt;br /&gt;
*ubyte	Vorzeichenlose 8-Bit-Zahl: Werte von 0 bis 255, jeweils ein Byte&lt;br /&gt;
&lt;br /&gt;
Bei MNIST sieht das konkret so aus:&lt;br /&gt;
- train-images.idx3-ubyte enthält die Bilddaten mit der Form 60.000 × 28 × 28: Anzahl der Bilder × Höhe × Breite. Jeder Pixel hat einen Grauwert von 0 bis 255.&lt;br /&gt;
- train-labels.idx1-ubyte enthält 60.000 Zahlen von 0 bis 9. Jede Zahl sagt, welche Ziffer auf dem zugehörigen Bild steht.&lt;br /&gt;
Bild und Label sind über ihre Position zugeordnet: Zum ersten Bild gehört das erste Label, zum zweiten Bild das zweite Label usw.&lt;br /&gt;
Am Dateianfang steht außerdem ein kleiner Header, der Datentyp, Anzahl der Dimensionen und deren Größen angibt. Danach folgen die eigentlichen Daten. Deshalb sind die Dateien in einem Texteditor nicht sinnvoll lesbar.&lt;br /&gt;
&lt;br /&gt;
Mit dem IDX_Viewer kann man einen Blick in die Dateien werfen.&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot_idx_viewer.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;IDX/MNIST-Viewer. Start: python3 idx_viewer.py [bilder [labels]]&lt;br /&gt;
Nur Python-Standardbibliothek und Tkinter nötig. Unterstützt auch .gz.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
import gzip&lt;br /&gt;
import math&lt;br /&gt;
import struct&lt;br /&gt;
import sys&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import tkinter as tk&lt;br /&gt;
from tkinter import ttk, filedialog, messagebox&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def read_idx(path):&lt;br /&gt;
    opener = gzip.open if str(path).lower().endswith(&#039;.gz&#039;) else open&lt;br /&gt;
    with opener(path, &#039;rb&#039;) as f:&lt;br /&gt;
        header = f.read(4)&lt;br /&gt;
        if len(header) != 4 or header[:2] != b&#039;\0\0&#039; or header[2] != 8:&lt;br /&gt;
            raise ValueError(&#039;Keine IDX-Datei mit unsigned-byte-Daten.&#039;)&lt;br /&gt;
        dimensions = header[3]&lt;br /&gt;
        if dimensions not in (1, 3):&lt;br /&gt;
            raise ValueError(&#039;Unterstützt werden IDX1-Labels und IDX3-Bilder.&#039;)&lt;br /&gt;
        sizes = f.read(dimensions * 4)&lt;br /&gt;
        if len(sizes) != dimensions * 4:&lt;br /&gt;
            raise ValueError(&#039;Unvollständiger Header.&#039;)&lt;br /&gt;
        shape = struct.unpack(&#039;&amp;gt;&#039; + &#039;I&#039; * dimensions, sizes)&lt;br /&gt;
        if not all(shape):&lt;br /&gt;
            raise ValueError(&#039;Die Datei enthält eine leere Dimension.&#039;)&lt;br /&gt;
        data = f.read()&lt;br /&gt;
    if len(data) != math.prod(shape):&lt;br /&gt;
        raise ValueError(f&#039;Datenlänge stimmt nicht: {len(data)} statt {math.prod(shape)} Bytes.&#039;)&lt;br /&gt;
    return shape, data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Viewer:&lt;br /&gt;
    def __init__(self, root):&lt;br /&gt;
        self.root = root&lt;br /&gt;
        self.images = None&lt;br /&gt;
        self.labels = None&lt;br /&gt;
        self.index = 0&lt;br /&gt;
        root.title(&#039;IDX / MNIST Viewer&#039;)&lt;br /&gt;
        root.geometry(&#039;650x610&#039;)&lt;br /&gt;
        toolbar = ttk.Frame(root, padding=10)&lt;br /&gt;
        toolbar.pack(fill=&#039;x&#039;)&lt;br /&gt;
        ttk.Button(toolbar, text=&#039;Bilder öffnen …&#039;, command=self.open_images).pack(side=&#039;left&#039;)&lt;br /&gt;
        ttk.Button(toolbar, text=&#039;Labels öffnen …&#039;, command=self.open_labels).pack(side=&#039;left&#039;, padx=8)&lt;br /&gt;
        self.info = ttk.Label(root, text=&#039;Bitte eine idx3-ubyte-Datei öffnen.&#039;, wraplength=620)&lt;br /&gt;
        self.info.pack(padx=10, pady=5)&lt;br /&gt;
        self.canvas = tk.Canvas(root, background=&#039;#242424&#039;, highlightthickness=0)&lt;br /&gt;
        self.canvas.pack(fill=&#039;both&#039;, expand=True, padx=10, pady=10)&lt;br /&gt;
        self.canvas.bind(&#039;&amp;lt;Configure&amp;gt;&#039;, lambda e: self.render())&lt;br /&gt;
        nav = ttk.Frame(root, padding=10)&lt;br /&gt;
        nav.pack(fill=&#039;x&#039;)&lt;br /&gt;
        ttk.Button(nav, text=&#039;◀ Zurück&#039;, command=lambda: self.move(-1)).pack(side=&#039;left&#039;)&lt;br /&gt;
        ttk.Button(nav, text=&#039;Weiter ▶&#039;, command=lambda: self.move(1)).pack(side=&#039;left&#039;, padx=6)&lt;br /&gt;
        ttk.Label(nav, text=&#039;Bildnummer:&#039;).pack(side=&#039;left&#039;, padx=(12, 3))&lt;br /&gt;
        self.number = tk.StringVar(value=&#039;1&#039;)&lt;br /&gt;
        entry = ttk.Entry(nav, textvariable=self.number, width=9)&lt;br /&gt;
        entry.pack(side=&#039;left&#039;)&lt;br /&gt;
        entry.bind(&#039;&amp;lt;Return&amp;gt;&#039;, lambda e: self.jump())&lt;br /&gt;
        ttk.Button(nav, text=&#039;Gehe zu&#039;, command=self.jump).pack(side=&#039;left&#039;, padx=6)&lt;br /&gt;
        self.status = ttk.Label(root, text=&#039;Pfeiltasten: blättern · Bildnummern beginnen bei 1&#039;)&lt;br /&gt;
        self.status.pack(pady=(0, 10))&lt;br /&gt;
        root.bind(&#039;&amp;lt;Left&amp;gt;&#039;, lambda e: self.move(-1))&lt;br /&gt;
        root.bind(&#039;&amp;lt;Right&amp;gt;&#039;, lambda e: self.move(1))&lt;br /&gt;
&lt;br /&gt;
    def choose(self, title):&lt;br /&gt;
        return filedialog.askopenfilename(title=title, filetypes=[(&#039;Alle Dateien&#039;, &#039;*&#039;)])&lt;br /&gt;
&lt;br /&gt;
    def open_images(self, path=None):&lt;br /&gt;
        path = path or self.choose(&#039;IDX3-Bilddatei auswählen&#039;)&lt;br /&gt;
        if not path:&lt;br /&gt;
            return&lt;br /&gt;
        try:&lt;br /&gt;
            shape, data = read_idx(path)&lt;br /&gt;
            if len(shape) != 3:&lt;br /&gt;
                raise ValueError(&#039;Bitte eine IDX3-Bilddatei auswählen.&#039;)&lt;br /&gt;
            self.shape, self.images, self.path = shape, data, path&lt;br /&gt;
            self.labels = None&lt;br /&gt;
            self.index = 0&lt;br /&gt;
            self.render()&lt;br /&gt;
            # Die übliche MNIST-Labeldatei automatisch finden.&lt;br /&gt;
            candidate = Path(path).with_name(Path(path).name.replace(&#039;images&#039;, &#039;labels&#039;).replace(&#039;idx3&#039;, &#039;idx1&#039;))&lt;br /&gt;
            if candidate != Path(path) and candidate.is_file():&lt;br /&gt;
                self.open_labels(str(candidate))&lt;br /&gt;
        except (OSError, ValueError, EOFError) as exc:&lt;br /&gt;
            messagebox.showerror(&#039;Datei kann nicht geöffnet werden&#039;, str(exc))&lt;br /&gt;
&lt;br /&gt;
    def open_labels(self, path=None):&lt;br /&gt;
        if self.images is None:&lt;br /&gt;
            messagebox.showinfo(&#039;Bilder fehlen&#039;, &#039;Bitte zuerst die Bilddatei öffnen.&#039;)&lt;br /&gt;
            return&lt;br /&gt;
        path = path or self.choose(&#039;IDX1-Labeldatei auswählen&#039;)&lt;br /&gt;
        if not path:&lt;br /&gt;
            return&lt;br /&gt;
        try:&lt;br /&gt;
            shape, data = read_idx(path)&lt;br /&gt;
            if len(shape) != 1 or shape[0] != self.shape[0]:&lt;br /&gt;
                raise ValueError(&#039;Die Labeldatei muss eindimensional sein und gleich viele Einträge wie die Bilddatei enthalten.&#039;)&lt;br /&gt;
            self.labels = data&lt;br /&gt;
            self.render()&lt;br /&gt;
        except (OSError, ValueError, EOFError) as exc:&lt;br /&gt;
            messagebox.showerror(&#039;Labels können nicht geöffnet werden&#039;, str(exc))&lt;br /&gt;
&lt;br /&gt;
    def move(self, offset):&lt;br /&gt;
        if self.images is not None:&lt;br /&gt;
            self.index = min(max(0, self.index + offset), self.shape[0] - 1)&lt;br /&gt;
            self.render()&lt;br /&gt;
&lt;br /&gt;
    def jump(self):&lt;br /&gt;
        if self.images is None:&lt;br /&gt;
            return&lt;br /&gt;
        try:&lt;br /&gt;
            number = int(self.number.get())&lt;br /&gt;
            if not 1 &amp;lt;= number &amp;lt;= self.shape[0]:&lt;br /&gt;
                raise ValueError&lt;br /&gt;
            self.index = number - 1&lt;br /&gt;
            self.render()&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            messagebox.showerror(&#039;Ungültige Bildnummer&#039;, f&#039;Bitte eine Zahl von 1 bis {self.shape[0]} eingeben.&#039;)&lt;br /&gt;
&lt;br /&gt;
    def render(self):&lt;br /&gt;
        if self.images is None:&lt;br /&gt;
            return&lt;br /&gt;
        count, height, width = self.shape&lt;br /&gt;
        self.number.set(str(self.index + 1))&lt;br /&gt;
        label = str(self.labels[self.index]) if self.labels is not None else &#039;nicht geladen&#039;&lt;br /&gt;
        self.info.config(text=f&#039;{Path(self.path).name}\n{count:,} Bilder · {width} × {height} Pixel · Label: {label}&#039;)&lt;br /&gt;
        start = self.index * width * height&lt;br /&gt;
        pixels = self.images[start:start + width * height]&lt;br /&gt;
        # Pixel direkt setzen: funktioniert auch ohne PGM-Unterstützung.&lt;br /&gt;
        original = tk.PhotoImage(width=width, height=height)&lt;br /&gt;
        palette = [f&#039;#{v:02x}{v:02x}{v:02x}&#039; for v in range(256)]&lt;br /&gt;
        rows = [&#039;{&#039; + &#039; &#039;.join(palette[v] for v in pixels[y * width:(y + 1) * width]) + &#039;}&#039;&lt;br /&gt;
                for y in range(height)]&lt;br /&gt;
        original.put(&#039; &#039;.join(rows))&lt;br /&gt;
        cw, ch = self.canvas.winfo_width(), self.canvas.winfo_height()&lt;br /&gt;
        scale = max(1, min(max(1, cw - 20) // width, max(1, ch - 20) // height))&lt;br /&gt;
        self.photo = original.zoom(scale, scale)&lt;br /&gt;
        self.canvas.delete(&#039;all&#039;)&lt;br /&gt;
        self.canvas.create_image(cw // 2, ch // 2, image=self.photo, anchor=&#039;center&#039;)&lt;br /&gt;
        self.status.config(text=f&#039;Bild {self.index + 1} / {count} · Vergrößerung {scale}× · ← / → zum Blättern&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    root = tk.Tk()&lt;br /&gt;
    viewer = Viewer(root)&lt;br /&gt;
    if len(sys.argv) &amp;gt; 1:&lt;br /&gt;
        viewer.open_images(sys.argv[1])&lt;br /&gt;
    if len(sys.argv) &amp;gt; 2:&lt;br /&gt;
        viewer.open_labels(sys.argv[2])&lt;br /&gt;
    root.mainloop()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Konzentrat===&lt;br /&gt;
&lt;br /&gt;
====Lernziele:====&lt;br /&gt;
*Klassifikationsaufgabe formulieren&lt;br /&gt;
*Tensorformen erklären&lt;br /&gt;
*einen Datenfluss implementieren&lt;br /&gt;
*Gradienten und Training nachvollziehen&lt;br /&gt;
*geeignete Metriken berechnen sowie ein Modell speichern und für neue Eingaben benutzen&lt;br /&gt;
*außerdem Datenleckage, Überanpassung und irreführende Aussagen über Modellwahrscheinlichkeiten erkennen.&lt;br /&gt;
&lt;br /&gt;
===Baseline:===&lt;br /&gt;
Eine Baseline ist ein einfacher Referenzwert oder eine Ausgangslösung, mit der du spätere Ergebnisse vergleichst.&lt;br /&gt;
&lt;br /&gt;
Beim Trainieren eines KI-Modells für die MNIST-Ziffernerkennung könnten Baselines sein:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Baseline !! Zweck &lt;br /&gt;
|-&lt;br /&gt;
| Zufällig eine Ziffer von 0 bis 9 wählen || Im Durchschnitt etwa **10 % Trefferquote** &lt;br /&gt;
|-&lt;br /&gt;
| Immer die häufigste Ziffer vorhersagen || Zeigt, was ohne Auswertung der Bilder erreichbar ist &lt;br /&gt;
|-&lt;br /&gt;
| Ein einfaches Modell trainieren || Liefert einen praktischen Vergleich für komplexere Modelle &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Beispiel: Dein einfaches Modell erreicht 92 % richtige Zuordnungen. Diese 92 % dienen als Baseline. Ein aufwendigeres Modell erreicht anschließend 97 % — eine Verbesserung um 5 Prozentpunkte.&lt;br /&gt;
&lt;br /&gt;
Die Baseline hilft also bei der Frage: Bringt meine neue Methode tatsächlich einen Vorteil? Dafür müssen beide Modelle mit denselben Testdaten bewertet werden.&lt;br /&gt;
&lt;br /&gt;
====CheckEnviroment====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def check_environment():&lt;br /&gt;
    print(&#039;Python:&#039;, sys.version)&lt;br /&gt;
    print(&#039;Python:&#039;, sys.version.split()[0])&lt;br /&gt;
    print(&#039;Python-Interpreter:&#039;, sys.executable)&lt;br /&gt;
    print(&#039;Virtuelle Umgebung aktiv:&#039;, sys.prefix != sys.base_prefix)&lt;br /&gt;
    print(&#039;Umgebungspfad:&#039;, sys.prefix)&lt;br /&gt;
    try:&lt;br /&gt;
        import torch&lt;br /&gt;
    except ImportError:&lt;br /&gt;
        print(&#039;PyTorch: nicht installiert oder nicht importierbar.&#039;)&lt;br /&gt;
        return&lt;br /&gt;
    print(&#039;PyTorch:&#039;, torch.__version__)&lt;br /&gt;
    print(&#039;CUDA-Version des PyTorch-Builds:&#039;, torch.version.cuda)&lt;br /&gt;
    if torch.cuda.is_available():&lt;br /&gt;
        device = torch.device(&#039;cuda:0&#039;)&lt;br /&gt;
        print(&#039;Verfügbare CUDA-Geräte:&#039;, torch.cuda.device_count())&lt;br /&gt;
        for index in range(torch.cuda.device_count()):&lt;br /&gt;
            print(f&#039;  cuda:{index}:&#039;, torch.cuda.get_device_name(index))&lt;br /&gt;
    elif hasattr(torch.backends, &#039;mps&#039;) and torch.backends.mps.is_available():&lt;br /&gt;
        device = torch.device(&#039;mps&#039;) # MPS Backend (Metal Performance Shaders) Apple Silicon GPU&lt;br /&gt;
    else:&lt;br /&gt;
        device = torch.device(&#039;cpu&#039;)&lt;br /&gt;
    print(&#039;Gewähltes Gerät:&#039;, device)&lt;br /&gt;
    # Kleine Rechenprobe auf dem ausgewählten Gerät.&lt;br /&gt;
    result = (torch.tensor([1.0, 2.0], device=device) * 2).cpu().tolist()&lt;br /&gt;
    print(&#039;PyTorch-Rechenprobe:&#039;, result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    check_environment()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
.cpu().tolist() wandelt einen PyTorch-Tensor in eine normale Python-Liste um. Das passiert in zwei Schritten:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Aufruf!!Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|.cpu()||	Überträgt den Tensor in den Arbeitsspeicher der CPU, falls er auf der GPU liegt. Liegt er bereits auf der CPU, bleibt er dort.&lt;br /&gt;
|-&lt;br /&gt;
|.tolist()||	Wandelt die Tensorwerte in Python-Zahlen und eine Python-Liste um. Bei mehrdimensionalen Tensoren entstehen verschachtelte Listen.&lt;br /&gt;
|}&lt;br /&gt;
Das Ergebnis enthält dieselben Zahlen, ist aber kein Tensor mehr.&lt;br /&gt;
Übrigens: .tolist() überträgt einen GPU-Tensor automatisch zur CPU. Hier würde deshalb auch allein .tolist() genügen; .cpu() macht den Transfer nur ausdrücklich sichtbar.&lt;br /&gt;
&lt;br /&gt;
====Vokabel====&lt;br /&gt;
*&#039;&#039;&#039;Zielklasse&#039;&#039;&#039;:&lt;br /&gt;
*&#039;&#039;&#039;Trainingsphase&#039;&#039;&#039;:&lt;br /&gt;
*&#039;&#039;&#039;Infernezphase&#039;&#039;&#039;:&lt;br /&gt;
*&#039;&#039;&#039;Qualitaetsmasz&#039;&#039;&#039;:&lt;br /&gt;
*&#039;&#039;&#039;Konfusionsmatrix&#039;&#039;&#039;: Eine Konfusionsmatrix (Confusion Matrix) zeigt, welche Klassen ein Klassifikationsmodell richtig erkennt und welche es miteinander verwechselt. Hauptdiagonale=richtige Klassifikation alle anderen Angaben sind Fehlklassifiaktionen. &lt;br /&gt;
*&#039;&#039;&#039;Accuracy&#039;&#039;&#039;: Die Accuracy (Trefferquote) gibt an, welcher Anteil aller Vorhersagen korrekt war. Bei einer Konfusionsmatrix kannst du die Accuracy ebenfalls direkt bestimmen:&lt;br /&gt;
&amp;lt;math&amp;gt;Accuracy=\frac{Summe der Hauptdiagonale}{Summe aller Eintraege}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merke:  &lt;br /&gt;
 Die Accuracy sagt: „Wie oft lag das Modell richtig?“&lt;br /&gt;
 Die Konfusionsmatrix sagt zusätzlich: „Was wurde womit verwechselt?“&lt;br /&gt;
*&#039;&#039;&#039;Mehrheitsklassen-Baseline&#039;&#039;&#039;:&lt;br /&gt;
*&#039;&#039;&#039;Taxonomie&#039;&#039;&#039;: Die Taxonomie ist nicht Bestandteil des neuronalen Netzes an sich. Sie beschreibt die fachliche Struktur der Klassen. Das neuronale Netz ist das Verfahren, mit dem die Zuordnung zu diesen Klassen gelernt werden kann.&lt;br /&gt;
&lt;br /&gt;
Merke:&lt;br /&gt;
 Taxonomie = Welche Klassen gibt es?&lt;br /&gt;
 Klassifikation = Zu welcher Klasse gehört eine Eingabe?&lt;br /&gt;
 Neuronales Netz = Wie kann diese Zuordnung aus Beispielen gelernt werden?&lt;br /&gt;
&lt;br /&gt;
====Ueberblick====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Begriff&lt;br /&gt;
!Bedeutung&lt;br /&gt;
!Beispiel Ziffernerkennung&lt;br /&gt;
|-&lt;br /&gt;
|Klasse&lt;br /&gt;
|Eine mögliche Kategorie&lt;br /&gt;
|„7“&lt;br /&gt;
|-&lt;br /&gt;
|Zielklasse&lt;br /&gt;
|Die Klasse, der ein konkretes Beispiel tatsächlich zugeordnet werden soll&lt;br /&gt;
|Das Bild zeigt tatsächlich eine 7&lt;br /&gt;
|-&lt;br /&gt;
|Label&lt;br /&gt;
|Technische Repräsentation der Zielklasse in den Daten&lt;br /&gt;
|`7`&lt;br /&gt;
|-&lt;br /&gt;
|Taxonomie&lt;br /&gt;
|Festgelegtes System aller Klassen und ggf. ihrer Beziehungen&lt;br /&gt;
|`{0,1,2,...,9}`&lt;br /&gt;
|-&lt;br /&gt;
|Klassifikation&lt;br /&gt;
|Die Aufgabe bzw. der Vorgang, eine Eingabe einer Klasse zuzuordnen&lt;br /&gt;
|Bild → „7“&lt;br /&gt;
|-&lt;br /&gt;
|Klassifikator&lt;br /&gt;
|Das System/Modell, das die Klassifikation durchführt&lt;br /&gt;
|neuronales Netz&lt;br /&gt;
|-&lt;br /&gt;
|Vorhersage / Prediction&lt;br /&gt;
|Die vom Modell bestimmte Klasse&lt;br /&gt;
|Modell sagt: „7“&lt;br /&gt;
|-&lt;br /&gt;
|Konfidenz / Score&lt;br /&gt;
|Wie stark das Modell eine Klasse bevorzugt&lt;br /&gt;
|„7“: 92 %&lt;br /&gt;
|-&lt;br /&gt;
|Ground Truth&lt;br /&gt;
|Die als korrekt angenommene Zuordnung&lt;br /&gt;
|tatsächliches Label = `7`&lt;br /&gt;
|-&lt;br /&gt;
|Accuracy&lt;br /&gt;
|Anteil aller korrekten Klassifikationen&lt;br /&gt;
|94 % richtig&lt;br /&gt;
|-&lt;br /&gt;
|Konfusionsmatrix&lt;br /&gt;
|Zeigt, welche Klassen miteinander verwechselt werden&lt;br /&gt;
|7 wird oft als 1 erkannt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Musterloesung====&lt;br /&gt;
&lt;br /&gt;
Ich fand die Aufgabenstellung im Skript suboptimal. Entweder man setzt einen engeren Rahmen der Erwartung, oder zerteilt sie in Teilaufgaben. Die Fragestellung ist didaktisch unklug.&lt;br /&gt;
&lt;br /&gt;
Zur Erinnerung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
try:&lt;br /&gt;
    # Code that may raise an exception&lt;br /&gt;
except:&lt;br /&gt;
    # Runs if an exception occurs&lt;br /&gt;
else:&lt;br /&gt;
    # Runs if no exception occurs&lt;br /&gt;
finally:&lt;br /&gt;
    # Always executed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Tensoren (Kapitel 2)==&lt;br /&gt;
&lt;br /&gt;
NCHW is an acronym describing the order of the axes in a tensor containing image data samples.&lt;br /&gt;
&lt;br /&gt;
N: Number of data samples.&lt;br /&gt;
&lt;br /&gt;
C: Image channels. A red-green-blue (RGB) image will have 3 channels.&lt;br /&gt;
&lt;br /&gt;
H: Image height.&lt;br /&gt;
&lt;br /&gt;
W: Image width.&lt;br /&gt;
&lt;br /&gt;
===Debuggen===&lt;br /&gt;
&lt;br /&gt;
 print(f&amp;quot;{x=}, type={type(x)}&amp;quot;) Das kommt dem Zweck von var_dump() wie in PHP schon recht nahe.&lt;br /&gt;
&lt;br /&gt;
Skript Seite 5:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import torch  # Importiert die Bibliothek PyTorch unter dem Namen &amp;quot;torch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
# 1. Einen Batch (Charge/Stapel) mit vier zufälligen Bildern erzeugen&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# Erzeugt einen Tensor mit Zufallszahlen zwischen 0 und 1. [0,1) (0 inclusive, 1 exclusive)&lt;br /&gt;
# Die Dimensionen bedeuten:&lt;br /&gt;
# 4  = Anzahl der Bilder im Batch&lt;br /&gt;
# 1  = Anzahl der Kanäle (Graustufenbild)&lt;br /&gt;
# 28 = Höhe des Bildes&lt;br /&gt;
# 28 = Breite des Bildes&lt;br /&gt;
# Der Tensor hat also 4 x 1 x 28 x 28 = 3136 Elemente bzw. Postionen.&lt;br /&gt;
# Die einzelnen Elemente (Spalten) und Zeilen werden jeweils durch Komma getrennt.&lt;br /&gt;
# Die Tensorausgabe liest man am besten rueckwaerts. Die innerste eckige Klammer ist die Representation des letzten Parameters im tensor-Befehl, usw. &lt;br /&gt;
# Tensoren werden hier als eine verschachtelte Liste gefuehrt.    &lt;br /&gt;
x = torch.rand(4, 1, 28, 28)&lt;br /&gt;
&lt;br /&gt;
# Gibt den kompletten Tensor sowie seinen Python-Typ aus.&lt;br /&gt;
print(f&amp;quot;{x=}, type={type(x)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Für Tensoren sind zusätzlich Shape, Datentyp und Gerät interessant.&lt;br /&gt;
print(f&amp;quot;{x.shape=}, type={type(x.shape)}&amp;quot;)  # Form/Dimensionen&lt;br /&gt;
print(f&amp;quot;{x.ndim=}, type={type(x.ndim)}&amp;quot;)   # Anzahl der Dimensionen&lt;br /&gt;
print(f&amp;quot;{x.numel()=}, type={type(x.numel())}&amp;quot;) # Anzahl aller Elemente&lt;br /&gt;
print(f&amp;quot;{x.dtype=}, type={type(x.dtype)}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{x.device=}, type={type(x.device)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
# 2. Die zugehörigen Zielklassen erzeugen&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# Für die vier Bilder werden vier Zielklassen angegeben.&lt;br /&gt;
# Bild 0 gehört zur Klasse 2.&lt;br /&gt;
# Bild 1 gehört zur Klasse 7.&lt;br /&gt;
# Bild 2 gehört zur Klasse 0.&lt;br /&gt;
# Bild 3 gehört zur Klasse 9.&lt;br /&gt;
#&lt;br /&gt;
# dtype=torch.long erzeugt ganzzahlige 64-Bit-Werte.&lt;br /&gt;
# Dieser Datentyp wird z. B. von CrossEntropyLoss für Klassenlabels erwartet.&lt;br /&gt;
y = torch.tensor([2, 7, 0, 9], dtype=torch.long)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{y=}, type={type(y)}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{y.shape=}, type={type(y.shape)}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{y.dtype=}, type={type(y.dtype)}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{y.device=}, type={type(y.device)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
# 3. Überprüfen der Tensorformen&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# Prüft, ob x tatsächlich die erwartete Form besitzt.&lt;br /&gt;
# Falls die Bedingung falsch ist, wird ein AssertionError ausgelöst.&lt;br /&gt;
assert x.shape == (4, 1, 28, 28)&lt;br /&gt;
&lt;br /&gt;
# Wir geben die geprüfte Bedingung zusätzlich aus.&lt;br /&gt;
print(f&amp;quot;{x.shape == (4, 1, 28, 28)=}, type={type(x.shape == (4, 1, 28, 28))}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Prüft, ob y genau vier Zielklassen enthält.&lt;br /&gt;
assert y.shape == (4,)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{y.shape == (4,)=}, type={type(y.shape == (4,))}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
# 4. Bilder in Vektoren umwandeln&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# flatten(start_dim=1) lässt Dimension 0 unverändert.&lt;br /&gt;
#&lt;br /&gt;
# Vorher:&lt;br /&gt;
# (4, 1, 28, 28)&lt;br /&gt;
#&lt;br /&gt;
# Die Dimensionen ab Dimension 1 werden zusammengefasst:&lt;br /&gt;
#&lt;br /&gt;
# 1 * 28 * 28 = 784&lt;br /&gt;
#&lt;br /&gt;
# Ergebnis:&lt;br /&gt;
# (4, 784) Also 784 Werte in einer Zeile [x11, x12, x13, ....x1784] und das viermal.&lt;br /&gt;
#&lt;br /&gt;
# Wir haben danach also weiterhin vier Beispiele,&lt;br /&gt;
# aber jedes Bild wird als Vektor mit 784 Zahlen dargestellt.&lt;br /&gt;
flat = x.flatten(start_dim=1)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{flat=}, type={type(flat)}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{flat.shape=}, type={type(flat.shape)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Prüft die erwartete Form.&lt;br /&gt;
assert flat.shape == (4, 784)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{flat.shape == (4, 784)=}, type={type(flat.shape == (4, 784))}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
# 5. Ein einzelnes Bild aus dem Batch auswählen&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# x[0] wählt das erste Bild aus.&lt;br /&gt;
#&lt;br /&gt;
# x hatte die Form:&lt;br /&gt;
#&lt;br /&gt;
# (4, 1, 28, 28)&lt;br /&gt;
#  ^&lt;br /&gt;
#  diese Dimension wird durch [0] entfernt ????&lt;br /&gt;
# Was dieser Hinweis von ChatGPT zu bedeuten hat weisz ich nicht.&lt;br /&gt;
# Vielmehr wird mit single = x[0] der erste Eintrag des Tensors mit 784 Werten mit dem Shape (1,28,28) der Variablen single zugewiesen.&lt;br /&gt;
# besser erkennbar durch:&lt;br /&gt;
# first = x[0]&lt;br /&gt;
# second = x[1]&lt;br /&gt;
# third = x[2]&lt;br /&gt;
# fourth = x[3]&lt;br /&gt;
#&lt;br /&gt;
# Deshalb hat single nur noch:&lt;br /&gt;
#&lt;br /&gt;
# (1, 28, 28)&lt;br /&gt;
single = x[0]&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{single=}, type={type(single)}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{single.shape=}, type={type(single.shape)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Kontrolle:&lt;br /&gt;
assert single.shape == (1, 28, 28)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{single.shape == (1, 28, 28)=}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
# 6. Einen Batch erzeugen, der nur ein Bild enthält&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# x[0:1] ist ein sogenannter Slice.&lt;br /&gt;
#&lt;br /&gt;
# Im Gegensatz zu x[0] wird die erste Dimension NICHT entfernt.&lt;br /&gt;
#&lt;br /&gt;
# Aus&lt;br /&gt;
#&lt;br /&gt;
# (4, 1, 28, 28)&lt;br /&gt;
#&lt;br /&gt;
# wird deshalb:&lt;br /&gt;
#&lt;br /&gt;
# (1, 1, 28, 28)&lt;br /&gt;
#&lt;br /&gt;
# Das bedeutet:&lt;br /&gt;
# Wir haben weiterhin einen Batch, aber dieser enthält nur ein Bild.&lt;br /&gt;
# Slicing Syntax [Start:Stopp]. Der Start-Index ist dabei inklusive, der Stopp-Index exklusive (wird nicht mehr mitgezählt). Ein fehlender Start/Stopp-Wert bedeutet Anfang, bzw. Ende. &lt;br /&gt;
&lt;br /&gt;
batch_of_one = x[0:1]&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{batch_of_one=}, type={type(batch_of_one)}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{batch_of_one.shape=}, type={type(batch_of_one.shape)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Kontrolle:&lt;br /&gt;
assert batch_of_one.shape == (1, 1, 28, 28)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{batch_of_one.shape == (1, 1, 28, 28)=}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
# 7. Abschließende Zusammenfassung&lt;br /&gt;
# ------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;\n--- Zusammenfassung ---&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{x.shape=}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{y.shape=}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{flat.shape=}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{single.shape=}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{batch_of_one.shape=}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CrosEntropyLoss===&lt;br /&gt;
CrossEntropyLoss ist eine sehr haeufig verwendete &#039;&#039;&#039;Verlustfunktion (Loss Function) fuer Klassifikationsprobleme&#039;&#039;&#039; in PyTorch.&lt;br /&gt;
&lt;br /&gt;
Sie beantwortet während des Trainings im Wesentlichen die Frage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;„Wie stark weicht die Vorhersage des neuronalen Netzes von der richtigen Zielklasse ab?“&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Nehmen wir deinen Ziffernklassifikator. Die Taxonomie bzw. Klassenmenge besteht aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;0, 1, 2, 3, 4, 5, 6, 7, 8, 9&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Für ein Bild ist die Zielklasse beispielsweise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;y = 7&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das neuronale Netz liefert aber nicht einfach &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;, sondern zunächst &#039;&#039;&#039;10 Ausgabewerte&#039;&#039;&#039;, sogenannte &#039;&#039;&#039;Logits&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Klasse     Logit&lt;br /&gt;
  0         0.2&lt;br /&gt;
  1        -0.5&lt;br /&gt;
  2         0.8&lt;br /&gt;
  3         0.1&lt;br /&gt;
  4        -0.3&lt;br /&gt;
  5         0.4&lt;br /&gt;
  6         0.2&lt;br /&gt;
  7         3.8   ←&lt;br /&gt;
  8         0.5&lt;br /&gt;
  9         1.1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Je größer der Logit, desto stärker spricht das Modell für diese Klasse.&lt;br /&gt;
&lt;br /&gt;
==== Was macht CrossEntropyLoss daraus? ====&lt;br /&gt;
&lt;br /&gt;
Vereinfacht passieren zwei Dinge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{Logits}&lt;br /&gt;
\xrightarrow{\text{Softmax}}&lt;br /&gt;
\text{Wahrscheinlichkeiten}&lt;br /&gt;
\xrightarrow{\text{Vergleich mit Zielklasse}}&lt;br /&gt;
\text{Loss}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CrossEntropyLoss kombiniert diese Berechnungen intern. Deshalb solltest du vor CrossEntropyLoss normalerweise &#039;&#039;&#039;kein eigenes softmax()&#039;&#039;&#039; aufrufen.&lt;br /&gt;
&lt;br /&gt;
In PyTorch sieht das beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
&lt;br /&gt;
# Ausgabe des neuronalen Netzes:&lt;br /&gt;
# 4 Bilder und jeweils 10 Klassen&lt;br /&gt;
logits = torch.rand(4, 10)&lt;br /&gt;
&lt;br /&gt;
# Richtige Zielklassen der vier Bilder&lt;br /&gt;
y = torch.tensor([2, 7, 0, 9], dtype=torch.long)&lt;br /&gt;
&lt;br /&gt;
# Verlustfunktion erzeugen&lt;br /&gt;
loss_fn = nn.CrossEntropyLoss()&lt;br /&gt;
&lt;br /&gt;
# Verlust berechnen&lt;br /&gt;
loss = loss_fn(logits, y)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{logits.shape=}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{y.shape=}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{loss=}&amp;quot;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dabei ist entscheidend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;logits.shape = (4, 10)&lt;br /&gt;
                │   │&lt;br /&gt;
                │   └── 10 mögliche Klassen&lt;br /&gt;
                └────── 4 Bilder&lt;br /&gt;
&lt;br /&gt;
y.shape = (4,)&lt;br /&gt;
           │&lt;br /&gt;
           └── eine richtige Zielklasse pro Bild&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das passt genau zu deinem bisherigen Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Bild x[0] → Zielklasse 2&lt;br /&gt;
Bild x[1] → Zielklasse 7&lt;br /&gt;
Bild x[2] → Zielklasse 0&lt;br /&gt;
Bild x[3] → Zielklasse 9&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;warum-braucht-man-überhaupt-einen-loss&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Warum braucht man überhaupt einen Loss? ====&lt;br /&gt;
&lt;br /&gt;
Beim Training läuft vereinfacht diese Kette ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Trainingsbild&lt;br /&gt;
     ↓&lt;br /&gt;
Neuronales Netz&lt;br /&gt;
     ↓&lt;br /&gt;
Logits&lt;br /&gt;
     ↓&lt;br /&gt;
CrossEntropyLoss ← richtige Zielklasse&lt;br /&gt;
     ↓&lt;br /&gt;
Loss&lt;br /&gt;
     ↓&lt;br /&gt;
Backpropagation&lt;br /&gt;
     ↓&lt;br /&gt;
Gewichte des Netzes verändern&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein &#039;&#039;&#039;kleiner Loss&#039;&#039;&#039; bedeutet: Die Vorhersage passt gut zur Zielklasse.&lt;br /&gt;
&lt;br /&gt;
Ein &#039;&#039;&#039;großer Loss&#039;&#039;&#039; bedeutet: Die Vorhersage passt schlecht zur Zielklasse.&lt;br /&gt;
&lt;br /&gt;
Dabei berücksichtigt Cross Entropy nicht nur, ob die endgültige Klassifikation richtig oder falsch war, sondern auch, &#039;&#039;&#039;wie sicher das Modell dabei war&#039;&#039;&#039;. Eine selbstbewusste falsche Vorhersage wird stärker bestraft als eine unsichere falsche Vorhersage.&lt;br /&gt;
&lt;br /&gt;
Das ist auch der entscheidende Unterschied zur &#039;&#039;&#039;Accuracy&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{CrossEntropyLoss → zum Trainieren}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{Accuracy → zum Bewerten}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Accuracy ist nämlich nicht gut geeignet, um mittels Backpropagation die Gewichte eines neuronalen Netzes schrittweise zu verbessern.&lt;br /&gt;
&lt;br /&gt;
==Daten (Kapitel 3)==&lt;br /&gt;
Dataset: Ein Paar aus Eingabe und Ziel&lt;br /&gt;
DataLoader: bündelt Datasets zu Batches&lt;br /&gt;
&lt;br /&gt;
Aufteilen des Datenbestandes:&lt;br /&gt;
*Trainingsbestand (groeszter Anteil) bestimmt Parameter&lt;br /&gt;
*Validierungsbestand hilft bei Architektur, Lernrate und Epochenzahl&lt;br /&gt;
*Testbestand&lt;br /&gt;
&lt;br /&gt;
===TorchVsion===&lt;br /&gt;
Torchvision ist eine offizielle, spezialisierte Erweiterungs-Bibliothek für das Deep-Learning-Framework PyTorch, die speziell für Aufgaben im Bereich des maschinellen Sehens (Computer Vision) entwickelt wurde.&lt;br /&gt;
&lt;br /&gt;
Während PyTorch die grundlegenden mathematischen Funktionen und Tensoren bereitstellt, liefert Torchvision die passenden Werkzeuge, um direkt mit Bildern und Videos zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
====Kurzschreibweisen====&lt;br /&gt;
 from torch.utils.data import random_split, DataLoader&lt;br /&gt;
 import torch&lt;br /&gt;
&lt;br /&gt;
Dadurch lassen sich random_split und Dataloader direkt aufrufen.&lt;br /&gt;
&lt;br /&gt;
Die Funktion torch.utils.data.random_split wird in PyTorch verwendet, um einen Datensatz (ein Dataset-Objekt) zufällig in mehrere kleinere, sich nicht überschneidende Teildatensätze aufzuteilen.&lt;br /&gt;
&lt;br /&gt;
 torch.utils.data.random_split(dataset, lengths, generator=None)&lt;br /&gt;
&lt;br /&gt;
*dataset: Das ursprüngliche Datensatz-Objekt (z. B. geladen via torchvision.datasets).&lt;br /&gt;
*lengths: Eine Liste, die angibt, wie groß die einzelnen Teile sein sollen. Das können entweder absolute Zahlen (Anzahl der Bilder/Zeilen) oder Prozentwerte (als Float zwischen 0 und 1) sein.&lt;br /&gt;
*generator: Ein optionaler Zufallsgenerator (torch.Generator()). Extrem wichtig für die Reproduzierbarkeit deines Codes.&lt;br /&gt;
&lt;br /&gt;
Das Modul &#039;&#039;&#039;torchvision.datasets&#039;&#039;&#039; ist die eingebaute Schatzkiste von PyTorch für Bilddaten. Es enthält eine riesige Auswahl an vorgefertigten, populären Datensätzen für das maschinelle Sehen, die du mit nur einer Zeile Code herunterladen, formatieren und direkt in dein neuronale Netzwerk einspeisen kannst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf height=&amp;quot;300&amp;quot;&amp;gt;File:torchvision.datasets.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 assert x.shape[1:] == (1, 28, 28) , f&amp;quot;Falsche Shape: {x.shape}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort assert (englisch für „behaupten“ oder „versichern“) wird in Python verwendet, um Bedingungen im Code zu überprüfen. Es dient als internes Sicherheitsnetz während der Entwicklung.&lt;br /&gt;
&lt;br /&gt;
Einfacher empfinde sich das Schluesselwort &amp;quot;teste&amp;quot; fuer assert einzusetzen. Bei wahr geht&#039;s weiter und bei falsch wird die optionale (Fehler-)Meldung ausgegeben und der Programmablauf abgebrochen. &lt;br /&gt;
&lt;br /&gt;
Mit dem Aufruf &#039;&#039;&#039;python -O mein_skript.py&#039;&#039;&#039; ignoriert Python alle assert-Zeilen komplett. Das spart im fertigen Produkt Rechenzeit. Eine if-Abfrage hingegen wird immer ausgefuehrt, falls man auf die Idee kaeme die Kontrolle mit einer if-Abfrage zu realisieren.&lt;br /&gt;
&lt;br /&gt;
==Uebung 3==&lt;br /&gt;
===Aufgabe 1===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
    print(&amp;quot;--- 1. MNIST laden und 6 Bilder anzeigen ---&amp;quot;)&lt;br /&gt;
    # Transformation: PIL-Bild in Fließkomma-Tensor (0 bis 1) umwandeln&lt;br /&gt;
    transform = transforms.ToTensor()&lt;br /&gt;
&lt;br /&gt;
    # Gesamten Trainingsbestand laden (60.000 Beispiele)&lt;br /&gt;
    full_dataset = datasets.MNIST(&#039;data&#039;, train=True, download=True, transform=transform)&lt;br /&gt;
&lt;br /&gt;
    # 6 Beispielbilder plotten (optional, bricht das Skript nicht ab)&lt;br /&gt;
    fig, axes = plt.subplots(1, 6, figsize=(12, 3))&lt;br /&gt;
    for i in range(6):&lt;br /&gt;
        image, label = full_dataset[i]&lt;br /&gt;
        # squeeze() entfernt die Kanalachse (1, 28, 28) -&amp;gt; (28, 28) für imshow&lt;br /&gt;
        axes[i].imshow(image.squeeze(), cmap=&#039;gray&#039;, vmin=0, vmax=1)&lt;br /&gt;
        axes[i].set_title(f&amp;quot;Label: {label}&amp;quot;)&lt;br /&gt;
        axes[i].axis(&#039;off&#039;)&lt;br /&gt;
    plt.show(block=False) # block=False, damit das Skript weiterläuft&lt;br /&gt;
    plt.pause(2) # Zeigt das Bild für 2 Sekunden&lt;br /&gt;
    plt.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[File:Skript_PyTorch_Uebung3_Aufgabe1.png|400px]]&lt;br /&gt;
===Aufgabe 2===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
   print(&amp;quot;\n--- 2. Reproduzierbaren Daten-Split erstellen ---&amp;quot;)&lt;br /&gt;
    # Trennung in 55.000 Training und 5.000 Validierung mit festem Seed 2026&lt;br /&gt;
    train_set, valid_set = random_split(&lt;br /&gt;
        full_dataset,&lt;br /&gt;
        [55000, 5000],&lt;br /&gt;
        generator=torch.Generator().manual_seed(2026)&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    # Größen und Überschneidungsfreiheit durch Assertions prüfen&lt;br /&gt;
    assert len(train_set) == 55000&lt;br /&gt;
    assert len(valid_set) == 5000&lt;br /&gt;
    assert set(train_set.indices).isdisjoint(set(valid_set.indices))&lt;br /&gt;
    print(&amp;quot;✓ Größenprüfung erfolgreich.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;✓ Die Indizes der Teilmengen sind absolut überschneidungsfrei.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 3===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
    print(&amp;quot;\n--- 3. Klassenhäufigkeiten und Baseline bestimmen ---&amp;quot;)&lt;br /&gt;
    # Alle Labels aus dem Trainingsset extrahieren&lt;br /&gt;
    train_labels = [full_dataset[i][1] for i in train_set.indices]&lt;br /&gt;
    counts = Counter(train_labels)&lt;br /&gt;
    print(&amp;quot;Häufigkeiten im Training (Ziffer: Anzahl):&amp;quot;, dict(sorted(counts.items())))&lt;br /&gt;
&lt;br /&gt;
    # Häufigste Klasse ermitteln&lt;br /&gt;
    frequentest_class, freq_count = counts.most_common(1)[0]&lt;br /&gt;
    print(f&amp;quot;Die häufigste Ziffer im Trainingsset ist: &#039;{frequentest_class}&#039; (kommt {freq_count}x vor)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Baseline auf dem Validierungsset auswerten&lt;br /&gt;
    valid_labels = [full_dataset[i][1] for i in valid_set.indices]&lt;br /&gt;
    correct_predictions = sum(1 for label in valid_labels if label == frequentest_class)&lt;br /&gt;
    baseline_accuracy = correct_predictions / len(valid_set)&lt;br /&gt;
    print(f&amp;quot;Triviale Baseline-Accuracy auf der Validierung: {baseline_accuracy * 100:.2f}%&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aufgabe 4===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
   print(&amp;quot;\n--- 4. DataLoader &amp;amp; Shuffle-Vergleich ---&amp;quot;)&lt;br /&gt;
    # DataLoader aufbauen (Training MUSS gemischt werden, Validierung NICHT)&lt;br /&gt;
    train_loader = DataLoader(train_set, batch_size=64, shuffle=True, num_workers=0)&lt;br /&gt;
    valid_loader = DataLoader(valid_set, batch_size=64, shuffle=False, num_workers=0)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;Anzahl der Trainings-Batches (55000 / 64 ohne drop_last): {len(train_loader)}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Anzahl der Validierungs-Batches (5000 / 64 ohne drop_last): {len(valid_loader)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Wertebereich prüfen am ersten Batch&lt;br /&gt;
    x_batch, y_batch = next(iter(train_loader))&lt;br /&gt;
    assert x_batch.shape[1:] == (1, 28, 28)&lt;br /&gt;
    assert y_batch.dtype == torch.long&lt;br /&gt;
    assert 0 &amp;lt;= x_batch.min() and x_batch.max() &amp;lt;= 1&lt;br /&gt;
    print(&amp;quot;✓ Formen und Wertebereiche im ersten Batch erfolgreich validiert.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=Request for Comments=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Skript_PyTorch_Uebung3_Aufgabe1.png&amp;diff=5493</id>
		<title>Datei:Skript PyTorch Uebung3 Aufgabe1.png</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Skript_PyTorch_Uebung3_Aufgabe1.png&amp;diff=5493"/>
		<updated>2026-10-11T07:06:48Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=KI_Vokabel&amp;diff=5492</id>
		<title>KI Vokabel</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=KI_Vokabel&amp;diff=5492"/>
		<updated>2026-10-11T06:34:09Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* In Convolutional Neural Networks (Dilated Convolutions) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Maximal Arbitraer=&lt;br /&gt;
&lt;br /&gt;
In der Informatik und Mathematik hat das Konzept der maximalen Arbitrarität eine fundamentale, oft sehr technische Bedeutung. Hier geht es meist um echte Zufälligkeit oder das bewusste Ignorieren von Mustern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kryptographie-echte-zufallszahlen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Kryptographie &amp;amp;amp; Echte Zufallszahlen ==&lt;br /&gt;
&lt;br /&gt;
* Echter Zufall: Computer können von Natur aus nicht rein zufällig handeln. Sie sind deterministisch.&lt;br /&gt;
* Maximale Unvorhersehbarkeit: Für sichere Verschlüsselungen braucht man Schlüssel, die maximal arbiträr (unvorhersehbar) sind.&lt;br /&gt;
* Hardware-Zufall: Man nutzt physikalische Prozesse (wie atomaren Zerfall oder thermisches Rauschen), um diese absolute Willkür zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;algorithmen-arbitrary-choice&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Algorithmen &amp;amp;amp; „Arbitrary Choice“ ==&lt;br /&gt;
&lt;br /&gt;
* Reihenfolge ist egal: In der theoretischen Informatik bedeutet eine „arbiträre Auswahl“, dass ein Algorithmus irgendein Element wählt.&lt;br /&gt;
* Keine Bevorzugung: Es gibt keine Sortierung oder Priorität. Das Ergebnis des Algorithmus muss korrekt sein, egal welches Element zuerst gewählt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;beliebige-genauigkeit-arbitrary-precision&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Beliebige Genauigkeit (Arbitrary Precision) ==&lt;br /&gt;
&lt;br /&gt;
* Keine künstlichen Grenzen: Normalerweise speichert ein Computer Zahlen in festen Größen (z. B. 32-Bit oder 64-Bit).&lt;br /&gt;
* Unbegrenzte Kapazität: Bei Arbitrary-Precision-Arithmetik (BigInfs) entscheidet der Programmierer oder der Speicher dynamisch, wie groß eine Zahl sein darf. Die Grenze ist maximal flexibel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;software-testing-fuzzing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Software-Testing (Fuzzing) ==&lt;br /&gt;
&lt;br /&gt;
* Chaotische Eingaben: Beim sogenannten Fuzz-Testing wird Software mit maximal arbiträren, oft völlig sinnlosen Daten gefüttert.&lt;br /&gt;
* Sicherheitslücken finden: Das Ziel ist es, das Programm durch unvorhersehbare Eingaben zum Absturz zu bringen, um versteckte Bugs zu finden.&lt;br /&gt;
&lt;br /&gt;
Siehe auch Arbitrage. Beide Begriffe stammen vom lateinischen Substantiv arbiter (der Schiedsrichter, Richter oder Vermittler). Daraus bildete sich das lateinische Verb arbitrari (ermessen, entscheiden, glauben) und das Substantiv arbitratus („Gutdünken, freie Wahl, freies Ermessen“).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Zufallszahlen=&lt;br /&gt;
&lt;br /&gt;
 Computer koennen keine echten Zufallszahlen erzeugen.&lt;br /&gt;
&lt;br /&gt;
Ja, diese Aussage ist im Kern richtig, solange man von herkömmlichen Standard-Computern und reiner Software ausgeht. Standard-Computer sind deterministisch. Das bedeutet: Sie folgen strikten, logischen Regeln. Wenn ein Computer denselben Startwert (Seed) und denselben Algorithmus nutzt, wird er immer exakt dieselbe Zahlenfolge berechnen. In der Informatik unterscheidet man daher zwei Arten von Zufall: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pseudo-zufallszahlen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Pseudo-Zufallszahlen (PRNGs) – Kein echter Zufall ==&lt;br /&gt;
&lt;br /&gt;
* Die Methode: Reine Software-Algorithmen berechnen Zahlenreihen.&lt;br /&gt;
* Das Problem: Sie wirken für Menschen zufällig, sind es aber mathematisch nicht. Wer die Formel und den Startwert kennt, kann jede zukünftige Zahl perfekt vorhersagen.&lt;br /&gt;
* Einsatzbereich: Videospiele (z. B. Beute-Verteilung) oder statistische Simulationen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;echte-zufallszahlen-trngs-der-physikalische-trick&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Echte Zufallszahlen (TRNGs) – Der physikalische Trick ==&lt;br /&gt;
&lt;br /&gt;
Moderne Computer können heute über Umwege doch echten Zufall erzeugen. Dafür verlassen sie die reine Software-Ebene und nutzen die chaotische Physik der echten Welt:&lt;br /&gt;
&lt;br /&gt;
* Hardware-Zufallsgeneratoren: Speziell verbaute Chips messen winzige, unvorhersehbare physikalische Prozesse.&lt;br /&gt;
* Beispiele: Thermisches Rauschen (Wärme von Elektronen), atmosphärisches Rauschen, radioaktiver Zerfall oder das unregelmäßige Tippverhalten eines Nutzers auf der Tastatur, oder Mausbewegungen.&lt;br /&gt;
* Einsatzbereich: Hochsichere Verschlüsselungen (Kryptographie) und Banken-IT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fazit&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Ein Computer kann durch reines Nachdenken (Software) niemals echten Zufall erzeugen. Er benötigt dafür immer ein Stück unberechenbare Natur (Hardware). Möchtest du wissen, wie du in einer Programmiersprache wie Python oder JavaScript den Unterschied zwischen sicherem und unsicherem Zufall nutzt?&lt;br /&gt;
&lt;br /&gt;
=Regression=&lt;br /&gt;
In der Künstlichen Intelligenz (KI) und im &#039;&#039;&#039;Maschinellen Lernen&#039;&#039;&#039; ist Regression ein Verfahren, um eine kontinuierliche Zahl vorherzusagen. Das Ziel ist es, den mathematischen Zusammenhang zwischen Eingabedaten (z. B. Größe eines Hauses) und einem konkreten numerischen Ausgabewert (z. B. dem Preis) zu finden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;der-unterschied-regression-vs.-klassifikation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Der Unterschied: Regression vs. Klassifikation ==&lt;br /&gt;
&lt;br /&gt;
Um Regression zu verstehen, hilft der Vergleich mit der Klassifikation:&lt;br /&gt;
&lt;br /&gt;
* Klassifikation (Kategorien): „Ist diese Einnahme Betrug oder legal?“ oder „Ist auf dem Bild eine Katze oder ein Hund?“ (Ja/Nein oder Klassen).&lt;br /&gt;
* Regression (Zahlen): „Wie viel Euro wird dieses Haus kosten?“ oder „Wie hoch wird die Temperatur morgen sein?“ (Konkrete Zahlenwerte).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;typische-beispiele-aus-der-praxis&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Typische Beispiele aus der Praxis ==&lt;br /&gt;
&lt;br /&gt;
* Finanzen: Vorhersage des zukünftigen Preises einer Aktie.&lt;br /&gt;
* Immobilien: Schätzung des Marktwerts eines Hauses basierend auf Quadratmetern, Lage und Baujahr.&lt;br /&gt;
* Wetter: Berechnung der exakten Regenmenge in Millimetern für die nächste Woche.&lt;br /&gt;
* Logistik: Schätzung der genauen Lieferzeit (ETA) für ein Paket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wie-funktioniert-das-einfach-erklärt&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wie funktioniert das einfach erklärt? ==&lt;br /&gt;
&lt;br /&gt;
Stell dir eine Grafik mit vielen Punkten vor. Jeder Punkt ist ein Haus: Die X-Achse zeigt die Quadratmeter, die Y-Achse den Preis. Die einfachste Form der Regression (die lineare Regression) legt nun eine optimale gerade Linie so durch diese Punkte, dass der Abstand zu allen Punkten insgesamt so klein wie möglich ist. Wenn du nun ein neues Haus mit einer unbekannten Größe hast, schaut die KI einfach, wo dieser Wert auf der gezeichneten Linie liegt, und spuckt den passenden Preis aus. Möchtest du ein einfaches Code-Beispiel für eine Regression in Python sehen oder wissen, was der Unterschied zwischen linearer und nicht-linearer Regression ist?&lt;br /&gt;
&lt;br /&gt;
=Over-/Underfitting=&lt;br /&gt;
In der Künstlichen Intelligenz beschreiben Overfitting (Überanpassung) und Underfitting (Unteranpassung) die beiden Hauptfehler, die ein KI-Modell beim Lernen machen kann. Das Ziel ist immer die Generalisierung: Die KI soll Muster so lernen, dass sie auch bei völlig neuen, unbekannten Daten richtige Vorhersagen trifft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;overfitting-überanpassung-das-auswendiglernen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Overfitting (Überanpassung) – Das Auswendiglernen ==&lt;br /&gt;
&lt;br /&gt;
Beim Overfitting lernt die KI die Trainingsdaten zu gut. Sie merkt sich nicht nur die echten Regeln, sondern auch das zufällige Rauschen und Details der Beispiele.&lt;br /&gt;
&lt;br /&gt;
* Das Problem: Das Modell verhält sich wie ein Schüler, der die Übungsaufgaben für die Klassenarbeit exakt auswendig lernt, aber das zugrunde liegende Prinzip nicht versteht.&lt;br /&gt;
* Der Effekt: Bei den bekannten Trainingsdaten ist die Genauigkeit perfekt (fast 100 %). Sobald die KI aber neue, unbekannte Daten sieht, versagt sie völlig.&lt;br /&gt;
* Ursache: Das KI-Modell ist zu komplex für die kleine Menge an Daten, oder es wurde zu lange trainiert.&lt;br /&gt;
&lt;br /&gt;
* Modell lernt die Analyse der Trainingsdaten auswendig.&lt;br /&gt;
* Einmodellierung von Rauschfaktoren&lt;br /&gt;
* Neue Daten ohne Rauschen passen nicht ins Modell&lt;br /&gt;
* Mangelnde Generalisierbarkeit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;underfitting-unteranpassung-das-übergeneralisieren&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. Underfitting (Unteranpassung) – Das Übergeneralisieren ==&lt;br /&gt;
&lt;br /&gt;
Beim Underfitting ist das Modell zu einfach gebaut. Es schafft es nicht einmal, die Struktur der Trainingsdaten richtig zu erfassen.&lt;br /&gt;
&lt;br /&gt;
* Das Problem: Der Schüler ist zu faul oder das Thema ist zu schwer. Er versteht weder die Übungsaufgaben noch die echten Prinzipien.&lt;br /&gt;
* Der Effekt: Die Genauigkeit ist sowohl bei den Trainingsdaten als auch bei neuen Daten sehr schlecht.&lt;br /&gt;
* Ursache: Das Modell ist zu simpel (z. B. eine gerade Linie für ein kurviges Problem) oder es wurde zu kurz trainiert.&lt;br /&gt;
* Das Modell konnte keinen Zusammenhang zwischen den Ein- und Ausgabedaten erkennen.&lt;br /&gt;
* Vorhersagen höchst ungenau&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;der-visuelle-vergleich-am-beispiel-einer-hauspreis-regression&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Der visuelle Vergleich (am Beispiel einer Hauspreis-Regression) ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Underfitting (Zu einfach)&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Sweet Spot (Perfekt)&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Overfitting (Zu komplex)&lt;br /&gt;
|-&lt;br /&gt;
| Eine starre, gerade Linie durch eine wellige Punktewolke.&lt;br /&gt;
| Eine sanfte Kurve, die den echten Trend der Punkte abbildet.&lt;br /&gt;
| Eine wilde Schlangenlinie, die exakt durch jeden einzelnen Punkt zackt.&lt;br /&gt;
|-&lt;br /&gt;
| KI versteht den Trend nicht.&lt;br /&gt;
| KI versteht das Prinzip.&lt;br /&gt;
| KI lernt Fehler und Zufälle mit.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wie-löst-man-das&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wie löst man das? ==&lt;br /&gt;
&lt;br /&gt;
* Gegen Overfitting: Mehr Trainingsdaten hinzufügen, das Modell vereinfachen (weniger Parameter) oder das Training früher abbrechen (Early Stopping).&lt;br /&gt;
* Gegen Underfitting: Ein komplexeres Modell wählen, dem Modell mehr Merkmale (Features) der Daten zur Verfügung stellen oder länger trainieren.&lt;br /&gt;
&lt;br /&gt;
=Regularisierung=&lt;br /&gt;
In der Praxis ist Regularisierung die wichtigste Bremse gegen Overfitting. Sie sorgt dafür, dass ein KI-Modell beim Lernen „bestraft“ wird, wenn es zu komplex, zu flexibel oder zu wild wird. Das Ziel ist es, die Kurve oder die mathematische Formel des Modells bewusst flacher und einfacher zu halten, damit sie sich nicht an jeden einzelnen Datenpunkt klammert. Hier sind die drei bekanntesten Methoden der Regularisierung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;l2-regularisierung-ridge-regression-die-gewichtsbremse&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. L2-Regularisierung (Ridge Regression) – Die Gewichtsbremse ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Jedes Mal, wenn die KI ein Merkmal (z. B. die Anzahl der Badezimmer) extrem stark gewichtet, verhängt die Regularisierung eine mathematische Strafe. Sie zwingt das Modell, alle Gewichte möglichst klein und nah an Null zu halten.&lt;br /&gt;
* Der Effekt: Keine einzelne Eigenschaft darf das gesamte Modell dominieren. Die Vorhersage-Kurve wird dadurch weicher und stabiler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;l1-regularisierung-lasso-die-radikalkur&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. L1-Regularisierung (Lasso) – Die Radikalkur ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Auch hier werden große Gewichte bestraft, aber L1 ist aggressiver als L2. Wenn ein Merkmal für die Vorhersage nicht wirklich wichtig ist, drückt L1 das Gewicht dieses Merkmals exakt auf Null.&lt;br /&gt;
* Der Effekt: Unwichtige Eigenschaften werden komplett aussortiert. Das Modell wird schlanker und nutzt am Ende nur noch die Variablen, die wirklich einen Unterschied machen (Feature Selection).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dropout-der-trick-für-neuronale-netze&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Dropout – Der Trick für Neuronale Netze ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Beim Training von tiefen Neuronalen Netzen schaltet man in jedem Durchgang zufällig (z. B. zu 50 %) einen Teil der künstlichen Neuronen ab.&lt;br /&gt;
* Der Effekt: Die Neuronen dürfen sich nicht mehr aufeinander verlassen. Sie können sich keine „Geheimabsprachen“ merken, um bestimmte Trainingsdaten auswendig zu lernen. Jedes Neuron muss nun eigenständig nützliche Muster erkennen. Das Netzwerk wird dadurch extrem robust.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;zusammenfassung&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
Regularisierung fügt der KI ein wenig Disziplin hinzu. Sie sagt dem Modell: „Finde eine Lösung, aber mach sie so einfach und elegant wie möglich!“ Möchtest du sehen, wie man eine L1- oder L2-Regularisierung mit wenigen Zeilen Code in einer Python-Bibliothek wie scikit-learn einbaut?&lt;br /&gt;
&lt;br /&gt;
==Beispiel scikit-learn==&lt;br /&gt;
Hier ist das Beispiel mit der Bibliothek scikit-learn. Wir vergleichen die Standard-Regression (ohne Bremse) mit L1 (Lasso) und L2 (Ridge).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sklearn.linear_model import LinearRegression, Ridge, Lassofrom sklearn.model_selection import train_test_split&lt;br /&gt;
&lt;br /&gt;
# 1. Daten aufteilen (X = Eigenschaften, y = Zielwert/Preis)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)&lt;br /&gt;
# 2. Ohne Regularisierung (Neigt bei vielen Merkmalen zu Overfitting)model_standard = LinearRegression()&lt;br /&gt;
model_standard.fit(X_train, y_train)&lt;br /&gt;
# 3. L2-Regularisierung (Ridge) -&amp;gt; Hält alle Gewichte kleinmodel_l2 = Ridge(alpha=1.0)  # alpha ist die Stärke der Bestrafung&lt;br /&gt;
model_l2.fit(X_train, y_train)&lt;br /&gt;
# 4. L1-Regularisierung (Lasso) -&amp;gt; Setzt unwichtige Gewichte auf exakt Nullmodel_l1 = Lasso(alpha=0.1)&lt;br /&gt;
model_l1.fit(X_train, y_train)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;was-bewirkt-der-parameter-alpha&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Was bewirkt der Parameter alpha? ==&lt;br /&gt;
&lt;br /&gt;
* alpha = 0: Keine Regularisierung (entspricht der Standard-Regression).&lt;br /&gt;
* alpha sehr hoch: Die Strafe ist extrem streng. Das Modell wird zu stark vereinfacht (Gefahr von Underfitting).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;welches-modell-wählt-man-wann&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Welches Modell wählt man wann? ==&lt;br /&gt;
&lt;br /&gt;
* Ridge (L2): Wenn du glaubst, dass fast alle deine Merkmale ein bisschen wichtig für die Vorhersage sind.&lt;br /&gt;
* Lasso (L1): Wenn du sehr viele Merkmale hast, aber vermutest, dass nur ein paar wenige davon wirklich relevant sind (der Rest wird auf Null gesetzt).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Rauschen=&lt;br /&gt;
&lt;br /&gt;
Unter Rauschfaktoren (oft auch einfach als Rauschen oder Noise bezeichnet) versteht man in der Künstlichen Intelligenz unerwünschte, fehlerhafte oder irrelevante Daten, die ein KI-Modell ablenken und seine Genauigkeit verschlechtern. [1] In der KI gilt die Grundregel: „Garbage in, garbage out“ (Müll rein, Müll raus). Rauschfaktoren sind genau dieser „Müll“, der die echten Muster in den Daten überlagert. [1, 2] Man unterscheidet im Wesentlichen vier Arten von Rauschfaktoren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;datenrauschen-data-noise&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Datenrauschen (Data Noise) ==&lt;br /&gt;
&lt;br /&gt;
Das sind Fehler, die direkt in den Datensätzen stecken, mit denen die KI trainiert wird: [1]&lt;br /&gt;
&lt;br /&gt;
* Messfehler: Defekte Sensoren (z. B. bei autonomen Autos), die falsche Werte liefern.&lt;br /&gt;
* Menschliche Fehler: Falsch beschriftete Daten (z. B. wenn beim Training ein Bild von einer Katze fälschlicherweise als „Hund“ gelabelt wurde).&lt;br /&gt;
* Ausreißer (Outliers): Extrem ungewöhnliche Einzelereignisse in den Daten, die den Gesamttrend verfälschen. [1, 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;signalrauschen-signal-noise&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Signalrauschen (Signal Noise) ==&lt;br /&gt;
&lt;br /&gt;
Hierbei handelt es sich um physikalische Störungen bei der Live-Anwendung der KI: [3]&lt;br /&gt;
&lt;br /&gt;
* Audio-KI: Hintergrundgeräusche (z. B. Baustellenlärm oder Stimmengewirr im Krankenhaus), die es einem Sprachassistenten erschweren, Befehle korrekt zu verstehen. [4]&lt;br /&gt;
* Bild-KI: Bildrauschen bei Nachtaufnahmen (Körnigkeit durch schlechte Lichtverhältnisse), wodurch die KI Objekte oder Gesichter nicht mehr richtig erkennt. [5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;syntaktischesstrukturelles-rauschen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Syntaktisches/Strukturelles Rauschen ==&lt;br /&gt;
&lt;br /&gt;
Dies betrifft vor allem generative KIs (wie ChatGPT): [6]&lt;br /&gt;
&lt;br /&gt;
* Kontextloses Füllen: Wenn ein KI-Modell mit unstrukturierten Texten gefüttert wird, die viele Füllwörter oder irrelevanten Code enthalten, verliert es den Fokus auf den eigentlichen Inhalt. Die KI lernt dann das „Rauschen“ des Schreibstils statt der echten Fakten. [7]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;der-paradoxe-twist-warum-ki-manchmal-rauschen-braucht&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Der paradoxe Twist: Warum KI manchmal Rauschen braucht ==&lt;br /&gt;
&lt;br /&gt;
Obwohl Rauschfaktoren meistens eliminiert werden sollen (z. B. durch Datenbereinigung oder Filter), setzen Entwickler Rauschen in zwei Fällen gezielt als Werkzeug ein: [8, 9]&lt;br /&gt;
&lt;br /&gt;
# Gegen Overfitting (Regularisierung): Man fügt den Trainingsdaten absichtlich künstliches Rauschen hinzu. Die KI lernt dadurch, ungenaue Realdaten zu erwarten, und wird robuster gegen Fehler im echten Leben. [9, 10, 11]&lt;br /&gt;
# Bildgenerierung (Diffusionsmodelle): KIs wie Midjourney oder Stable Diffusion erzeugen Bilder, indem sie mit einem komplett verrauschten Pixel-Chaos starten und dieses Schritt für Schritt gezielt „entrauschen“, bis ein klares Bild entsteht. [12]&lt;br /&gt;
&lt;br /&gt;
Möchtest du wissen, wie man Datenrauschen vor dem KI-Training herausfiltert, oder interessiert dich, wie Bild-KIs Rauschen nutzen, um neue Kunstwerke zu erschaffen? [12]&lt;br /&gt;
&lt;br /&gt;
[1] [https://deepchecks.com/glossary/noise-in-machine-learning/ https://deepchecks.com] [2] [https://www.fau.de/2024/11/news/forschung/kuenstliche-intelligenz/zufaelliges-rauschen-verbessert-leistung-von-ki-systemen/ https://www.fau.de] [3] [https://www.youtube.com/watch?v=PQV5qtS1E1U&amp;amp;t=33 https://www.youtube.com] [4] [https://www.youtube.com/watch?v=uoBknPqpm2w&amp;amp;t=15 https://www.youtube.com] [5] [https://www.youtube.com/watch?v=J52RHqpbzDU https://www.youtube.com] [6] [https://digitalzentrum-berlin.de/ki-modelle-im-faktencheck-chatgpt-und-co-liefern-oft-falschaussagen https://digitalzentrum-berlin.de] [7] [https://mstone.ai/blog/reducing-noise-factors-when-evaluating-genai/ https://mstone.ai] [8] [https://www.dhiria.com/en/blog/noise-in-ai-from-disturbance-to-creative-tool https://www.dhiria.com] [9] [https://www.innovatiana.com/en/post/add-noise-in-ai https://www.innovatiana.com] [10] [https://www.sciencedirect.com/science/article/pii/S2772508126000037 https://www.sciencedirect.com] [11] [https://www.youtube.com/watch?v=tcY0MZQGqWE https://www.youtube.com] [12] [https://www.youtube.com/watch?v=p_FNE5Q-180&amp;amp;t=3 https://www.youtube.com]&lt;br /&gt;
&lt;br /&gt;
=Train-Test-Split=&lt;br /&gt;
&lt;br /&gt;
Der Train-Test-Split (Aufteilung in Trainings- und Testdaten) ist der wichtigste Kontrollschritt beim maschinellen Lernen. Er verhindert, dass man die Leistung einer KI falsch einschätzt, und deckt Overfitting sofort auf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;das-prinzip&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Das Prinzip ==&lt;br /&gt;
&lt;br /&gt;
Man nimmt seinen gesamten Datensatz und schneidet ihn in zwei Teile:&lt;br /&gt;
&lt;br /&gt;
# Trainingsdaten (ca. 70–80 %): Mit diesem Teil lernt die KI. Sie sucht nach Mustern und passt ihre internen Gewichte an.&lt;br /&gt;
# Testdaten (ca. 20–30 %): Dieser Teil wird weggeschlossen. Erst wenn das Training komplett vorbei ist, muss die KI für diese Daten Vorhersagen treffen. Da sie diese Daten noch nie gesehen hat, simuliert dies den Einsatz im echten Leben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;warum-ist-das-zwingend-notwendig&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Warum ist das zwingend notwendig? ==&lt;br /&gt;
&lt;br /&gt;
Wenn man eine KI auf denselben Daten testet, auf denen sie gelernt hat, betrügt man sich selbst. Ein Modell, das einfach nur alle Daten auswendig gelernt hat (Overfitting), würde eine Genauigkeit von 100 % anzeigen. Erst beim Testen mit den isolierten Testdaten zeigt sich, ob die KI die Prinzipien wirklich verstanden hat. ## Das goldene Gesetz: Data Leakage verhindern Es darf niemals Information aus dem Testset in das Trainingsset fließen (Data Leakage).&lt;br /&gt;
&lt;br /&gt;
* Beispiel: Wenn du Daten vor dem Split skalierst oder den Mittelwert bildest, kennt das Trainingsset bereits Eigenschaften des Testsets. Das verfälscht das Testergebnis komplett.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;code-beispiel-scikit-learn&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Code-Beispiel (scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Der Split wird in Python standardmäßig so durchgeführt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sklearn.model_selection import train_test_split &lt;br /&gt;
# test_size=0.2 bedeutet: 80% Training, 20% Test&lt;br /&gt;
# random_state fixiert den Zufall, damit der Split reproduzierbar bleibtX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trainingsdaten gut und Testdaten schlecht =&amp;gt; Overfitted&lt;br /&gt;
Trainingsdaten schlecht und Testdaten schlecht =&amp;gt; ?&lt;br /&gt;
Trainingsdaten gut und Testdaten gut =&amp;gt; gutes Modell&lt;br /&gt;
Trainingsdaten schlecht und Testdaten gut =&amp;gt; Fehler&lt;br /&gt;
&lt;br /&gt;
Hier ist die gewünschte Zusammenfassung im Markdown-Format:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Zustand im Training&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Zustand im Test&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Diagnose&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Maßnahme&lt;br /&gt;
|-&lt;br /&gt;
| Gut&lt;br /&gt;
| Schlecht&lt;br /&gt;
| Overfitting (Überanpassung)&lt;br /&gt;
| Modell vereinfachen, Daten erhöhen, Regularisierung nutzen.&lt;br /&gt;
|-&lt;br /&gt;
| Schlecht&lt;br /&gt;
| Schlecht&lt;br /&gt;
| Underfitting (Unteranpassung)&lt;br /&gt;
| Modell komplexer machen, mehr Features hinzufügen.&lt;br /&gt;
|-&lt;br /&gt;
| Gut&lt;br /&gt;
| Gut&lt;br /&gt;
| Optimales Modell (Sweet Spot)&lt;br /&gt;
| Keine Aktion nötig. Bereit für den Produktiveinsatz.&lt;br /&gt;
|-&lt;br /&gt;
| Schlecht&lt;br /&gt;
| Gut&lt;br /&gt;
| Fehler / Artefakt (Unnatürlich)&lt;br /&gt;
| Code auf Data Leakage prüfen; Verteilung der Datensätze prüfen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-vier-fälle-im-detail&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die vier Fälle im Detail ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;trainingsdaten-gut-und-testdaten-schlecht-overfitting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Trainingsdaten gut und Testdaten schlecht =&amp;amp;gt; Overfitting ==&lt;br /&gt;
&lt;br /&gt;
Das Modell hat die Trainingsdaten quasi auswendig gelernt, inklusive aller Fehler, Ausreißer und des Rauschens. Es verhält sich wie ein Schüler, der die Übungsaufgaben für eine Klausur exakt auswendig lernt, aber das mathematische Prinzip dahinter nicht begreift. Sobald neue, unbekannte Daten (Testdaten) eingespeist werden, bricht die Leistung ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;trainingsdaten-schlecht-und-testdaten-schlecht-underfitting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Trainingsdaten schlecht und Testdaten schlecht =&amp;amp;gt; Underfitting ==&lt;br /&gt;
&lt;br /&gt;
Das Modell ist zu simpel gebaut oder wurde nicht lange genug trainiert, um überhaupt ein Muster in den Daten zu erkennen. Wenn man versucht, eine komplexe, geschwungene Datenwolke mit einer starren, geraden Linie vorherzusagen, trifft das Modell weder die bekannten noch die unbekannten Daten gut. Es hat den zugrunde liegenden Trend einfach nicht verstanden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;trainingsdaten-gut-und-testdaten-gut-optimales-modell&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Trainingsdaten gut und Testdaten gut =&amp;amp;gt; Optimales Modell ==&lt;br /&gt;
&lt;br /&gt;
Das ist das perfekte Ziel-Szenario. Das Modell hat die echten, allgemeingültigen Zusammenhänge aus den Daten extrahiert, ohne sich an Details zu überanpassen. Es liefert sowohl auf bekannten als auch auf völlig neuen Daten stabile und präzise Vorhersagen. Das Modell hat erfolgreich generalisiert und ist bereit für die Praxis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;trainingsdaten-schlecht-und-testdaten-gut-systemfehler&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Trainingsdaten schlecht und Testdaten gut =&amp;amp;gt; Systemfehler ==&lt;br /&gt;
&lt;br /&gt;
Dieses Verhalten ist mathematisch unnatürlich. Eine KI kann auf unbekannten Daten logischerweise nicht besser performen als auf den Daten, mit denen sie trainiert wurde. Tritt dieser Fall auf, liegt fast immer ein technisches Problem vor – wie Data Leakage (Daten aus dem Testset sind unbemerkt ins Training gesickert), ein starkes Daten-Ungleichgewicht (das Testset enthält zufällig nur sehr leichte Beispiele) oder eine viel zu restriktive Regularisierung während des Trainings. Soll ich dir zeigen, wie du diese vier Zustände mit einer Grafik (Learning Curve) direkt beim Trainieren deiner KI sichtbar machen kannst?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weitere Begriffe: geschichteter Split / Stratified Split)&lt;br /&gt;
&lt;br /&gt;
=Kreuzvalidierung (K-Fold/Cross-Validation)=&lt;br /&gt;
&lt;br /&gt;
Die Kreuzvalidierung (engl. Cross-Validation, meist als K-Fold Cross-Validation durchgeführt) ist die Weiterentwicklung des einfachen Train-Test-Splits. Während ein einfacher Split die Daten nur ein einziges Mal teilt, wiederholt die Kreuzvalidierung diesen Prozess mehrfach. Das Ziel ist es, jeden einzelnen Datenpunkt genau einmal zum Testen zu verwenden. Damit schließt man aus, dass ein Modell nur durch Zufall (Glück oder Pech beim Split) gut abgeschnitten hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;das-prinzip-wie-funktioniert-k-fold&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Das Prinzip: Wie funktioniert K-Fold? ==&lt;br /&gt;
&lt;br /&gt;
Das Wort „K“ steht für eine Zahl (sehr oft wählt man K = 5 oder K = 10). Diese Zahl bestimmt, in wie viele gleich große Teile (Folds) die Daten zerlegt werden. Bei einer 5-fachen Kreuzvalidierung passiert Folgendes:&lt;br /&gt;
&lt;br /&gt;
# Die Daten werden in 5 Blöcke (Block 1 bis 5) unterteilt.&lt;br /&gt;
# Es finden 5 aufeinanderfolgende Durchgänge statt:&lt;br /&gt;
#* Durchgang 1: Blöcke 1, 2, 3, 4 sind das Trainingsteam – Block 5 ist das Testteam.&lt;br /&gt;
#* Durchgang 2: Blöcke 1, 2, 3, 5 sind das Trainingsteam – Block 4 ist das Testteam.&lt;br /&gt;
#* Durchgang 3: Blöcke 1, 2, 4, 5 sind das Trainingsteam – Block 3 ist das Testteam.&lt;br /&gt;
#* Durchgang 4: Blöcke 1, 3, 4, 5 sind das Trainingsteam – Block 2 ist das Testteam.&lt;br /&gt;
#* Durchgang 5: Blöcke 2, 3, 4, 5 sind das Trainingsteam – Block 1 ist das Testteam.&lt;br /&gt;
#Am Ende berechnet man den Mittelwert aller 5 Testergebnisse.&lt;br /&gt;
&lt;br /&gt;
===Warum macht man das? (Die Vorteile)===&lt;br /&gt;
Maximale Datennutzung: Besonders bei kleinen Datensätzen wertvoll, da jedes Datenbeispiel mal zum Trainieren und mal zum Testen genutzt wird. &lt;br /&gt;
* Verlässliche Metriken: Wenn das Modell in allen 5 Durchgängen eine Genauigkeit von ca. 85 % erzielt, ist es stabil. Schwankt es zwischen 60 % und 95 %, ist das Modell instabil und unzuverlässig. &lt;br /&gt;
* Perfekt für Hyperparametertuning: Man nutzt die Kreuzvalidierung, um die besten Einstellungen (wie das optimale alpha bei der L1/L2-Regularisierung) zu finden, ohne die finalen, echten Testdaten anzurühren.&lt;br /&gt;
*Schaetzt Fehler besser ab als Train-Test-Split&lt;br /&gt;
&lt;br /&gt;
* Nachteil: dauert laenger&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;code-beispiel-in-python-scikit-learn&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code-Beispiel in Python (scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
In der Praxis musst du diese Schleifen nicht selbst schreiben. scikit-learn übernimmt das mit einer einzigen Zeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sklearn.model_selection import cross_val_scorefrom &lt;br /&gt;
from sklearn.linear_model import Ridge &lt;br /&gt;
&lt;br /&gt;
model = Ridge(alpha=1.0) &lt;br /&gt;
&lt;br /&gt;
# cv=5 bedeutet 5-fache Kreuzvalidierung&lt;br /&gt;
# Es gibt uns direkt 5 Genauigkeits-Scores zurück&lt;br /&gt;
scores = cross_val_score(model, X, y, cv=5)&lt;br /&gt;
&lt;br /&gt;
print(“Scores der 5 Durchgänge:”, scores) &lt;br /&gt;
print(“Mittlere Genauigkeit:”, scores.mean())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Begriffe: Stratified K-Fold (geschichtete Kreuzvalidierung) Zwingend bei ungleich verteilten Klassen (z.B. seltenen Krankheiten).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Clustering=&lt;br /&gt;
Clustering ist ein zentrales Verfahren des Unüberwachten Lernens (Unsupervised Learning) in der Künstlichen Intelligenz. Im Gegensatz zur Regression oder Klassifikation gibt es hier keine vorgegebenen Labels oder Zielwerte (wie z. B. Preise oder Kategorien). Die KI bekommt lediglich einen Haufen Daten und muss selbstständig Gruppen (Cluster) finden. Das Ziel ist es, Datenpunkte so aufzuteilen, dass Elemente innerhalb einer Gruppe sich maximal ähnlich sind, während die Gruppen untereinander sich maximal unterscheiden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-3-bekanntesten-clustering-algorithmen-1.-k-means-der-klassiker&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Die 3 bekanntesten Clustering-Algorithmen==&lt;br /&gt;
1. k-Means (Der Klassiker)&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Du gibst der KI vor, wie viele Gruppen (k) es geben soll. Der Algorithmus platziert zufällig k Mittelpunkte (Zentren) und ordnet jeden Datenpunkt dem nächstgelegenen Zentrum zu. Danach werden die Zentren neu berechnet. Das wiederholt sich, bis die Gruppen stabil sind.&lt;br /&gt;
* Nachteil: Man muss die Anzahl der Gruppen vorab kennen. Zudem funktioniert es nur gut bei kreisförmigen/kugelförmigen Datenwolken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dbscan-der-dichte-spezialist&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. DBSCAN (Der Dichte-Spezialist) ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Dieser Algorithmus sucht nach Regionen, in denen Datenpunkte besonders dicht beieinanderliegen.&lt;br /&gt;
* Vorteil: Er erkennt Gruppen mit völlig beliebigen, komplexen Formen (z. B. eine Gruppe, die sich halbmondförmig um eine andere legt). Zudem erkennt er Ausreißer (Rauschen) automatisch und sortiert sie aus. Du musst die Anzahl der Cluster nicht im Voraus wissen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hierarchisches-clustering-der-stammbaum&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Hierarchisches Clustering (Der Stammbaum) ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Entweder startet jeder Punkt als eigenes Cluster und die KI verschmilzt die ähnlichsten Punkte Schritt für Schritt (Agglomerativ), oder alle starten in einer Gruppe und werden immer feiner aufgeteilt (Divisiv).&lt;br /&gt;
* Ergebnis: Es entsteht ein Baumdiagramm (Dendrogramm), an dem man visuell ablesen kann, welche Daten wie stark miteinander verwandt sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;typische-praxisbeispiele&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Typische Praxisbeispiele ==&lt;br /&gt;
&lt;br /&gt;
* Kundensegmentierung: Eine Marketing-KI analysiert Kaufverhalten und teilt Kunden in Gruppen ein (z. B. „Schnäppchenjäger“, „Premium-Käufer“, „Gelegenheitskäufer“).&lt;br /&gt;
* Bildsegmentierung: Pixel mit ähnlichen Farben und Helligkeiten werden gruppiert, um Objekte auf einem Bild zu isolieren (wichtig für autonomes Fahren).&lt;br /&gt;
* Anomalieerkennung: Wenn Kreditkartentransaktionen geclustert werden und eine Transaktion völlig abseits aller Gruppen liegt, schlägt das System wegen Betrugsverdacht Alarm.&lt;br /&gt;
&lt;br /&gt;
Weitere Begriffe: k-Means  Wie die KI die optimale Anzahl an Clustern (z. B. mit der Ellbogen-Methode) selbst herausfindet?&lt;br /&gt;
&lt;br /&gt;
=Silhouette Methode=&lt;br /&gt;
Die Silhouette-Methode ist neben der Ellbogen-Methode das wichtigste Werkzeug, um die Qualität eines Clusterings zu bewerten und die optimale Anzahl an Gruppen (k) zu bestimmen. Während die Ellbogen-Methode nur misst, wie kompakt die Cluster sind, prüft die Silhouette-Methode zusätzlich, ob die Cluster sauber voneinander getrennt sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;der-silhouette-koeffizient-die-mathematische-idee&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Der Silhouette-Koeffizient (Die mathematische Idee) ==&lt;br /&gt;
&lt;br /&gt;
Für jeden einzelnen Datenpunkt berechnet die Methode einen Wert zwischen -1 und +1:&lt;br /&gt;
&lt;br /&gt;
* a (Kompaktheit): Der durchschnittliche Abstand des Punktes zu allen anderen Punkten im eigenen Cluster (sollte möglichst klein sein).&lt;br /&gt;
* b (Trennung): Der durchschnittliche Abstand des Punktes zu den Punkten im nächstgelegenen fremden Cluster (sollte möglichst groß sein).&lt;br /&gt;
&lt;br /&gt;
Daraus ergibt sich der Wert für einen Punkt: &amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{Silhouette} = \frac{b - a}{\max(a, b)}&amp;lt;/math&amp;gt; ## Wie interpretiert man das Ergebnis? Wenn man das Clustering für den gesamten Datensatz bewertet, bildet man den Mittelpunkt aller Einzelwerte:&lt;br /&gt;
&lt;br /&gt;
* Nahe +1: Perfektes Clustering. Die Punkte liegen dicht zusammen und sind weit von anderen Gruppen entfernt.&lt;br /&gt;
* Nahe 0: Die Cluster überlappen sich stark. Punkte liegen genau auf den Entscheidungsgrenzen.&lt;br /&gt;
* Nahe -1: Fehlplatzierung. Die Punkte wurden vermutlich dem falschen Cluster zugeordnet.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| ## Die optimale Clusteranzahl finden&lt;br /&gt;
|-&lt;br /&gt;
| Um die beste Anzahl an Clustern (k) zu finden, lässt man den Algorithmus (z. B. k-Means) für verschiedene Werte (z. B. k = 2, 3, 4, 5) laufen.&lt;br /&gt;
|-&lt;br /&gt;
| Die Regel lautet: Die Zahl k, die den höchsten durchschnittlichen Silhouette-Koeffizienten liefert, ist mathematisch gesehen die beste Wahl für deine Daten.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;code-beispiel-in-python-scikit-learn&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Code-Beispiel in Python (scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
from sklearn.cluster import KMeansfrom sklearn.metrics import silhouette_score # Wir testen verschiedene Cluster-Anzahlen von 2 bis 5for k in: kmeans = KMeans(n_clusters=k, random_state=42).fit(X) labels = kmeans.labels_&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Berechne den durchschnittlichen Score für dieses k&lt;br /&gt;
score = silhouette_score(X, labels)&lt;br /&gt;
print(f&amp;amp;quot;Für k={k} ist der Silhouette-Score: {score:.3f}&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Weitere Begriffe: Silhouette-Plot um unsaubere Cluster optisch sofort zu entlarven.&lt;br /&gt;
&lt;br /&gt;
=Reinforcement Learning=&lt;br /&gt;
Reinforcement Learning (Bestärkendes Lernen) ist neben dem überwachten (Supervised) und unüberwachten (Unsupervised) Lernen die dritte große Säule des maschinellen Lernens. Das Prinzip basiert auf Psychologie und Evolution: Eine KI lernt hier nicht durch historische Daten, sondern durch Versuch und Irrtum (Trial and Error) sowie durch ein System aus Belohnung und Bestrafung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-4-kernkomponenten-des-reinforcement-learnings&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Die 4 Kernkomponenten des Reinforcement Learnings ==&lt;br /&gt;
&lt;br /&gt;
* Der Agent (Die KI): Das System, das lernen soll (z. B. der Autopilot eines Autos oder eine Spielfigur).&lt;br /&gt;
* Die Umgebung (Environment): Die Welt, in der sich der Agent bewegt (z. B. die Straße oder das Schachbrett).&lt;br /&gt;
* Die Aktion (Action): Die Züge oder Schritte, die der Agent machen kann (z. B. Bremsen, Beschleunigen, Nach-links-Lenken).&lt;br /&gt;
* Die Belohnung (Reward): Das Feedback der Umgebung. Ein positiver Wert für gutes Verhalten (z. B. Ziel erreicht) oder ein negativer Wert für Fehler (z. B. Unfall gebaut).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wie-der-lernprozess-abläuft&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wie der Lernprozess abläuft ==&lt;br /&gt;
&lt;br /&gt;
# Völliges Chaos zu Beginn: Der Agent weiß am Anfang absolut nichts über die Welt. Er wählt seine Aktionen maximal arbiträr (zufällig) aus.&lt;br /&gt;
# Das Feedback: Macht er etwas richtig, kriegt er Pluspunkte. Macht er etwas falsch, kriegt er Minuspunkte.&lt;br /&gt;
# Die Optimierung: Der Agent versucht über Millionen von Durchgängen, seine Strategie (Policy) mathematisch so anzupassen, dass er die langfristige Summe aller Belohnungen maximiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;berühmte-praxisbeispiele&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Berühmte Praxisbeispiele ==&lt;br /&gt;
&lt;br /&gt;
* Gaming-KIs: Googles AlphaGo schlug den Weltmeister im extrem komplexen Brettspiel Go. Andere KIs lernten durch Reinforcement Learning, Videospiele wie Super Mario, StarCraft oder Dota 2 auf Profi-Niveau zu spielen.&lt;br /&gt;
* Robotik &amp;amp;amp; Autonomes Fahren: Roboter lernen, wie sie laufen, Greifarme bewegen oder Hindernissen ausweichen, indem sie in virtuellen Simulationen Millionen Mal abstürzen, bis sie die perfekte Balance finden.&lt;br /&gt;
* ChatGPT (RLHF): Moderne Sprachmodelle nutzen Reinforcement Learning from Human Feedback. Menschliche Trainer bewerten die Antworten der KI. Die KI lernt dadurch, nützlicher, freundlicher und sicherer zu antworten.&lt;br /&gt;
* Multi-Agent Hide and Seek bezieht sich meist auf ein berühmtes KI-Experiment von OpenAI (2019)https://openai.com/index/emergent-tool-use/. Dabei wurden zwei Teams von KI-Agenten (Hiders und Seekers) mittels Reinforcement Learning in eine virtuelle 3D-Welt gesetzt, um Verstecken zu spielen.&lt;br /&gt;
&lt;br /&gt;
Weitere Begriffe: Exploration-Exploitation-Dilemma (der Konflikt zwischen Neuem ausprobieren und Bekanntes nutzen), Q-Learning&lt;br /&gt;
&lt;br /&gt;
==Historischer Kontext==&lt;br /&gt;
Das Verstärkende Lernen ist historisch gesehen völlig unabhängig von neuronalen Netzen entstanden. Es bildete ein ganz eigenes historisches Teilgebiet, das seine Wurzeln weit vor dem heutigen KI-Boom hatte. [1, 2] Die Entstehung des Reinforcement Learnings basiert historisch auf der Verschmelzung zweier völlig unterschiedlicher Denkschulen: [1]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-psychologische-wurzel-trial-and-error-verhaltensbiologie&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1. Die psychologische Wurzel: “Trial-and-Error” (Verhaltensbiologie) ===&lt;br /&gt;
&lt;br /&gt;
Lange bevor es Computer gab, untersuchten Psychologen, wie Tiere und Menschen lernen.&lt;br /&gt;
&lt;br /&gt;
* Edward Thorndikes „Gesetz des Effekts“ (1898): Er stellte fest, dass Reaktionen, die eine angenehme Konsequenz haben, häufiger wiederholt werden. [3]&lt;br /&gt;
* B.F. Skinner (Operante Konditionierung): Er trainierte Tauben und Ratten in Boxen rein über Belohnung und Bestrafung. [4]&lt;br /&gt;
* Die Brücke zur Informatik: Bereits 1948 schlug Alan Turing ein „Pleasure-Pain-System“ für Maschinen vor. 1952 baute Claude Shannon die mechanische Maus „Theseus“, die rein durch Versuch und Irrtum den Weg aus einem Labyrinth erlernte. [5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-mathematische-wurzel-optimal-control-regelungstechnik&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Die mathematische Wurzel: “Optimal Control” (Regelungstechnik) ===&lt;br /&gt;
&lt;br /&gt;
Seit den 1950er Jahren suchten Ingenieure und Mathematiker nach Wegen, dynamische Systeme (wie Raketen oder Fabrikanlagen) mathematisch optimal zu steuern. [1, 6]&lt;br /&gt;
&lt;br /&gt;
* Richard Bellman (1957): Er erfand die [https://de.wikipedia.org/wiki/Dynamische_Programmierung Dynamische Programmierung] und die mathematische Grundlage aller heutigen RL-Systeme: das Markov-Entscheidungsproblem (MDP). [4, 7]&lt;br /&gt;
* Das Problem damals: Bellmans Gleichungen funktionierten perfekt, wenn man die gesamte Welt exakt mathematisch beschreiben konnte (ein “Modell” der Welt hatte). Für die echte, komplexe Welt war das unbrauchbar. [8, 9]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-historische-verschmelzung-die-geburtsstunde-des-rl&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Die historische Verschmelzung (Die Geburtsstunde des RL) ===&lt;br /&gt;
&lt;br /&gt;
In den späten 1970er und 1980er Jahren brachten Forscher wie Richard Sutton und Andrew Barto diese beiden Welten zusammen. Sie fragten sich: Können wir die mathematische Optimierung von Bellman nutzen, während die KI die Spielregeln der Welt rein durch die psychologische Methode von Versuch und Irrtum (Trial-and-Error) erlernt? [3, 4, 6, 8] Daraus entstanden die historischen, klassischen RL-Algorithmen, die ohne jedes neuronale Netz funktionierten:&lt;br /&gt;
&lt;br /&gt;
* Tabellarisches Q-Learning (1989 von Chris Watkins): Die KI speichert ihr Wissen nicht in “Neuronen”, sondern in einer riesigen Excel-Tabelle (einer Q-Tabelle). Für jeden Zustand der Welt wird für jede Aktion ein mathematischer Wert eingetragen, wie gut diese Aktion war. [8, 10]&lt;br /&gt;
* Beispiel Tic-Tac-Toe: Ein System namens BOXES (1968 von Michie und Chambers) lernte das Spiel perfekt, indem es Streichholzschachteln für jeden Spielzustand nutzte – völlig ohne neuronale Struktur. [5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;warum-nutzt-man-heute-dafür-deep-learning&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Warum nutzt man heute dafür Deep Learning? ===&lt;br /&gt;
&lt;br /&gt;
Klassisches Reinforcement Learning (mit Tabellen) stößt an seine Grenzen, wenn es zu viele Zustände gibt. Beim Schach oder bei Videospielen gibt es mehr mögliche Zustände als Atome im Universum – die Tabelle würde unendlich groß werden. [10] Erst im Jahr 2013 kombinierte die Firma DeepMind das historische Reinforcement Learning mit tiefen neuronalen Netzen (Deep Reinforcement Learning). Das neuronale Netz fungiert seitdem lediglich als “Schätzer”, der die riesige Tabelle ersetzt. [11, 12, 13] &lt;br /&gt;
&lt;br /&gt;
Weiterhin interessant: Wie funktioniert das historische Q-Learning mit einer Tabelle im Detail? Wie kann ein KI-System ganz ohne neuronale Netze kluge Entscheidungen treffen?&lt;br /&gt;
&lt;br /&gt;
[1] [http://incompleteideas.net/book/ebook/node12.html https://incompleteideas.net] [2] [https://cacm.acm.org/federal-funding-of-academic-research/rediscovering-reinforcement-learning/ https://cacm.acm.org] [3] [https://www.youtube.com/watch?v=ul6B2oFPNDM&amp;amp;t=178 https://www.youtube.com] [4] [https://intuitionlabs.ai/articles/reinforcement-learning-explained https://intuitionlabs.ai] [5] [https://www.sciencedirect.com/topics/engineering/reinforcement-learning-technique https://www.sciencedirect.com] [6] [http://www.scholarpedia.org/article/Reinforcement_learning https://www.scholarpedia.org] [7] [https://aws.amazon.com/what-is/reinforcement-learning/ https://aws.amazon.com] [8] [https://medium.com/@aiforhuman/the-roots-of-reinforcement-learning-ad605c4d6d89 https://medium.com] [9] [http://www.umiacs.umd.edu/~hal/courses/2016F_RL/RL1.pdf https://www.umiacs.umd.edu] [10] [https://www.prodot.de/ki-glossar/reinforcement-learning https://www.prodot.de] [11] [https://www.mathworks.com/help/reinforcement-learning/ug/what-is-reinforcement-learning.html https://www.mathworks.com] [12] [https://iabac.org/blog/the-evolution-of-reinforcement-learning-in-machine-learning https://iabac.org] [13] [https://www.youtube.com/watch?v=rkrfWpmG3aM https://www.youtube.com]&lt;br /&gt;
&lt;br /&gt;
=CrossEntropyLoss=&lt;br /&gt;
`CrossEntropyLoss` ist eine sehr häufig verwendete **Verlustfunktion (Loss Function) für Klassifikationsprobleme** in PyTorch.&lt;br /&gt;
&lt;br /&gt;
Sie beantwortet während des Trainings im Wesentlichen die Frage:&lt;br /&gt;
&lt;br /&gt;
 „Wie stark weicht die Vorhersage des neuronalen Netzes von der richtigen Zielklasse ab?“&lt;br /&gt;
&lt;br /&gt;
Nehmen wir deinen Ziffernklassifikator. Die Taxonomie bzw. Klassenmenge besteht aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0, 1, 2, 3, 4, 5, 6, 7, 8, 9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für ein Bild ist die Zielklasse beispielsweise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
y = 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das neuronale Netz liefert aber nicht einfach `7`, sondern zunächst **10 Ausgabewerte**, sogenannte **Logits**:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Klasse     Logit&lt;br /&gt;
  0         0.2&lt;br /&gt;
  1        -0.5&lt;br /&gt;
  2         0.8&lt;br /&gt;
  3         0.1&lt;br /&gt;
  4        -0.3&lt;br /&gt;
  5         0.4&lt;br /&gt;
  6         0.2&lt;br /&gt;
  7         3.8   ←&lt;br /&gt;
  8         0.5&lt;br /&gt;
  9         1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je größer der Logit, desto stärker spricht das Modell für diese Klasse.&lt;br /&gt;
&lt;br /&gt;
==Was macht `CrossEntropyLoss` daraus?==&lt;br /&gt;
&lt;br /&gt;
Vereinfacht passieren zwei Dinge:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{Logits}&lt;br /&gt;
\xrightarrow{\text{Softmax}}&lt;br /&gt;
\text{Wahrscheinlichkeiten}&lt;br /&gt;
\xrightarrow{\text{Vergleich mit Zielklasse}}&lt;br /&gt;
\text{Loss}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 CrossEntropyLoss kombiniert diese Berechnungen intern. Deshalb sollte man vor CrossEntropyLoss normalerweise **kein eigenes `softmax()`** aufrufen.&lt;br /&gt;
&lt;br /&gt;
In PyTorch sieht das beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
&lt;br /&gt;
# Ausgabe des neuronalen Netzes:&lt;br /&gt;
# 4 Bilder und jeweils 10 Klassen&lt;br /&gt;
logits = torch.rand(4, 10)&lt;br /&gt;
&lt;br /&gt;
# Richtige Zielklassen der vier Bilder&lt;br /&gt;
y = torch.tensor([2, 7, 0, 9], dtype=torch.long)&lt;br /&gt;
&lt;br /&gt;
# Verlustfunktion erzeugen&lt;br /&gt;
loss_fn = nn.CrossEntropyLoss()&lt;br /&gt;
&lt;br /&gt;
# Verlust berechnen&lt;br /&gt;
loss = loss_fn(logits, y)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{logits.shape=}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{y.shape=}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{loss=}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist entscheidend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logits.shape = (4, 10)&lt;br /&gt;
                │   │&lt;br /&gt;
                │   └── 10 mögliche Klassen&lt;br /&gt;
                └────── 4 Bilder&lt;br /&gt;
&lt;br /&gt;
y.shape = (4,)&lt;br /&gt;
           │&lt;br /&gt;
           └── eine richtige Zielklasse pro Bild&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das passt genau zu deinem bisherigen Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bild x[0] → Zielklasse 2&lt;br /&gt;
Bild x[1] → Zielklasse 7&lt;br /&gt;
Bild x[2] → Zielklasse 0&lt;br /&gt;
Bild x[3] → Zielklasse 9&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### Warum braucht man überhaupt einen Loss?&lt;br /&gt;
&lt;br /&gt;
Beim Training läuft vereinfacht diese Kette ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Trainingsbild&lt;br /&gt;
     ↓&lt;br /&gt;
Neuronales Netz&lt;br /&gt;
     ↓&lt;br /&gt;
Logits&lt;br /&gt;
     ↓&lt;br /&gt;
CrossEntropyLoss ← richtige Zielklasse&lt;br /&gt;
     ↓&lt;br /&gt;
Loss&lt;br /&gt;
     ↓&lt;br /&gt;
Backpropagation&lt;br /&gt;
     ↓&lt;br /&gt;
Gewichte des Netzes verändern&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein **kleiner Loss** bedeutet: Die Vorhersage passt gut zur Zielklasse.&lt;br /&gt;
&lt;br /&gt;
Ein **großer Loss** bedeutet: Die Vorhersage passt schlecht zur Zielklasse.&lt;br /&gt;
&lt;br /&gt;
Dabei berücksichtigt Cross Entropy nicht nur, ob die endgültige Klassifikation richtig oder falsch war, sondern auch, **wie sicher das Modell dabei war**. Eine selbstbewusste falsche Vorhersage wird stärker bestraft als eine unsichere falsche Vorhersage.&lt;br /&gt;
&lt;br /&gt;
Das ist auch der entscheidende Unterschied zur **Accuracy**:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{CrossEntropyLoss → zum Trainieren}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{Accuracy → zum Bewerten}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Accuracy ist nämlich nicht gut geeignet, um mittels Backpropagation die Gewichte eines neuronalen Netzes schrittweise zu verbessern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Image Manipulation=&lt;br /&gt;
==Dilations==&lt;br /&gt;
&lt;br /&gt;
 Dilatation (abgeleitet vom lateinischen dilatare für „ausdehnen“ oder „erweitern“) bedeutet allgemein die Erweiterung, Dehnung oder Vergrößerung eines Gefäßes oder eines physikalischen Körpers.&lt;br /&gt;
&lt;br /&gt;
Der Begriff gehoert zur digitalen Bildverarbeitung als morphologische Dilatation (z. B.YOLO und Computervision). Hier ist es eine Operation, bei der Pixel an die Raender von Objekten in einem Binärbild (Schwarz-Weiß-Bild) &amp;quot;angefuegt&amp;quot; werden. Objekte im Bild werden dadurch vergroeszert oder dicker gemacht, um beispielsweise kleine Loecher in erkannten Formen zu schließen oder Linien zu verbinden.&lt;br /&gt;
&lt;br /&gt;
Im Informatik-Zusammenhang bezieht sich Dilatation (engl. dilation) fast ausschließlich auf zwei wichtige Bereiche der Bildverarbeitung und der Deep-Learning-Netzwerke. Beide Konzepte nutzen das mathematische Prinzip der &amp;quot;Ausdehnung&amp;quot;, wenden es aber unterschiedlich an:&lt;br /&gt;
&lt;br /&gt;
===In der Bildverarbeitung (Morphologische Dilatation)===&lt;br /&gt;
Hier ist die Dilatation (oft zusammen mit ihrem Gegenstück, der Erosion) eine der fundamentalen Operationen, um die Formen von Objekten in digitalen Bildern zu verändern. [1, 2]&lt;br /&gt;
&lt;br /&gt;
Wie es funktioniert: Ein kleiner Filter (ein sogenanntes Strukturelement oder Kernel, z. B. eine Matrix von 3 × 3 Pixeln) wandert Schritt für Schritt über das Bild.&lt;br /&gt;
Bei einem Binärbild (Schwarz-Weiß) gilt die Regel: Wenn der Kernel auch nur einen einzigen weißen Pixel berührt, wird der Pixel in der Mitte ebenfalls weiß gefärbt (logisches ODER).&lt;br /&gt;
Bei einem Graustufenbild wird der Pixel in der Mitte durch den maximalen Helligkeitswert in der Umgebung ersetzt. [3, 4, 5, 6, 7]&lt;br /&gt;
Der Effekt: Weiße/helle Flächen dehnen sich aus (sie &amp;quot;dilatieren&amp;quot;), während schwarze Löcher schrumpfen. [3, 4]&lt;br /&gt;
&lt;br /&gt;
Praxis-Anwendung:&lt;br /&gt;
Lücken schließen: Wenn bei einer Texterkennung (OCR) Buchstaben durch Bildrauschen unterbrochen sind, verbindet die Dilatation die Fragmente wieder.&lt;br /&gt;
Objekttrennung vorbereiten: Wenn man Objekte (wie Münzen) zählen will, die sich leicht berühren, nutzt man morphologische Operationen, um sie sauber freizustellen. [4, 8]&lt;br /&gt;
&lt;br /&gt;
In Bibliotheken wie OpenCV nutzt man dafür einfach den Befehl cv2.dilate(). [9]&lt;br /&gt;
&lt;br /&gt;
===In Convolutional Neural Networks (Dilated Convolutions)===&lt;br /&gt;
Wenn Sie moderne KI-Modelle zur Bildsegmentierung oder Objekterkennung (wie YOLO-Varianten oder WaveNet für Audio) bauen, stoszen Sie auf Dilated Convolutions (atrous convolutions).&lt;br /&gt;
&lt;br /&gt;
Das Problem bei Standard-KI: Um den globalen Kontext eines großen Bildes zu verstehen, müssen KI-Filter tief im Netzwerk sehr groß werden. Große Filter (7 × 7 oder 9 × 9) verbrauchen jedoch enorm viel Rechenleistung.&lt;br /&gt;
&lt;br /&gt;
Die Dilatation-Loesung: Man nimmt einen kleinen Standard-Filter (z. B. 3 × 3) und zieht ihn kuenstlich auseinander, indem man Luecken (Nullen) zwischen die Filterpunkte einfuegt (der sogenannte Dilation Rate-Faktor).&lt;br /&gt;
&lt;br /&gt;
Der Effekt: Der Filter deckt ploetzlich ein viel groeszeres Sichtfeld (Receptive Field) ab, behaelt aber die exakt gleiche Anzahl an rechenintensiven Parametern bei. Die KI &amp;quot;sieht&amp;quot; das große Ganze, ohne langsamer zu werden.&lt;br /&gt;
&lt;br /&gt;
[1] https://medium.com&lt;br /&gt;
&lt;br /&gt;
[2] https://medium.com&lt;br /&gt;
&lt;br /&gt;
[3] https://homepages.inf.ed.ac.uk&lt;br /&gt;
&lt;br /&gt;
[4] https://www.yahboom.net&lt;br /&gt;
&lt;br /&gt;
[5] https://www.youtube.com&lt;br /&gt;
&lt;br /&gt;
[6] https://docs.opencv.org&lt;br /&gt;
&lt;br /&gt;
[7] https://data-flair.training&lt;br /&gt;
&lt;br /&gt;
[8] https://www.cg.tuwien.ac.at&lt;br /&gt;
&lt;br /&gt;
[9] https://www.projectpro.io&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Kernel Shape=&lt;br /&gt;
Im Informatik- und KI-Zusammenhang (insbesondere bei Convolutional Neural Networks (CNNs) und der Bildverarbeitung) beschreibt kernel_shape die Dimensionen (Breite und Hoehe) eines Filters (Kernels).&lt;br /&gt;
Der Begriff gibt an, wie grosz das gleitende Fenster ist, das Schritt für Schritt über das Bild wandert, um Merkmale wie Kanten, Formen oder Texturen zu extrahieren.&lt;br /&gt;
==Format und Darstellung==&lt;br /&gt;
Die kernel_shape wird fast immer als ein Tupel oder eine Liste aus zwei (oder drei) Ganzzahlen angegeben: [Hoehe, Breite].&lt;br /&gt;
&lt;br /&gt;
kernel_shape = [3, 3] bedeutet: Der Filter ist eine quadratische Matrix mit 3 Pixeln Höhe und 3 Pixeln Breite (insgesamt 9 Rechenpunkte). Dies ist der absolute Standard in modernen Netzwerken (wie YOLO oder ResNet).&lt;br /&gt;
&lt;br /&gt;
kernel_shape = [5, 5] bedeutet: Ein größerer Filter mit 25 Rechenpunkten, der auf einmal einen größeren Bildbereich analysiert.&lt;br /&gt;
&lt;br /&gt;
kernel_shape = [1, 1] (Pointwise Convolution): Ein minimaler Filter. Er schaut nur auf einen einzigen Pixel, wird aber genutzt, um die Anzahl der Kanäle (Features) zu verändern, ohne die räumliche Bildgröße zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
==Warum fast immer ungerade Zahlen?==&lt;br /&gt;
Sie werden in der Praxis fast ausschließlich ungerade Zahlen (3x3, 5x5, 7x7) als kernel_shape sehen. Der Grund ist mathematischer Natur: Ungerade Matrizen haben einen exakten Mittelpunkt. Dadurch kann der berechnete Wert präzise auf den Pixel projiziert werden, der sich genau in der Mitte des Filters befindet.&lt;br /&gt;
&lt;br /&gt;
==Bezug==&lt;br /&gt;
Bei Dilated Convolutions: Wenn Sie eine kernel_shape von [3, 3] haben und die Dilation Rate auf 2 setzen, dehnt sich der Filter optisch aus. Er deckt dann die Fläche einer kernel_shape von [5, 5] ab, berechnet aber weiterhin nur die Werte von 9 Pixeln.&lt;br /&gt;
&lt;br /&gt;
Bei ONNX-Konvertierungen: Wenn Sie ein YOLO-Modell in ONNX konvertieren und es mit Tools wie Netron.app untersuchen, taucht der Begriff kernel_shape in den Attributen jedes Conv-Blocks auf. Er zeigt Ihnen genau, wie die Geometrie der Schichten im Modell aufgebaut ist.&lt;br /&gt;
&lt;br /&gt;
=Group/Pads/Strides=&lt;br /&gt;
In einem Conv-Block (Convolutional Layer) eines neuronalen Netzes (wie man sie beim Inspizieren in ONNX oder Netron sieht) beschreiben pads, strides und group die genauen Regeln, wie sich der Filter (Kernel) über das Bild bewegt, wie die Ränder behandelt werden und wie die Kanäle miteinander verrechnet werden.&lt;br /&gt;
Zusammen mit der kernel_shape bestimmen diese drei Parameter exakt die Größe des Ausgangsbildes nach der Faltung.&lt;br /&gt;
==1. strides (Schrittweite)==&lt;br /&gt;
Der stride (meist als [Y, X] angegeben) definiert, um wie viele Pixel der Filter nach jedem Schritt weitergerückt wird.&lt;br /&gt;
&lt;br /&gt;
strides = [1, 1] (Standard): Der Filter verschiebt sich immer nur um genau einen Pixel nach rechts oder unten. Die Auflösung des Bildes bleibt (vorausgesetzt, das Padding stimmt) fast identisch.&lt;br /&gt;
&lt;br /&gt;
strides = [2, 2]: Der Filter springt immer um zwei Pixel vorwärts. Er überspringt also die Hälfte der Daten.&lt;br /&gt;
&lt;br /&gt;
Der Effekt: Das Ausgangsbild wird dadurch exakt halbiert (z. B. von 640 × 640 auf 320 × 320 Pixel). Moderne Netze wie YOLO nutzen stride = [2, 2] anstelle von Pooling-Layern, um das Bild bewusst zu verkleinern und Rechenleistung zu sparen.&lt;br /&gt;
==2. pads (Rand-Auffüllung)==&lt;br /&gt;
Da ein Filter (z. B. 3 × 3) eine gewisse Breite hat, stoeszt er an den Bildraendern an seine Grenzen. Wenn man den Filter genau auf den allerersten Pixel oben links setzen will, wuerde die linke Haelfte des Filters im &amp;quot;Nichts&amp;quot; haengen. pads loest das, indem künstliche Pixel (meistens Nullen) um das Bild herumgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Die Angabe erfolgt im Format [Top, Left, Bottom, Right].&lt;br /&gt;
&lt;br /&gt;
pads = [0, 0, 0, 0] (Valid Padding): Es wird kein Rand hinzugefuegt. Der Filter darf sich nur dort bewegen, wo er komplett auf das echte Bild passt. Das Ausgangsbild wird dadurch automatisch ein Stueck kleiner.&lt;br /&gt;
&lt;br /&gt;
pads = [1, 1, 1, 1] (Same Padding): Es wird ein 1 Pixel breiter Rand aus Nullen um das gesamte Bild gelegt. In Kombination mit strides = [1, 1] sorgt dies dafür, dass das Ausgangsbild exakt die gleiche Höhe und Breite behält wie das Eingangsbild.&lt;br /&gt;
==3. group (Gruppierung der Kanaele)==&lt;br /&gt;
Dieser Parameter steuert die Verbindung zwischen den Eingangs-Kanaelen (z. B. RGB = 3 Kanaele) und den Ausgangs-Kanaelen.&lt;br /&gt;
&lt;br /&gt;
group = 1 (Standard / Dense Convolution): Jeder Filter berechnet Werte über alle Eingangskanaele hinweg. Ein Filter schaut sich also gleichzeitig Rot, Grün und Blau an und mischt diese Informationen komplett.&lt;br /&gt;
&lt;br /&gt;
group = In_Channels (Depthwise Separable Convolution): Wenn die Anzahl der Gruppen exakt der Anzahl der Eingangskanäle entspricht, ist jeder Filter strikt auf seinen eigenen Kanal isoliert. Ein &amp;quot;roter&amp;quot; Filter berechnet nur rote Pixel, ein &amp;quot;grüner&amp;quot; Filter nur grüne.&lt;br /&gt;
&lt;br /&gt;
Der Effekt: Das spart massiv Rechenleistung und Parameter (oft bis zu 90 %). Mobile Netze (wie MobileNet) oder extrem komprimierte YOLO-Varianten für Edge-Geräte und FPGAs nutzen dies intensiv, um die Hardware zu entlasten.&lt;br /&gt;
&lt;br /&gt;
==Ein schnelles Rechenbeispiel aus der Praxis==&lt;br /&gt;
Ein YOLO-Modell bekommt ein Bild der Größe 640 × 640 Pixel. Es trifft auf einen Conv-Block mit folgenden Attributen:&lt;br /&gt;
&lt;br /&gt;
kernel_shape = [3, 3]&lt;br /&gt;
&lt;br /&gt;
strides = [2, 2]&lt;br /&gt;
&lt;br /&gt;
pads = [1, 1, 1, 1]&lt;br /&gt;
&lt;br /&gt;
Was passiert? Das Padding fügt ringsherum Nullen an (Bild wird virtuell zu 642 × 642). Der 3 × 3-Filter wandert nun im 2-Pixel-Takt (stride = 2) darüber hinweg. Das Ergebnis am Ausgang dieses Blocks ist ein perfekt verkleinertes Feature-Bild der Größe 320 × 320 Pixel.&lt;br /&gt;
&lt;br /&gt;
=Sigmoid=&lt;br /&gt;
In einem CNN (Convolutional Neural Network) ist die Sigmoid-Funktion eine mathematische Funktion, die als Aktivierungsfunktion eingesetzt wird. Ihre Hauptaufgabe ist es, eine beliebige Zahl (das Ergebnis einer vorherigen Berechnung) in einen festen Wertebereich zwischen 0 und 1 abzubilden.&lt;br /&gt;
&lt;br /&gt;
Die mathematische Formel lautet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma(x)=\frac{1}{1+e^{-x}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ist die Bedeutung und Funktion im CNN-Kontext aufgeschlüsselt:&lt;br /&gt;
&lt;br /&gt;
==1. Die Hauptaufgabe: Wahrscheinlichkeiten berechnen==&lt;br /&gt;
Da die Kurve der Sigmoid-Funktion S-förmig verläuft, eignet sie sich perfekt, um Wahrscheinlichkeiten (Scores) auszudrücken.&lt;br /&gt;
 Ein Wert nahe 0 bedeutet: „Das Objekt ist mit hoher Sicherheit nicht da.“&lt;br /&gt;
 Ein Wert nahe 1 bedeutet: „Das Objekt ist mit hoher Sicherheit da.“&lt;br /&gt;
==2. Einsatzort in Modellen wie YOLO==&lt;br /&gt;
In der Objekterkennung (z. B. YOLO) sitzt die Sigmoid-Funktion fast immer am allerletzten Ausgang (Output Layer) des Netzwerks und erfüllt dort zwei Aufgaben:&lt;br /&gt;
===Klassifizierung (Multi-Label-Klassifikation)===&lt;br /&gt;
 Wenn ein Modell erkennen soll, ob auf einem Bild ein „Mensch“, ein „Auto“ oder ein „Hund“ zu sehen ist, schaltet man für jede Klasse eine Sigmoid-Funktion am Ausgang. Das erlaubt es dem Netzwerk zu sagen: „Ich bin mir zu 95 % sicher, dass hier ein Mensch ist, und zu 80 % sicher, dass hier ein Auto ist“ (z. B. wenn ein Mensch im Auto sitzt).&lt;br /&gt;
===Begrenzungsrahmen (Bounding Box Regression)=== &lt;br /&gt;
Um zu verhindern, dass die vorhergesagten Koordinaten einer Box aus dem Bild &amp;quot;springen&amp;quot;, jagt man die Koordinaten-Werte durch ein Sigmoid. Dadurch liegen die Werte exakt zwischen 0 und 1 (relativ zur Rasterzelle) und die Box bleibt sauber im Bildbereich.&lt;br /&gt;
===Warum nutzt man sie nicht überall im Netzwerk? (Das Problem)===&lt;br /&gt;
In den inneren Schichten (Hidden Layers) eines CNNs nutzt man heute fast nie Sigmoid, sondern meistens ReLU (Rectified Linear Unit) oder Varianten wie SiLU (Swish).&lt;br /&gt;
Der Grund ist das berüchtigte Vanishing Gradient Problem (Verschwindender Gradient):&lt;br /&gt;
&lt;br /&gt;
Wenn die Werte sehr groß oder sehr klein werden, flacht die Sigmoid-Kurve extrem ab. Die Steigerung (Ableitung) der Kurve geht dann gegen Null. Beim Training des Netzwerks führt das dazu, dass die Fehlerkorrekturen (Gradienten) auf dem Rückweg durch das Netzwerk immer kleiner werden und die vorderen Schichten des Netzes aufhören zu lernen.&lt;br /&gt;
===Zusammenfassung: Sigmoid vs. Softmax===&lt;br /&gt;
&#039;&#039;&#039;Sigmoid:&#039;&#039;&#039; Berechnet die Wahrscheinlichkeit für jede Klasse unabhängig voneinander (Werte müssen sich nicht zu 100 % ergänzen). Ideal für Multi-Label-Probleme.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Softmax:&#039;&#039;&#039; Berechnet die Wahrscheinlichkeiten so, dass sich alle Ausgänge zusammen exakt zu 100 % (1.0) aufaddieren. Ideal, wenn sich Klassen gegenseitig ausschließen (z. B. Entweder Hund oder Katze).&lt;br /&gt;
&lt;br /&gt;
[[File:Sigmoid-Fkt_mit_Ableitung.png|1000px]]&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Sigmoid-Fkt_mit_Ableitung.png&amp;diff=5491</id>
		<title>Datei:Sigmoid-Fkt mit Ableitung.png</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Sigmoid-Fkt_mit_Ableitung.png&amp;diff=5491"/>
		<updated>2026-10-11T06:33:38Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=KI_Vokabel&amp;diff=5490</id>
		<title>KI Vokabel</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=KI_Vokabel&amp;diff=5490"/>
		<updated>2026-10-11T05:39:16Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* CrossEntropyLoss */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Maximal Arbitraer=&lt;br /&gt;
&lt;br /&gt;
In der Informatik und Mathematik hat das Konzept der maximalen Arbitrarität eine fundamentale, oft sehr technische Bedeutung. Hier geht es meist um echte Zufälligkeit oder das bewusste Ignorieren von Mustern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kryptographie-echte-zufallszahlen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Kryptographie &amp;amp;amp; Echte Zufallszahlen ==&lt;br /&gt;
&lt;br /&gt;
* Echter Zufall: Computer können von Natur aus nicht rein zufällig handeln. Sie sind deterministisch.&lt;br /&gt;
* Maximale Unvorhersehbarkeit: Für sichere Verschlüsselungen braucht man Schlüssel, die maximal arbiträr (unvorhersehbar) sind.&lt;br /&gt;
* Hardware-Zufall: Man nutzt physikalische Prozesse (wie atomaren Zerfall oder thermisches Rauschen), um diese absolute Willkür zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;algorithmen-arbitrary-choice&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Algorithmen &amp;amp;amp; „Arbitrary Choice“ ==&lt;br /&gt;
&lt;br /&gt;
* Reihenfolge ist egal: In der theoretischen Informatik bedeutet eine „arbiträre Auswahl“, dass ein Algorithmus irgendein Element wählt.&lt;br /&gt;
* Keine Bevorzugung: Es gibt keine Sortierung oder Priorität. Das Ergebnis des Algorithmus muss korrekt sein, egal welches Element zuerst gewählt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;beliebige-genauigkeit-arbitrary-precision&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Beliebige Genauigkeit (Arbitrary Precision) ==&lt;br /&gt;
&lt;br /&gt;
* Keine künstlichen Grenzen: Normalerweise speichert ein Computer Zahlen in festen Größen (z. B. 32-Bit oder 64-Bit).&lt;br /&gt;
* Unbegrenzte Kapazität: Bei Arbitrary-Precision-Arithmetik (BigInfs) entscheidet der Programmierer oder der Speicher dynamisch, wie groß eine Zahl sein darf. Die Grenze ist maximal flexibel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;software-testing-fuzzing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Software-Testing (Fuzzing) ==&lt;br /&gt;
&lt;br /&gt;
* Chaotische Eingaben: Beim sogenannten Fuzz-Testing wird Software mit maximal arbiträren, oft völlig sinnlosen Daten gefüttert.&lt;br /&gt;
* Sicherheitslücken finden: Das Ziel ist es, das Programm durch unvorhersehbare Eingaben zum Absturz zu bringen, um versteckte Bugs zu finden.&lt;br /&gt;
&lt;br /&gt;
Siehe auch Arbitrage. Beide Begriffe stammen vom lateinischen Substantiv arbiter (der Schiedsrichter, Richter oder Vermittler). Daraus bildete sich das lateinische Verb arbitrari (ermessen, entscheiden, glauben) und das Substantiv arbitratus („Gutdünken, freie Wahl, freies Ermessen“).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Zufallszahlen=&lt;br /&gt;
&lt;br /&gt;
 Computer koennen keine echten Zufallszahlen erzeugen.&lt;br /&gt;
&lt;br /&gt;
Ja, diese Aussage ist im Kern richtig, solange man von herkömmlichen Standard-Computern und reiner Software ausgeht. Standard-Computer sind deterministisch. Das bedeutet: Sie folgen strikten, logischen Regeln. Wenn ein Computer denselben Startwert (Seed) und denselben Algorithmus nutzt, wird er immer exakt dieselbe Zahlenfolge berechnen. In der Informatik unterscheidet man daher zwei Arten von Zufall: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pseudo-zufallszahlen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Pseudo-Zufallszahlen (PRNGs) – Kein echter Zufall ==&lt;br /&gt;
&lt;br /&gt;
* Die Methode: Reine Software-Algorithmen berechnen Zahlenreihen.&lt;br /&gt;
* Das Problem: Sie wirken für Menschen zufällig, sind es aber mathematisch nicht. Wer die Formel und den Startwert kennt, kann jede zukünftige Zahl perfekt vorhersagen.&lt;br /&gt;
* Einsatzbereich: Videospiele (z. B. Beute-Verteilung) oder statistische Simulationen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;echte-zufallszahlen-trngs-der-physikalische-trick&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Echte Zufallszahlen (TRNGs) – Der physikalische Trick ==&lt;br /&gt;
&lt;br /&gt;
Moderne Computer können heute über Umwege doch echten Zufall erzeugen. Dafür verlassen sie die reine Software-Ebene und nutzen die chaotische Physik der echten Welt:&lt;br /&gt;
&lt;br /&gt;
* Hardware-Zufallsgeneratoren: Speziell verbaute Chips messen winzige, unvorhersehbare physikalische Prozesse.&lt;br /&gt;
* Beispiele: Thermisches Rauschen (Wärme von Elektronen), atmosphärisches Rauschen, radioaktiver Zerfall oder das unregelmäßige Tippverhalten eines Nutzers auf der Tastatur, oder Mausbewegungen.&lt;br /&gt;
* Einsatzbereich: Hochsichere Verschlüsselungen (Kryptographie) und Banken-IT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fazit&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Ein Computer kann durch reines Nachdenken (Software) niemals echten Zufall erzeugen. Er benötigt dafür immer ein Stück unberechenbare Natur (Hardware). Möchtest du wissen, wie du in einer Programmiersprache wie Python oder JavaScript den Unterschied zwischen sicherem und unsicherem Zufall nutzt?&lt;br /&gt;
&lt;br /&gt;
=Regression=&lt;br /&gt;
In der Künstlichen Intelligenz (KI) und im &#039;&#039;&#039;Maschinellen Lernen&#039;&#039;&#039; ist Regression ein Verfahren, um eine kontinuierliche Zahl vorherzusagen. Das Ziel ist es, den mathematischen Zusammenhang zwischen Eingabedaten (z. B. Größe eines Hauses) und einem konkreten numerischen Ausgabewert (z. B. dem Preis) zu finden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;der-unterschied-regression-vs.-klassifikation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Der Unterschied: Regression vs. Klassifikation ==&lt;br /&gt;
&lt;br /&gt;
Um Regression zu verstehen, hilft der Vergleich mit der Klassifikation:&lt;br /&gt;
&lt;br /&gt;
* Klassifikation (Kategorien): „Ist diese Einnahme Betrug oder legal?“ oder „Ist auf dem Bild eine Katze oder ein Hund?“ (Ja/Nein oder Klassen).&lt;br /&gt;
* Regression (Zahlen): „Wie viel Euro wird dieses Haus kosten?“ oder „Wie hoch wird die Temperatur morgen sein?“ (Konkrete Zahlenwerte).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;typische-beispiele-aus-der-praxis&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Typische Beispiele aus der Praxis ==&lt;br /&gt;
&lt;br /&gt;
* Finanzen: Vorhersage des zukünftigen Preises einer Aktie.&lt;br /&gt;
* Immobilien: Schätzung des Marktwerts eines Hauses basierend auf Quadratmetern, Lage und Baujahr.&lt;br /&gt;
* Wetter: Berechnung der exakten Regenmenge in Millimetern für die nächste Woche.&lt;br /&gt;
* Logistik: Schätzung der genauen Lieferzeit (ETA) für ein Paket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wie-funktioniert-das-einfach-erklärt&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wie funktioniert das einfach erklärt? ==&lt;br /&gt;
&lt;br /&gt;
Stell dir eine Grafik mit vielen Punkten vor. Jeder Punkt ist ein Haus: Die X-Achse zeigt die Quadratmeter, die Y-Achse den Preis. Die einfachste Form der Regression (die lineare Regression) legt nun eine optimale gerade Linie so durch diese Punkte, dass der Abstand zu allen Punkten insgesamt so klein wie möglich ist. Wenn du nun ein neues Haus mit einer unbekannten Größe hast, schaut die KI einfach, wo dieser Wert auf der gezeichneten Linie liegt, und spuckt den passenden Preis aus. Möchtest du ein einfaches Code-Beispiel für eine Regression in Python sehen oder wissen, was der Unterschied zwischen linearer und nicht-linearer Regression ist?&lt;br /&gt;
&lt;br /&gt;
=Over-/Underfitting=&lt;br /&gt;
In der Künstlichen Intelligenz beschreiben Overfitting (Überanpassung) und Underfitting (Unteranpassung) die beiden Hauptfehler, die ein KI-Modell beim Lernen machen kann. Das Ziel ist immer die Generalisierung: Die KI soll Muster so lernen, dass sie auch bei völlig neuen, unbekannten Daten richtige Vorhersagen trifft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;overfitting-überanpassung-das-auswendiglernen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Overfitting (Überanpassung) – Das Auswendiglernen ==&lt;br /&gt;
&lt;br /&gt;
Beim Overfitting lernt die KI die Trainingsdaten zu gut. Sie merkt sich nicht nur die echten Regeln, sondern auch das zufällige Rauschen und Details der Beispiele.&lt;br /&gt;
&lt;br /&gt;
* Das Problem: Das Modell verhält sich wie ein Schüler, der die Übungsaufgaben für die Klassenarbeit exakt auswendig lernt, aber das zugrunde liegende Prinzip nicht versteht.&lt;br /&gt;
* Der Effekt: Bei den bekannten Trainingsdaten ist die Genauigkeit perfekt (fast 100 %). Sobald die KI aber neue, unbekannte Daten sieht, versagt sie völlig.&lt;br /&gt;
* Ursache: Das KI-Modell ist zu komplex für die kleine Menge an Daten, oder es wurde zu lange trainiert.&lt;br /&gt;
&lt;br /&gt;
* Modell lernt die Analyse der Trainingsdaten auswendig.&lt;br /&gt;
* Einmodellierung von Rauschfaktoren&lt;br /&gt;
* Neue Daten ohne Rauschen passen nicht ins Modell&lt;br /&gt;
* Mangelnde Generalisierbarkeit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;underfitting-unteranpassung-das-übergeneralisieren&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. Underfitting (Unteranpassung) – Das Übergeneralisieren ==&lt;br /&gt;
&lt;br /&gt;
Beim Underfitting ist das Modell zu einfach gebaut. Es schafft es nicht einmal, die Struktur der Trainingsdaten richtig zu erfassen.&lt;br /&gt;
&lt;br /&gt;
* Das Problem: Der Schüler ist zu faul oder das Thema ist zu schwer. Er versteht weder die Übungsaufgaben noch die echten Prinzipien.&lt;br /&gt;
* Der Effekt: Die Genauigkeit ist sowohl bei den Trainingsdaten als auch bei neuen Daten sehr schlecht.&lt;br /&gt;
* Ursache: Das Modell ist zu simpel (z. B. eine gerade Linie für ein kurviges Problem) oder es wurde zu kurz trainiert.&lt;br /&gt;
* Das Modell konnte keinen Zusammenhang zwischen den Ein- und Ausgabedaten erkennen.&lt;br /&gt;
* Vorhersagen höchst ungenau&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;der-visuelle-vergleich-am-beispiel-einer-hauspreis-regression&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Der visuelle Vergleich (am Beispiel einer Hauspreis-Regression) ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Underfitting (Zu einfach)&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Sweet Spot (Perfekt)&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Overfitting (Zu komplex)&lt;br /&gt;
|-&lt;br /&gt;
| Eine starre, gerade Linie durch eine wellige Punktewolke.&lt;br /&gt;
| Eine sanfte Kurve, die den echten Trend der Punkte abbildet.&lt;br /&gt;
| Eine wilde Schlangenlinie, die exakt durch jeden einzelnen Punkt zackt.&lt;br /&gt;
|-&lt;br /&gt;
| KI versteht den Trend nicht.&lt;br /&gt;
| KI versteht das Prinzip.&lt;br /&gt;
| KI lernt Fehler und Zufälle mit.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wie-löst-man-das&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wie löst man das? ==&lt;br /&gt;
&lt;br /&gt;
* Gegen Overfitting: Mehr Trainingsdaten hinzufügen, das Modell vereinfachen (weniger Parameter) oder das Training früher abbrechen (Early Stopping).&lt;br /&gt;
* Gegen Underfitting: Ein komplexeres Modell wählen, dem Modell mehr Merkmale (Features) der Daten zur Verfügung stellen oder länger trainieren.&lt;br /&gt;
&lt;br /&gt;
=Regularisierung=&lt;br /&gt;
In der Praxis ist Regularisierung die wichtigste Bremse gegen Overfitting. Sie sorgt dafür, dass ein KI-Modell beim Lernen „bestraft“ wird, wenn es zu komplex, zu flexibel oder zu wild wird. Das Ziel ist es, die Kurve oder die mathematische Formel des Modells bewusst flacher und einfacher zu halten, damit sie sich nicht an jeden einzelnen Datenpunkt klammert. Hier sind die drei bekanntesten Methoden der Regularisierung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;l2-regularisierung-ridge-regression-die-gewichtsbremse&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. L2-Regularisierung (Ridge Regression) – Die Gewichtsbremse ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Jedes Mal, wenn die KI ein Merkmal (z. B. die Anzahl der Badezimmer) extrem stark gewichtet, verhängt die Regularisierung eine mathematische Strafe. Sie zwingt das Modell, alle Gewichte möglichst klein und nah an Null zu halten.&lt;br /&gt;
* Der Effekt: Keine einzelne Eigenschaft darf das gesamte Modell dominieren. Die Vorhersage-Kurve wird dadurch weicher und stabiler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;l1-regularisierung-lasso-die-radikalkur&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. L1-Regularisierung (Lasso) – Die Radikalkur ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Auch hier werden große Gewichte bestraft, aber L1 ist aggressiver als L2. Wenn ein Merkmal für die Vorhersage nicht wirklich wichtig ist, drückt L1 das Gewicht dieses Merkmals exakt auf Null.&lt;br /&gt;
* Der Effekt: Unwichtige Eigenschaften werden komplett aussortiert. Das Modell wird schlanker und nutzt am Ende nur noch die Variablen, die wirklich einen Unterschied machen (Feature Selection).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dropout-der-trick-für-neuronale-netze&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Dropout – Der Trick für Neuronale Netze ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Beim Training von tiefen Neuronalen Netzen schaltet man in jedem Durchgang zufällig (z. B. zu 50 %) einen Teil der künstlichen Neuronen ab.&lt;br /&gt;
* Der Effekt: Die Neuronen dürfen sich nicht mehr aufeinander verlassen. Sie können sich keine „Geheimabsprachen“ merken, um bestimmte Trainingsdaten auswendig zu lernen. Jedes Neuron muss nun eigenständig nützliche Muster erkennen. Das Netzwerk wird dadurch extrem robust.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;zusammenfassung&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
Regularisierung fügt der KI ein wenig Disziplin hinzu. Sie sagt dem Modell: „Finde eine Lösung, aber mach sie so einfach und elegant wie möglich!“ Möchtest du sehen, wie man eine L1- oder L2-Regularisierung mit wenigen Zeilen Code in einer Python-Bibliothek wie scikit-learn einbaut?&lt;br /&gt;
&lt;br /&gt;
==Beispiel scikit-learn==&lt;br /&gt;
Hier ist das Beispiel mit der Bibliothek scikit-learn. Wir vergleichen die Standard-Regression (ohne Bremse) mit L1 (Lasso) und L2 (Ridge).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sklearn.linear_model import LinearRegression, Ridge, Lassofrom sklearn.model_selection import train_test_split&lt;br /&gt;
&lt;br /&gt;
# 1. Daten aufteilen (X = Eigenschaften, y = Zielwert/Preis)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)&lt;br /&gt;
# 2. Ohne Regularisierung (Neigt bei vielen Merkmalen zu Overfitting)model_standard = LinearRegression()&lt;br /&gt;
model_standard.fit(X_train, y_train)&lt;br /&gt;
# 3. L2-Regularisierung (Ridge) -&amp;gt; Hält alle Gewichte kleinmodel_l2 = Ridge(alpha=1.0)  # alpha ist die Stärke der Bestrafung&lt;br /&gt;
model_l2.fit(X_train, y_train)&lt;br /&gt;
# 4. L1-Regularisierung (Lasso) -&amp;gt; Setzt unwichtige Gewichte auf exakt Nullmodel_l1 = Lasso(alpha=0.1)&lt;br /&gt;
model_l1.fit(X_train, y_train)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;was-bewirkt-der-parameter-alpha&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Was bewirkt der Parameter alpha? ==&lt;br /&gt;
&lt;br /&gt;
* alpha = 0: Keine Regularisierung (entspricht der Standard-Regression).&lt;br /&gt;
* alpha sehr hoch: Die Strafe ist extrem streng. Das Modell wird zu stark vereinfacht (Gefahr von Underfitting).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;welches-modell-wählt-man-wann&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Welches Modell wählt man wann? ==&lt;br /&gt;
&lt;br /&gt;
* Ridge (L2): Wenn du glaubst, dass fast alle deine Merkmale ein bisschen wichtig für die Vorhersage sind.&lt;br /&gt;
* Lasso (L1): Wenn du sehr viele Merkmale hast, aber vermutest, dass nur ein paar wenige davon wirklich relevant sind (der Rest wird auf Null gesetzt).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Rauschen=&lt;br /&gt;
&lt;br /&gt;
Unter Rauschfaktoren (oft auch einfach als Rauschen oder Noise bezeichnet) versteht man in der Künstlichen Intelligenz unerwünschte, fehlerhafte oder irrelevante Daten, die ein KI-Modell ablenken und seine Genauigkeit verschlechtern. [1] In der KI gilt die Grundregel: „Garbage in, garbage out“ (Müll rein, Müll raus). Rauschfaktoren sind genau dieser „Müll“, der die echten Muster in den Daten überlagert. [1, 2] Man unterscheidet im Wesentlichen vier Arten von Rauschfaktoren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;datenrauschen-data-noise&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Datenrauschen (Data Noise) ==&lt;br /&gt;
&lt;br /&gt;
Das sind Fehler, die direkt in den Datensätzen stecken, mit denen die KI trainiert wird: [1]&lt;br /&gt;
&lt;br /&gt;
* Messfehler: Defekte Sensoren (z. B. bei autonomen Autos), die falsche Werte liefern.&lt;br /&gt;
* Menschliche Fehler: Falsch beschriftete Daten (z. B. wenn beim Training ein Bild von einer Katze fälschlicherweise als „Hund“ gelabelt wurde).&lt;br /&gt;
* Ausreißer (Outliers): Extrem ungewöhnliche Einzelereignisse in den Daten, die den Gesamttrend verfälschen. [1, 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;signalrauschen-signal-noise&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Signalrauschen (Signal Noise) ==&lt;br /&gt;
&lt;br /&gt;
Hierbei handelt es sich um physikalische Störungen bei der Live-Anwendung der KI: [3]&lt;br /&gt;
&lt;br /&gt;
* Audio-KI: Hintergrundgeräusche (z. B. Baustellenlärm oder Stimmengewirr im Krankenhaus), die es einem Sprachassistenten erschweren, Befehle korrekt zu verstehen. [4]&lt;br /&gt;
* Bild-KI: Bildrauschen bei Nachtaufnahmen (Körnigkeit durch schlechte Lichtverhältnisse), wodurch die KI Objekte oder Gesichter nicht mehr richtig erkennt. [5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;syntaktischesstrukturelles-rauschen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Syntaktisches/Strukturelles Rauschen ==&lt;br /&gt;
&lt;br /&gt;
Dies betrifft vor allem generative KIs (wie ChatGPT): [6]&lt;br /&gt;
&lt;br /&gt;
* Kontextloses Füllen: Wenn ein KI-Modell mit unstrukturierten Texten gefüttert wird, die viele Füllwörter oder irrelevanten Code enthalten, verliert es den Fokus auf den eigentlichen Inhalt. Die KI lernt dann das „Rauschen“ des Schreibstils statt der echten Fakten. [7]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;der-paradoxe-twist-warum-ki-manchmal-rauschen-braucht&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Der paradoxe Twist: Warum KI manchmal Rauschen braucht ==&lt;br /&gt;
&lt;br /&gt;
Obwohl Rauschfaktoren meistens eliminiert werden sollen (z. B. durch Datenbereinigung oder Filter), setzen Entwickler Rauschen in zwei Fällen gezielt als Werkzeug ein: [8, 9]&lt;br /&gt;
&lt;br /&gt;
# Gegen Overfitting (Regularisierung): Man fügt den Trainingsdaten absichtlich künstliches Rauschen hinzu. Die KI lernt dadurch, ungenaue Realdaten zu erwarten, und wird robuster gegen Fehler im echten Leben. [9, 10, 11]&lt;br /&gt;
# Bildgenerierung (Diffusionsmodelle): KIs wie Midjourney oder Stable Diffusion erzeugen Bilder, indem sie mit einem komplett verrauschten Pixel-Chaos starten und dieses Schritt für Schritt gezielt „entrauschen“, bis ein klares Bild entsteht. [12]&lt;br /&gt;
&lt;br /&gt;
Möchtest du wissen, wie man Datenrauschen vor dem KI-Training herausfiltert, oder interessiert dich, wie Bild-KIs Rauschen nutzen, um neue Kunstwerke zu erschaffen? [12]&lt;br /&gt;
&lt;br /&gt;
[1] [https://deepchecks.com/glossary/noise-in-machine-learning/ https://deepchecks.com] [2] [https://www.fau.de/2024/11/news/forschung/kuenstliche-intelligenz/zufaelliges-rauschen-verbessert-leistung-von-ki-systemen/ https://www.fau.de] [3] [https://www.youtube.com/watch?v=PQV5qtS1E1U&amp;amp;t=33 https://www.youtube.com] [4] [https://www.youtube.com/watch?v=uoBknPqpm2w&amp;amp;t=15 https://www.youtube.com] [5] [https://www.youtube.com/watch?v=J52RHqpbzDU https://www.youtube.com] [6] [https://digitalzentrum-berlin.de/ki-modelle-im-faktencheck-chatgpt-und-co-liefern-oft-falschaussagen https://digitalzentrum-berlin.de] [7] [https://mstone.ai/blog/reducing-noise-factors-when-evaluating-genai/ https://mstone.ai] [8] [https://www.dhiria.com/en/blog/noise-in-ai-from-disturbance-to-creative-tool https://www.dhiria.com] [9] [https://www.innovatiana.com/en/post/add-noise-in-ai https://www.innovatiana.com] [10] [https://www.sciencedirect.com/science/article/pii/S2772508126000037 https://www.sciencedirect.com] [11] [https://www.youtube.com/watch?v=tcY0MZQGqWE https://www.youtube.com] [12] [https://www.youtube.com/watch?v=p_FNE5Q-180&amp;amp;t=3 https://www.youtube.com]&lt;br /&gt;
&lt;br /&gt;
=Train-Test-Split=&lt;br /&gt;
&lt;br /&gt;
Der Train-Test-Split (Aufteilung in Trainings- und Testdaten) ist der wichtigste Kontrollschritt beim maschinellen Lernen. Er verhindert, dass man die Leistung einer KI falsch einschätzt, und deckt Overfitting sofort auf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;das-prinzip&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Das Prinzip ==&lt;br /&gt;
&lt;br /&gt;
Man nimmt seinen gesamten Datensatz und schneidet ihn in zwei Teile:&lt;br /&gt;
&lt;br /&gt;
# Trainingsdaten (ca. 70–80 %): Mit diesem Teil lernt die KI. Sie sucht nach Mustern und passt ihre internen Gewichte an.&lt;br /&gt;
# Testdaten (ca. 20–30 %): Dieser Teil wird weggeschlossen. Erst wenn das Training komplett vorbei ist, muss die KI für diese Daten Vorhersagen treffen. Da sie diese Daten noch nie gesehen hat, simuliert dies den Einsatz im echten Leben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;warum-ist-das-zwingend-notwendig&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Warum ist das zwingend notwendig? ==&lt;br /&gt;
&lt;br /&gt;
Wenn man eine KI auf denselben Daten testet, auf denen sie gelernt hat, betrügt man sich selbst. Ein Modell, das einfach nur alle Daten auswendig gelernt hat (Overfitting), würde eine Genauigkeit von 100 % anzeigen. Erst beim Testen mit den isolierten Testdaten zeigt sich, ob die KI die Prinzipien wirklich verstanden hat. ## Das goldene Gesetz: Data Leakage verhindern Es darf niemals Information aus dem Testset in das Trainingsset fließen (Data Leakage).&lt;br /&gt;
&lt;br /&gt;
* Beispiel: Wenn du Daten vor dem Split skalierst oder den Mittelwert bildest, kennt das Trainingsset bereits Eigenschaften des Testsets. Das verfälscht das Testergebnis komplett.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;code-beispiel-scikit-learn&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Code-Beispiel (scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Der Split wird in Python standardmäßig so durchgeführt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sklearn.model_selection import train_test_split &lt;br /&gt;
# test_size=0.2 bedeutet: 80% Training, 20% Test&lt;br /&gt;
# random_state fixiert den Zufall, damit der Split reproduzierbar bleibtX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trainingsdaten gut und Testdaten schlecht =&amp;gt; Overfitted&lt;br /&gt;
Trainingsdaten schlecht und Testdaten schlecht =&amp;gt; ?&lt;br /&gt;
Trainingsdaten gut und Testdaten gut =&amp;gt; gutes Modell&lt;br /&gt;
Trainingsdaten schlecht und Testdaten gut =&amp;gt; Fehler&lt;br /&gt;
&lt;br /&gt;
Hier ist die gewünschte Zusammenfassung im Markdown-Format:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Zustand im Training&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Zustand im Test&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Diagnose&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Maßnahme&lt;br /&gt;
|-&lt;br /&gt;
| Gut&lt;br /&gt;
| Schlecht&lt;br /&gt;
| Overfitting (Überanpassung)&lt;br /&gt;
| Modell vereinfachen, Daten erhöhen, Regularisierung nutzen.&lt;br /&gt;
|-&lt;br /&gt;
| Schlecht&lt;br /&gt;
| Schlecht&lt;br /&gt;
| Underfitting (Unteranpassung)&lt;br /&gt;
| Modell komplexer machen, mehr Features hinzufügen.&lt;br /&gt;
|-&lt;br /&gt;
| Gut&lt;br /&gt;
| Gut&lt;br /&gt;
| Optimales Modell (Sweet Spot)&lt;br /&gt;
| Keine Aktion nötig. Bereit für den Produktiveinsatz.&lt;br /&gt;
|-&lt;br /&gt;
| Schlecht&lt;br /&gt;
| Gut&lt;br /&gt;
| Fehler / Artefakt (Unnatürlich)&lt;br /&gt;
| Code auf Data Leakage prüfen; Verteilung der Datensätze prüfen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-vier-fälle-im-detail&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die vier Fälle im Detail ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;trainingsdaten-gut-und-testdaten-schlecht-overfitting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Trainingsdaten gut und Testdaten schlecht =&amp;amp;gt; Overfitting ==&lt;br /&gt;
&lt;br /&gt;
Das Modell hat die Trainingsdaten quasi auswendig gelernt, inklusive aller Fehler, Ausreißer und des Rauschens. Es verhält sich wie ein Schüler, der die Übungsaufgaben für eine Klausur exakt auswendig lernt, aber das mathematische Prinzip dahinter nicht begreift. Sobald neue, unbekannte Daten (Testdaten) eingespeist werden, bricht die Leistung ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;trainingsdaten-schlecht-und-testdaten-schlecht-underfitting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Trainingsdaten schlecht und Testdaten schlecht =&amp;amp;gt; Underfitting ==&lt;br /&gt;
&lt;br /&gt;
Das Modell ist zu simpel gebaut oder wurde nicht lange genug trainiert, um überhaupt ein Muster in den Daten zu erkennen. Wenn man versucht, eine komplexe, geschwungene Datenwolke mit einer starren, geraden Linie vorherzusagen, trifft das Modell weder die bekannten noch die unbekannten Daten gut. Es hat den zugrunde liegenden Trend einfach nicht verstanden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;trainingsdaten-gut-und-testdaten-gut-optimales-modell&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Trainingsdaten gut und Testdaten gut =&amp;amp;gt; Optimales Modell ==&lt;br /&gt;
&lt;br /&gt;
Das ist das perfekte Ziel-Szenario. Das Modell hat die echten, allgemeingültigen Zusammenhänge aus den Daten extrahiert, ohne sich an Details zu überanpassen. Es liefert sowohl auf bekannten als auch auf völlig neuen Daten stabile und präzise Vorhersagen. Das Modell hat erfolgreich generalisiert und ist bereit für die Praxis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;trainingsdaten-schlecht-und-testdaten-gut-systemfehler&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Trainingsdaten schlecht und Testdaten gut =&amp;amp;gt; Systemfehler ==&lt;br /&gt;
&lt;br /&gt;
Dieses Verhalten ist mathematisch unnatürlich. Eine KI kann auf unbekannten Daten logischerweise nicht besser performen als auf den Daten, mit denen sie trainiert wurde. Tritt dieser Fall auf, liegt fast immer ein technisches Problem vor – wie Data Leakage (Daten aus dem Testset sind unbemerkt ins Training gesickert), ein starkes Daten-Ungleichgewicht (das Testset enthält zufällig nur sehr leichte Beispiele) oder eine viel zu restriktive Regularisierung während des Trainings. Soll ich dir zeigen, wie du diese vier Zustände mit einer Grafik (Learning Curve) direkt beim Trainieren deiner KI sichtbar machen kannst?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weitere Begriffe: geschichteter Split / Stratified Split)&lt;br /&gt;
&lt;br /&gt;
=Kreuzvalidierung (K-Fold/Cross-Validation)=&lt;br /&gt;
&lt;br /&gt;
Die Kreuzvalidierung (engl. Cross-Validation, meist als K-Fold Cross-Validation durchgeführt) ist die Weiterentwicklung des einfachen Train-Test-Splits. Während ein einfacher Split die Daten nur ein einziges Mal teilt, wiederholt die Kreuzvalidierung diesen Prozess mehrfach. Das Ziel ist es, jeden einzelnen Datenpunkt genau einmal zum Testen zu verwenden. Damit schließt man aus, dass ein Modell nur durch Zufall (Glück oder Pech beim Split) gut abgeschnitten hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;das-prinzip-wie-funktioniert-k-fold&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Das Prinzip: Wie funktioniert K-Fold? ==&lt;br /&gt;
&lt;br /&gt;
Das Wort „K“ steht für eine Zahl (sehr oft wählt man K = 5 oder K = 10). Diese Zahl bestimmt, in wie viele gleich große Teile (Folds) die Daten zerlegt werden. Bei einer 5-fachen Kreuzvalidierung passiert Folgendes:&lt;br /&gt;
&lt;br /&gt;
# Die Daten werden in 5 Blöcke (Block 1 bis 5) unterteilt.&lt;br /&gt;
# Es finden 5 aufeinanderfolgende Durchgänge statt:&lt;br /&gt;
#* Durchgang 1: Blöcke 1, 2, 3, 4 sind das Trainingsteam – Block 5 ist das Testteam.&lt;br /&gt;
#* Durchgang 2: Blöcke 1, 2, 3, 5 sind das Trainingsteam – Block 4 ist das Testteam.&lt;br /&gt;
#* Durchgang 3: Blöcke 1, 2, 4, 5 sind das Trainingsteam – Block 3 ist das Testteam.&lt;br /&gt;
#* Durchgang 4: Blöcke 1, 3, 4, 5 sind das Trainingsteam – Block 2 ist das Testteam.&lt;br /&gt;
#* Durchgang 5: Blöcke 2, 3, 4, 5 sind das Trainingsteam – Block 1 ist das Testteam.&lt;br /&gt;
#Am Ende berechnet man den Mittelwert aller 5 Testergebnisse.&lt;br /&gt;
&lt;br /&gt;
===Warum macht man das? (Die Vorteile)===&lt;br /&gt;
Maximale Datennutzung: Besonders bei kleinen Datensätzen wertvoll, da jedes Datenbeispiel mal zum Trainieren und mal zum Testen genutzt wird. &lt;br /&gt;
* Verlässliche Metriken: Wenn das Modell in allen 5 Durchgängen eine Genauigkeit von ca. 85 % erzielt, ist es stabil. Schwankt es zwischen 60 % und 95 %, ist das Modell instabil und unzuverlässig. &lt;br /&gt;
* Perfekt für Hyperparametertuning: Man nutzt die Kreuzvalidierung, um die besten Einstellungen (wie das optimale alpha bei der L1/L2-Regularisierung) zu finden, ohne die finalen, echten Testdaten anzurühren.&lt;br /&gt;
*Schaetzt Fehler besser ab als Train-Test-Split&lt;br /&gt;
&lt;br /&gt;
* Nachteil: dauert laenger&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;code-beispiel-in-python-scikit-learn&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code-Beispiel in Python (scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
In der Praxis musst du diese Schleifen nicht selbst schreiben. scikit-learn übernimmt das mit einer einzigen Zeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sklearn.model_selection import cross_val_scorefrom &lt;br /&gt;
from sklearn.linear_model import Ridge &lt;br /&gt;
&lt;br /&gt;
model = Ridge(alpha=1.0) &lt;br /&gt;
&lt;br /&gt;
# cv=5 bedeutet 5-fache Kreuzvalidierung&lt;br /&gt;
# Es gibt uns direkt 5 Genauigkeits-Scores zurück&lt;br /&gt;
scores = cross_val_score(model, X, y, cv=5)&lt;br /&gt;
&lt;br /&gt;
print(“Scores der 5 Durchgänge:”, scores) &lt;br /&gt;
print(“Mittlere Genauigkeit:”, scores.mean())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Begriffe: Stratified K-Fold (geschichtete Kreuzvalidierung) Zwingend bei ungleich verteilten Klassen (z.B. seltenen Krankheiten).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Clustering=&lt;br /&gt;
Clustering ist ein zentrales Verfahren des Unüberwachten Lernens (Unsupervised Learning) in der Künstlichen Intelligenz. Im Gegensatz zur Regression oder Klassifikation gibt es hier keine vorgegebenen Labels oder Zielwerte (wie z. B. Preise oder Kategorien). Die KI bekommt lediglich einen Haufen Daten und muss selbstständig Gruppen (Cluster) finden. Das Ziel ist es, Datenpunkte so aufzuteilen, dass Elemente innerhalb einer Gruppe sich maximal ähnlich sind, während die Gruppen untereinander sich maximal unterscheiden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-3-bekanntesten-clustering-algorithmen-1.-k-means-der-klassiker&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Die 3 bekanntesten Clustering-Algorithmen==&lt;br /&gt;
1. k-Means (Der Klassiker)&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Du gibst der KI vor, wie viele Gruppen (k) es geben soll. Der Algorithmus platziert zufällig k Mittelpunkte (Zentren) und ordnet jeden Datenpunkt dem nächstgelegenen Zentrum zu. Danach werden die Zentren neu berechnet. Das wiederholt sich, bis die Gruppen stabil sind.&lt;br /&gt;
* Nachteil: Man muss die Anzahl der Gruppen vorab kennen. Zudem funktioniert es nur gut bei kreisförmigen/kugelförmigen Datenwolken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dbscan-der-dichte-spezialist&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. DBSCAN (Der Dichte-Spezialist) ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Dieser Algorithmus sucht nach Regionen, in denen Datenpunkte besonders dicht beieinanderliegen.&lt;br /&gt;
* Vorteil: Er erkennt Gruppen mit völlig beliebigen, komplexen Formen (z. B. eine Gruppe, die sich halbmondförmig um eine andere legt). Zudem erkennt er Ausreißer (Rauschen) automatisch und sortiert sie aus. Du musst die Anzahl der Cluster nicht im Voraus wissen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hierarchisches-clustering-der-stammbaum&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Hierarchisches Clustering (Der Stammbaum) ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Entweder startet jeder Punkt als eigenes Cluster und die KI verschmilzt die ähnlichsten Punkte Schritt für Schritt (Agglomerativ), oder alle starten in einer Gruppe und werden immer feiner aufgeteilt (Divisiv).&lt;br /&gt;
* Ergebnis: Es entsteht ein Baumdiagramm (Dendrogramm), an dem man visuell ablesen kann, welche Daten wie stark miteinander verwandt sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;typische-praxisbeispiele&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Typische Praxisbeispiele ==&lt;br /&gt;
&lt;br /&gt;
* Kundensegmentierung: Eine Marketing-KI analysiert Kaufverhalten und teilt Kunden in Gruppen ein (z. B. „Schnäppchenjäger“, „Premium-Käufer“, „Gelegenheitskäufer“).&lt;br /&gt;
* Bildsegmentierung: Pixel mit ähnlichen Farben und Helligkeiten werden gruppiert, um Objekte auf einem Bild zu isolieren (wichtig für autonomes Fahren).&lt;br /&gt;
* Anomalieerkennung: Wenn Kreditkartentransaktionen geclustert werden und eine Transaktion völlig abseits aller Gruppen liegt, schlägt das System wegen Betrugsverdacht Alarm.&lt;br /&gt;
&lt;br /&gt;
Weitere Begriffe: k-Means  Wie die KI die optimale Anzahl an Clustern (z. B. mit der Ellbogen-Methode) selbst herausfindet?&lt;br /&gt;
&lt;br /&gt;
=Silhouette Methode=&lt;br /&gt;
Die Silhouette-Methode ist neben der Ellbogen-Methode das wichtigste Werkzeug, um die Qualität eines Clusterings zu bewerten und die optimale Anzahl an Gruppen (k) zu bestimmen. Während die Ellbogen-Methode nur misst, wie kompakt die Cluster sind, prüft die Silhouette-Methode zusätzlich, ob die Cluster sauber voneinander getrennt sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;der-silhouette-koeffizient-die-mathematische-idee&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Der Silhouette-Koeffizient (Die mathematische Idee) ==&lt;br /&gt;
&lt;br /&gt;
Für jeden einzelnen Datenpunkt berechnet die Methode einen Wert zwischen -1 und +1:&lt;br /&gt;
&lt;br /&gt;
* a (Kompaktheit): Der durchschnittliche Abstand des Punktes zu allen anderen Punkten im eigenen Cluster (sollte möglichst klein sein).&lt;br /&gt;
* b (Trennung): Der durchschnittliche Abstand des Punktes zu den Punkten im nächstgelegenen fremden Cluster (sollte möglichst groß sein).&lt;br /&gt;
&lt;br /&gt;
Daraus ergibt sich der Wert für einen Punkt: &amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{Silhouette} = \frac{b - a}{\max(a, b)}&amp;lt;/math&amp;gt; ## Wie interpretiert man das Ergebnis? Wenn man das Clustering für den gesamten Datensatz bewertet, bildet man den Mittelpunkt aller Einzelwerte:&lt;br /&gt;
&lt;br /&gt;
* Nahe +1: Perfektes Clustering. Die Punkte liegen dicht zusammen und sind weit von anderen Gruppen entfernt.&lt;br /&gt;
* Nahe 0: Die Cluster überlappen sich stark. Punkte liegen genau auf den Entscheidungsgrenzen.&lt;br /&gt;
* Nahe -1: Fehlplatzierung. Die Punkte wurden vermutlich dem falschen Cluster zugeordnet.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| ## Die optimale Clusteranzahl finden&lt;br /&gt;
|-&lt;br /&gt;
| Um die beste Anzahl an Clustern (k) zu finden, lässt man den Algorithmus (z. B. k-Means) für verschiedene Werte (z. B. k = 2, 3, 4, 5) laufen.&lt;br /&gt;
|-&lt;br /&gt;
| Die Regel lautet: Die Zahl k, die den höchsten durchschnittlichen Silhouette-Koeffizienten liefert, ist mathematisch gesehen die beste Wahl für deine Daten.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;code-beispiel-in-python-scikit-learn&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Code-Beispiel in Python (scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
from sklearn.cluster import KMeansfrom sklearn.metrics import silhouette_score # Wir testen verschiedene Cluster-Anzahlen von 2 bis 5for k in: kmeans = KMeans(n_clusters=k, random_state=42).fit(X) labels = kmeans.labels_&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Berechne den durchschnittlichen Score für dieses k&lt;br /&gt;
score = silhouette_score(X, labels)&lt;br /&gt;
print(f&amp;amp;quot;Für k={k} ist der Silhouette-Score: {score:.3f}&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Weitere Begriffe: Silhouette-Plot um unsaubere Cluster optisch sofort zu entlarven.&lt;br /&gt;
&lt;br /&gt;
=Reinforcement Learning=&lt;br /&gt;
Reinforcement Learning (Bestärkendes Lernen) ist neben dem überwachten (Supervised) und unüberwachten (Unsupervised) Lernen die dritte große Säule des maschinellen Lernens. Das Prinzip basiert auf Psychologie und Evolution: Eine KI lernt hier nicht durch historische Daten, sondern durch Versuch und Irrtum (Trial and Error) sowie durch ein System aus Belohnung und Bestrafung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-4-kernkomponenten-des-reinforcement-learnings&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Die 4 Kernkomponenten des Reinforcement Learnings ==&lt;br /&gt;
&lt;br /&gt;
* Der Agent (Die KI): Das System, das lernen soll (z. B. der Autopilot eines Autos oder eine Spielfigur).&lt;br /&gt;
* Die Umgebung (Environment): Die Welt, in der sich der Agent bewegt (z. B. die Straße oder das Schachbrett).&lt;br /&gt;
* Die Aktion (Action): Die Züge oder Schritte, die der Agent machen kann (z. B. Bremsen, Beschleunigen, Nach-links-Lenken).&lt;br /&gt;
* Die Belohnung (Reward): Das Feedback der Umgebung. Ein positiver Wert für gutes Verhalten (z. B. Ziel erreicht) oder ein negativer Wert für Fehler (z. B. Unfall gebaut).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wie-der-lernprozess-abläuft&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wie der Lernprozess abläuft ==&lt;br /&gt;
&lt;br /&gt;
# Völliges Chaos zu Beginn: Der Agent weiß am Anfang absolut nichts über die Welt. Er wählt seine Aktionen maximal arbiträr (zufällig) aus.&lt;br /&gt;
# Das Feedback: Macht er etwas richtig, kriegt er Pluspunkte. Macht er etwas falsch, kriegt er Minuspunkte.&lt;br /&gt;
# Die Optimierung: Der Agent versucht über Millionen von Durchgängen, seine Strategie (Policy) mathematisch so anzupassen, dass er die langfristige Summe aller Belohnungen maximiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;berühmte-praxisbeispiele&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Berühmte Praxisbeispiele ==&lt;br /&gt;
&lt;br /&gt;
* Gaming-KIs: Googles AlphaGo schlug den Weltmeister im extrem komplexen Brettspiel Go. Andere KIs lernten durch Reinforcement Learning, Videospiele wie Super Mario, StarCraft oder Dota 2 auf Profi-Niveau zu spielen.&lt;br /&gt;
* Robotik &amp;amp;amp; Autonomes Fahren: Roboter lernen, wie sie laufen, Greifarme bewegen oder Hindernissen ausweichen, indem sie in virtuellen Simulationen Millionen Mal abstürzen, bis sie die perfekte Balance finden.&lt;br /&gt;
* ChatGPT (RLHF): Moderne Sprachmodelle nutzen Reinforcement Learning from Human Feedback. Menschliche Trainer bewerten die Antworten der KI. Die KI lernt dadurch, nützlicher, freundlicher und sicherer zu antworten.&lt;br /&gt;
* Multi-Agent Hide and Seek bezieht sich meist auf ein berühmtes KI-Experiment von OpenAI (2019)https://openai.com/index/emergent-tool-use/. Dabei wurden zwei Teams von KI-Agenten (Hiders und Seekers) mittels Reinforcement Learning in eine virtuelle 3D-Welt gesetzt, um Verstecken zu spielen.&lt;br /&gt;
&lt;br /&gt;
Weitere Begriffe: Exploration-Exploitation-Dilemma (der Konflikt zwischen Neuem ausprobieren und Bekanntes nutzen), Q-Learning&lt;br /&gt;
&lt;br /&gt;
==Historischer Kontext==&lt;br /&gt;
Das Verstärkende Lernen ist historisch gesehen völlig unabhängig von neuronalen Netzen entstanden. Es bildete ein ganz eigenes historisches Teilgebiet, das seine Wurzeln weit vor dem heutigen KI-Boom hatte. [1, 2] Die Entstehung des Reinforcement Learnings basiert historisch auf der Verschmelzung zweier völlig unterschiedlicher Denkschulen: [1]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-psychologische-wurzel-trial-and-error-verhaltensbiologie&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1. Die psychologische Wurzel: “Trial-and-Error” (Verhaltensbiologie) ===&lt;br /&gt;
&lt;br /&gt;
Lange bevor es Computer gab, untersuchten Psychologen, wie Tiere und Menschen lernen.&lt;br /&gt;
&lt;br /&gt;
* Edward Thorndikes „Gesetz des Effekts“ (1898): Er stellte fest, dass Reaktionen, die eine angenehme Konsequenz haben, häufiger wiederholt werden. [3]&lt;br /&gt;
* B.F. Skinner (Operante Konditionierung): Er trainierte Tauben und Ratten in Boxen rein über Belohnung und Bestrafung. [4]&lt;br /&gt;
* Die Brücke zur Informatik: Bereits 1948 schlug Alan Turing ein „Pleasure-Pain-System“ für Maschinen vor. 1952 baute Claude Shannon die mechanische Maus „Theseus“, die rein durch Versuch und Irrtum den Weg aus einem Labyrinth erlernte. [5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-mathematische-wurzel-optimal-control-regelungstechnik&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Die mathematische Wurzel: “Optimal Control” (Regelungstechnik) ===&lt;br /&gt;
&lt;br /&gt;
Seit den 1950er Jahren suchten Ingenieure und Mathematiker nach Wegen, dynamische Systeme (wie Raketen oder Fabrikanlagen) mathematisch optimal zu steuern. [1, 6]&lt;br /&gt;
&lt;br /&gt;
* Richard Bellman (1957): Er erfand die [https://de.wikipedia.org/wiki/Dynamische_Programmierung Dynamische Programmierung] und die mathematische Grundlage aller heutigen RL-Systeme: das Markov-Entscheidungsproblem (MDP). [4, 7]&lt;br /&gt;
* Das Problem damals: Bellmans Gleichungen funktionierten perfekt, wenn man die gesamte Welt exakt mathematisch beschreiben konnte (ein “Modell” der Welt hatte). Für die echte, komplexe Welt war das unbrauchbar. [8, 9]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-historische-verschmelzung-die-geburtsstunde-des-rl&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Die historische Verschmelzung (Die Geburtsstunde des RL) ===&lt;br /&gt;
&lt;br /&gt;
In den späten 1970er und 1980er Jahren brachten Forscher wie Richard Sutton und Andrew Barto diese beiden Welten zusammen. Sie fragten sich: Können wir die mathematische Optimierung von Bellman nutzen, während die KI die Spielregeln der Welt rein durch die psychologische Methode von Versuch und Irrtum (Trial-and-Error) erlernt? [3, 4, 6, 8] Daraus entstanden die historischen, klassischen RL-Algorithmen, die ohne jedes neuronale Netz funktionierten:&lt;br /&gt;
&lt;br /&gt;
* Tabellarisches Q-Learning (1989 von Chris Watkins): Die KI speichert ihr Wissen nicht in “Neuronen”, sondern in einer riesigen Excel-Tabelle (einer Q-Tabelle). Für jeden Zustand der Welt wird für jede Aktion ein mathematischer Wert eingetragen, wie gut diese Aktion war. [8, 10]&lt;br /&gt;
* Beispiel Tic-Tac-Toe: Ein System namens BOXES (1968 von Michie und Chambers) lernte das Spiel perfekt, indem es Streichholzschachteln für jeden Spielzustand nutzte – völlig ohne neuronale Struktur. [5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;warum-nutzt-man-heute-dafür-deep-learning&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Warum nutzt man heute dafür Deep Learning? ===&lt;br /&gt;
&lt;br /&gt;
Klassisches Reinforcement Learning (mit Tabellen) stößt an seine Grenzen, wenn es zu viele Zustände gibt. Beim Schach oder bei Videospielen gibt es mehr mögliche Zustände als Atome im Universum – die Tabelle würde unendlich groß werden. [10] Erst im Jahr 2013 kombinierte die Firma DeepMind das historische Reinforcement Learning mit tiefen neuronalen Netzen (Deep Reinforcement Learning). Das neuronale Netz fungiert seitdem lediglich als “Schätzer”, der die riesige Tabelle ersetzt. [11, 12, 13] &lt;br /&gt;
&lt;br /&gt;
Weiterhin interessant: Wie funktioniert das historische Q-Learning mit einer Tabelle im Detail? Wie kann ein KI-System ganz ohne neuronale Netze kluge Entscheidungen treffen?&lt;br /&gt;
&lt;br /&gt;
[1] [http://incompleteideas.net/book/ebook/node12.html https://incompleteideas.net] [2] [https://cacm.acm.org/federal-funding-of-academic-research/rediscovering-reinforcement-learning/ https://cacm.acm.org] [3] [https://www.youtube.com/watch?v=ul6B2oFPNDM&amp;amp;t=178 https://www.youtube.com] [4] [https://intuitionlabs.ai/articles/reinforcement-learning-explained https://intuitionlabs.ai] [5] [https://www.sciencedirect.com/topics/engineering/reinforcement-learning-technique https://www.sciencedirect.com] [6] [http://www.scholarpedia.org/article/Reinforcement_learning https://www.scholarpedia.org] [7] [https://aws.amazon.com/what-is/reinforcement-learning/ https://aws.amazon.com] [8] [https://medium.com/@aiforhuman/the-roots-of-reinforcement-learning-ad605c4d6d89 https://medium.com] [9] [http://www.umiacs.umd.edu/~hal/courses/2016F_RL/RL1.pdf https://www.umiacs.umd.edu] [10] [https://www.prodot.de/ki-glossar/reinforcement-learning https://www.prodot.de] [11] [https://www.mathworks.com/help/reinforcement-learning/ug/what-is-reinforcement-learning.html https://www.mathworks.com] [12] [https://iabac.org/blog/the-evolution-of-reinforcement-learning-in-machine-learning https://iabac.org] [13] [https://www.youtube.com/watch?v=rkrfWpmG3aM https://www.youtube.com]&lt;br /&gt;
&lt;br /&gt;
=CrossEntropyLoss=&lt;br /&gt;
`CrossEntropyLoss` ist eine sehr häufig verwendete **Verlustfunktion (Loss Function) für Klassifikationsprobleme** in PyTorch.&lt;br /&gt;
&lt;br /&gt;
Sie beantwortet während des Trainings im Wesentlichen die Frage:&lt;br /&gt;
&lt;br /&gt;
 „Wie stark weicht die Vorhersage des neuronalen Netzes von der richtigen Zielklasse ab?“&lt;br /&gt;
&lt;br /&gt;
Nehmen wir deinen Ziffernklassifikator. Die Taxonomie bzw. Klassenmenge besteht aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0, 1, 2, 3, 4, 5, 6, 7, 8, 9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für ein Bild ist die Zielklasse beispielsweise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
y = 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das neuronale Netz liefert aber nicht einfach `7`, sondern zunächst **10 Ausgabewerte**, sogenannte **Logits**:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Klasse     Logit&lt;br /&gt;
  0         0.2&lt;br /&gt;
  1        -0.5&lt;br /&gt;
  2         0.8&lt;br /&gt;
  3         0.1&lt;br /&gt;
  4        -0.3&lt;br /&gt;
  5         0.4&lt;br /&gt;
  6         0.2&lt;br /&gt;
  7         3.8   ←&lt;br /&gt;
  8         0.5&lt;br /&gt;
  9         1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je größer der Logit, desto stärker spricht das Modell für diese Klasse.&lt;br /&gt;
&lt;br /&gt;
==Was macht `CrossEntropyLoss` daraus?==&lt;br /&gt;
&lt;br /&gt;
Vereinfacht passieren zwei Dinge:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{Logits}&lt;br /&gt;
\xrightarrow{\text{Softmax}}&lt;br /&gt;
\text{Wahrscheinlichkeiten}&lt;br /&gt;
\xrightarrow{\text{Vergleich mit Zielklasse}}&lt;br /&gt;
\text{Loss}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 CrossEntropyLoss kombiniert diese Berechnungen intern. Deshalb sollte man vor CrossEntropyLoss normalerweise **kein eigenes `softmax()`** aufrufen.&lt;br /&gt;
&lt;br /&gt;
In PyTorch sieht das beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
&lt;br /&gt;
# Ausgabe des neuronalen Netzes:&lt;br /&gt;
# 4 Bilder und jeweils 10 Klassen&lt;br /&gt;
logits = torch.rand(4, 10)&lt;br /&gt;
&lt;br /&gt;
# Richtige Zielklassen der vier Bilder&lt;br /&gt;
y = torch.tensor([2, 7, 0, 9], dtype=torch.long)&lt;br /&gt;
&lt;br /&gt;
# Verlustfunktion erzeugen&lt;br /&gt;
loss_fn = nn.CrossEntropyLoss()&lt;br /&gt;
&lt;br /&gt;
# Verlust berechnen&lt;br /&gt;
loss = loss_fn(logits, y)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{logits.shape=}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{y.shape=}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{loss=}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist entscheidend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logits.shape = (4, 10)&lt;br /&gt;
                │   │&lt;br /&gt;
                │   └── 10 mögliche Klassen&lt;br /&gt;
                └────── 4 Bilder&lt;br /&gt;
&lt;br /&gt;
y.shape = (4,)&lt;br /&gt;
           │&lt;br /&gt;
           └── eine richtige Zielklasse pro Bild&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das passt genau zu deinem bisherigen Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bild x[0] → Zielklasse 2&lt;br /&gt;
Bild x[1] → Zielklasse 7&lt;br /&gt;
Bild x[2] → Zielklasse 0&lt;br /&gt;
Bild x[3] → Zielklasse 9&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### Warum braucht man überhaupt einen Loss?&lt;br /&gt;
&lt;br /&gt;
Beim Training läuft vereinfacht diese Kette ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Trainingsbild&lt;br /&gt;
     ↓&lt;br /&gt;
Neuronales Netz&lt;br /&gt;
     ↓&lt;br /&gt;
Logits&lt;br /&gt;
     ↓&lt;br /&gt;
CrossEntropyLoss ← richtige Zielklasse&lt;br /&gt;
     ↓&lt;br /&gt;
Loss&lt;br /&gt;
     ↓&lt;br /&gt;
Backpropagation&lt;br /&gt;
     ↓&lt;br /&gt;
Gewichte des Netzes verändern&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein **kleiner Loss** bedeutet: Die Vorhersage passt gut zur Zielklasse.&lt;br /&gt;
&lt;br /&gt;
Ein **großer Loss** bedeutet: Die Vorhersage passt schlecht zur Zielklasse.&lt;br /&gt;
&lt;br /&gt;
Dabei berücksichtigt Cross Entropy nicht nur, ob die endgültige Klassifikation richtig oder falsch war, sondern auch, **wie sicher das Modell dabei war**. Eine selbstbewusste falsche Vorhersage wird stärker bestraft als eine unsichere falsche Vorhersage.&lt;br /&gt;
&lt;br /&gt;
Das ist auch der entscheidende Unterschied zur **Accuracy**:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{CrossEntropyLoss → zum Trainieren}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{Accuracy → zum Bewerten}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Accuracy ist nämlich nicht gut geeignet, um mittels Backpropagation die Gewichte eines neuronalen Netzes schrittweise zu verbessern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Image Manipulation=&lt;br /&gt;
==Dilations==&lt;br /&gt;
&lt;br /&gt;
 Dilatation (abgeleitet vom lateinischen dilatare für „ausdehnen“ oder „erweitern“) bedeutet allgemein die Erweiterung, Dehnung oder Vergrößerung eines Gefäßes oder eines physikalischen Körpers.&lt;br /&gt;
&lt;br /&gt;
Der Begriff gehoert zur digitalen Bildverarbeitung als morphologische Dilatation (z. B.YOLO und Computervision). Hier ist es eine Operation, bei der Pixel an die Raender von Objekten in einem Binärbild (Schwarz-Weiß-Bild) &amp;quot;angefuegt&amp;quot; werden. Objekte im Bild werden dadurch vergroeszert oder dicker gemacht, um beispielsweise kleine Loecher in erkannten Formen zu schließen oder Linien zu verbinden.&lt;br /&gt;
&lt;br /&gt;
Im Informatik-Zusammenhang bezieht sich Dilatation (engl. dilation) fast ausschließlich auf zwei wichtige Bereiche der Bildverarbeitung und der Deep-Learning-Netzwerke. Beide Konzepte nutzen das mathematische Prinzip der &amp;quot;Ausdehnung&amp;quot;, wenden es aber unterschiedlich an:&lt;br /&gt;
&lt;br /&gt;
===In der Bildverarbeitung (Morphologische Dilatation)===&lt;br /&gt;
Hier ist die Dilatation (oft zusammen mit ihrem Gegenstück, der Erosion) eine der fundamentalen Operationen, um die Formen von Objekten in digitalen Bildern zu verändern. [1, 2]&lt;br /&gt;
&lt;br /&gt;
Wie es funktioniert: Ein kleiner Filter (ein sogenanntes Strukturelement oder Kernel, z. B. eine Matrix von 3 × 3 Pixeln) wandert Schritt für Schritt über das Bild.&lt;br /&gt;
Bei einem Binärbild (Schwarz-Weiß) gilt die Regel: Wenn der Kernel auch nur einen einzigen weißen Pixel berührt, wird der Pixel in der Mitte ebenfalls weiß gefärbt (logisches ODER).&lt;br /&gt;
Bei einem Graustufenbild wird der Pixel in der Mitte durch den maximalen Helligkeitswert in der Umgebung ersetzt. [3, 4, 5, 6, 7]&lt;br /&gt;
Der Effekt: Weiße/helle Flächen dehnen sich aus (sie &amp;quot;dilatieren&amp;quot;), während schwarze Löcher schrumpfen. [3, 4]&lt;br /&gt;
&lt;br /&gt;
Praxis-Anwendung:&lt;br /&gt;
Lücken schließen: Wenn bei einer Texterkennung (OCR) Buchstaben durch Bildrauschen unterbrochen sind, verbindet die Dilatation die Fragmente wieder.&lt;br /&gt;
Objekttrennung vorbereiten: Wenn man Objekte (wie Münzen) zählen will, die sich leicht berühren, nutzt man morphologische Operationen, um sie sauber freizustellen. [4, 8]&lt;br /&gt;
&lt;br /&gt;
In Bibliotheken wie OpenCV nutzt man dafür einfach den Befehl cv2.dilate(). [9]&lt;br /&gt;
&lt;br /&gt;
===In Convolutional Neural Networks (Dilated Convolutions)===&lt;br /&gt;
Wenn Sie moderne KI-Modelle zur Bildsegmentierung oder Objekterkennung (wie YOLO-Varianten oder WaveNet für Audio) bauen, stoszen Sie auf Dilated Convolutions (atrous convolutions).&lt;br /&gt;
&lt;br /&gt;
Das Problem bei Standard-KI: Um den globalen Kontext eines großen Bildes zu verstehen, müssen KI-Filter tief im Netzwerk sehr groß werden. Große Filter (7 × 7 oder 9 × 9) verbrauchen jedoch enorm viel Rechenleistung.&lt;br /&gt;
&lt;br /&gt;
Die Dilatation-Loesung: Man nimmt einen kleinen Standard-Filter (z. B. 3 × 3) und zieht ihn kuenstlich auseinander, indem man Luecken (Nullen) zwischen die Filterpunkte einfuegt (der sogenannte Dilation Rate-Faktor).&lt;br /&gt;
&lt;br /&gt;
Der Effekt: Der Filter deckt ploetzlich ein viel groeszeres Sichtfeld (Receptive Field) ab, behaelt aber die exakt gleiche Anzahl an rechenintensiven Parametern bei. Die KI &amp;quot;sieht&amp;quot; das große Ganze, ohne langsamer zu werden.&lt;br /&gt;
&lt;br /&gt;
[1] https://medium.com&lt;br /&gt;
&lt;br /&gt;
[2] https://medium.com&lt;br /&gt;
&lt;br /&gt;
[3] https://homepages.inf.ed.ac.uk&lt;br /&gt;
&lt;br /&gt;
[4] https://www.yahboom.net&lt;br /&gt;
&lt;br /&gt;
[5] https://www.youtube.com&lt;br /&gt;
&lt;br /&gt;
[6] https://docs.opencv.org&lt;br /&gt;
&lt;br /&gt;
[7] https://data-flair.training&lt;br /&gt;
&lt;br /&gt;
[8] https://www.cg.tuwien.ac.at&lt;br /&gt;
&lt;br /&gt;
[9] https://www.projectpro.io&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Insect_Detect&amp;diff=5489</id>
		<title>Insect Detect</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Insect_Detect&amp;diff=5489"/>
		<updated>2026-10-10T11:43:23Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Hier beschreibe ich die Umsetzung (erstmal nur Nachbau) des Projektes Insect Detect, zu finden auf [https://maxsitt.github.io/insect-detect-docs/ Github]&lt;br /&gt;
&lt;br /&gt;
Initiiert durch einen Kollegen, der im Rahmen seiner Taetigkeit beim [https://www.biosphaere-bliesgau.eu/ Biosphärenreservat Bliesgau] ein Projekt zur Erfassung von Insekten (Voegel, Fledermaeuse, ...) angestoszen hat, habe ich im ersten Schritt eine eigene (Hardware-)Variante des Projektes auf Github umgesetzt und werde dieses als Basis für zukünftige Adaptionen nutzen.&lt;br /&gt;
&lt;br /&gt;
=Stueckliste=&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Version 2023&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Version 2024&lt;br /&gt;
|-&lt;br /&gt;
! Komponente&lt;br /&gt;
! Kosten (ca.)&lt;br /&gt;
! Full Setup&lt;br /&gt;
! Minimal Setup&lt;br /&gt;
! Test Setup&lt;br /&gt;
! Kosten (ca.)&lt;br /&gt;
! Full Setup&lt;br /&gt;
! Minimal Setup&lt;br /&gt;
! Test Setup&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| OAK-1 Auto-Focus (&#039;&#039;&#039;O&#039;&#039;&#039;penCV &#039;&#039;&#039;A&#039;&#039;&#039;I &#039;&#039;&#039;K&#039;&#039;&#039;it)&lt;br /&gt;
| 145,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| 141,55 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| Raspberry Pi Zero 2 W(H)&amp;lt;br&amp;gt; H=Header bereits aufgeloetet&lt;br /&gt;
| ~22,00 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| 21,90 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| Micro SDXC card 256 GB&lt;br /&gt;
| 28,99 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 24,95 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| Micro SDHC Card 32 GB&lt;br /&gt;
| 8,95 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Micro USB to USB A adapter, angled&lt;br /&gt;
| 5,50 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Micro USB to USB A adapter&lt;br /&gt;
| 1,85 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| 1,85 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| USB A to micro USB cable, 20 cm, angled&lt;br /&gt;
| 5,60 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| RPi Power Supply&lt;br /&gt;
| 7,99 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| RPi CPU Heatsink&lt;br /&gt;
| 1,20 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| 1,20 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| RPi Header&lt;br /&gt;
| 0,95 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| RPi Stacking Header&lt;br /&gt;
| 1,60 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| 2,12 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| RPi Spacer Bolts 10 mm&lt;br /&gt;
| 3,50 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| RPi Spacer Bolts 20 mm&lt;br /&gt;
| 2,60 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Standoff M2.5, female-male (5 mm)&lt;br /&gt;
| 1,12 €&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Standoff M2.5, female*2 (11-12 mm)&lt;br /&gt;
| 1,92 €&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Screw M2.5 (5 mm)&lt;br /&gt;
| 1,92 €&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| 8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| Thermal Pad (1 mm) 50x50 mm (optional)&lt;br /&gt;
| 4,79 €&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| PiJuice Zero UPS pHAT&lt;br /&gt;
| 54,23 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| PiJuice 12,000mAh LiPo Battery&lt;br /&gt;
| 39,40 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Witty Pi 4 L3V7&lt;br /&gt;
| 28,56 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Li-Ion Battery Pack 3.7V (4400mAh)&lt;br /&gt;
| 14,24 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Voltaic V75 USB Battery Pack&lt;br /&gt;
| 101,14 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#66ff33&amp;quot;| Fibox PC 162513 Enclosure&lt;br /&gt;
| 89,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#66ff33&amp;quot;| Fibox TM 1625 Mounting Plate&lt;br /&gt;
| 7,49 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Cable Gland PG 13.5&lt;br /&gt;
| 0,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Cable Gland PG 13.5 Locknut&lt;br /&gt;
| 0,27 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Stainless Steel Cable Tie&lt;br /&gt;
| 3,90 €&lt;br /&gt;
| *&lt;br /&gt;
| 8&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Cable Tie Mount&lt;br /&gt;
| 0,99 €&lt;br /&gt;
| *&lt;br /&gt;
| 8&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| Acrylic Glas (2 mm) 40x40 mm&lt;br /&gt;
| ~5,00 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| EPDM Sealing Strip 20x5 mm&lt;br /&gt;
| 6,25 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| Silica Gel Pack 50 g&lt;br /&gt;
| 15,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff3300&amp;quot;| Solar Panel 6V 9W&lt;br /&gt;
| 98,30 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Solar Panel Bracket, Medium (optional)&lt;br /&gt;
| 11,75 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Solar Panel Extension Cable, 1 ft&lt;br /&gt;
| ~7,00 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Solar Panel Micro USB Adapter&lt;br /&gt;
| 3,88 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Voltaic 12,800mAh Li-Ion Battery&lt;br /&gt;
| 83,55 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| 2x Heatsink 40x30 mm (optional)&lt;br /&gt;
| 2,35 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#339933&amp;quot;| HPL Sheet (4 mm) 350x250 mm&lt;br /&gt;
| ~5,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#339933&amp;quot;| Aluminium Square Tube (23.5x23.5 mm), 1.5 m&lt;br /&gt;
| ~16,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 4x M4 20 mm Screws (internal hexagon)&lt;br /&gt;
| ~2,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 7x M4 40 mm Screws&lt;br /&gt;
| ~3,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 2x M4 60 mm Screws&lt;br /&gt;
| ~2,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 21x M4 Hex Nuts&lt;br /&gt;
| ~3,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 18x Flat Washer (e.g. M4 15 mm)&lt;br /&gt;
| ~3,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Pipe Clamp (60.3 mm) 70 mm + screws &amp;amp;amp; nuts&lt;br /&gt;
| 5,09 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Pipe Clamp (60.3 mm) 350 mm + screws &amp;amp;amp; nuts&lt;br /&gt;
| 7,81 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#339933&amp;quot;| Flower Platform (e.g. 350x200 mm)&lt;br /&gt;
| ~17,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Total cost&lt;br /&gt;
|&lt;br /&gt;
| ~704 €&lt;br /&gt;
| 531 €&lt;br /&gt;
| 187 €&lt;br /&gt;
|-&lt;br /&gt;
| Total cost with optional components&lt;br /&gt;
|&lt;br /&gt;
| ~730 €&lt;br /&gt;
| 547 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Legende&lt;br /&gt;
|colspan=&amp;quot;9&amp;quot;|&amp;lt;span style=&amp;quot;color: #ff9966;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Hardware &amp;lt;span style=&amp;quot;color: #ff99cc;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Kabel/Adapter &amp;lt;span style=&amp;quot;color: #ffff66;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Akku &amp;lt;span style=&amp;quot;color: #66ff33;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Gehaeuse  &amp;lt;span style=&amp;quot;color: #6699ff;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Befestigungsmaterial &amp;lt;span style=&amp;quot;color: #ff3300;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Solar &amp;lt;span style=&amp;quot;color: #339933;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Platform &amp;lt;span style=&amp;quot;color: #999966;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Sonstiges/Zubehoer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
Der Arbeitsablauf ist grob gesagt: Kamera (Luxonis) -&amp;gt; MicroPC (SBC Raspi (Zero)) -&amp;gt; PC (Linux, Win, Mac).&lt;br /&gt;
  &lt;br /&gt;
==Kamera==&lt;br /&gt;
&lt;br /&gt;
Der Kamera (OAK-1 von Luxonis) hat eine besondere Bedeutung, da sie als eine der wenigen (?) Kameras durch die eingebaute VPU (Vision/Visual/Video Processing Unit) Myriad X [https://www.intel.de/content/www/de/de/products/sku/125926/intel-movidius-myriad-x-vision-processing-unit-4gb/specifications.html] eine Vorverarbeitung (Object Detection) des Videomaterials durchfuehrt und der nachgeschalteten Einheit bereits fertige Trackingdaten zur Verfuegung stellt.&lt;br /&gt;
&lt;br /&gt;
==RasPi==&lt;br /&gt;
Zum Raspi Zero gibt es eigentlich nicht viel Neues zu sagen. &lt;br /&gt;
Bei der Wahl des USV-Moduls sollte man berueckichtigen, dass das PiJuice Zero UPS pHAT schwer oder gar nicht mehr zu beziehen ist.&lt;br /&gt;
&lt;br /&gt;
Da ich eines davon noch besitze hier eine kleine [https://www.makerspace-online.com/pijuice-hat/ Anleitung] zur Inbetriebnahme.&lt;br /&gt;
&lt;br /&gt;
Die IP-Adresse des Pi wird im LoginScreen (HDMI) angezeigt.&lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen laufen hier 2 Programme.&lt;br /&gt;
&lt;br /&gt;
* Das Python Programm webapp.py, welches eine Webschnittstelle zum Pi herstellt. &lt;br /&gt;
&lt;br /&gt;
* Das Python Programm trigger_capture.py, welches die &amp;quot;Detections&amp;quot; als Dateien in einem Ordner ablegt.&lt;br /&gt;
&lt;br /&gt;
==Spannungsversorgung==&lt;br /&gt;
Im Dauerbetrieb wird auf der Insect Detect GithubSeite fuer den PiZero und die Kamera ein Energieverbrauch von ~88Wh pro 20 Stunden angegeben.&lt;br /&gt;
&lt;br /&gt;
Eine eigene Messung steht noch aus.&lt;br /&gt;
 &lt;br /&gt;
Das Ein- und Aus-Schalten funktioniert ueber einen LED-Button.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===PiJuice===&lt;br /&gt;
[https://www.makerspace-online.com/pijuice-hat/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Witty Pi 4 L3V7===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Akku===&lt;br /&gt;
&lt;br /&gt;
Voltaic V75 [https://voltaicsystems.com/v75/]&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Notebook==&lt;br /&gt;
&lt;br /&gt;
Zur Auswertung der gespeicherten Daten (jpg-captures und metadata.csv) von der SDCard des Raspi.&lt;br /&gt;
&lt;br /&gt;
Die Anforderungen an die Hardware:&lt;br /&gt;
* USB 3 &lt;br /&gt;
* Outdoor-Modell&lt;br /&gt;
* lange Akkulaufzeit&lt;br /&gt;
* LTE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
to be continued ...&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
[[File:insect_detect_active_learning_loop.png|600px]][https://maxsitt.github.io/insect-detect-docs/#overview]&lt;br /&gt;
&lt;br /&gt;
Hier eine noch unsortierte Ansammlung der benutzten Befehle der ersten Gehversuche.&lt;br /&gt;
&lt;br /&gt;
chris@worker:~/YOLOv5-cls&amp;gt; python3.12 -m virtualenv env_yolov5&lt;br /&gt;
created virtual environment CPython3.12.11.final.0-64 in 207ms&lt;br /&gt;
  creator CPython3Posix(dest=/home/chris/YOLOv5-cls/env_yolov5, clear=False, no_vcs_ignore=False, global=False)&lt;br /&gt;
  seeder FromAppData(download=False, pip=bundle, via=copy, app_data_dir=/home/chris/.local/share/virtualenv)&lt;br /&gt;
    added seed packages: pip==25.2&lt;br /&gt;
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 python insect-detect-ml-main/process_images.py -source &amp;quot;InsectDetectFirstShot/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 yolov5-master/utils/dataloaders.py &lt;br /&gt;
&lt;br /&gt;
 python3.11 yolov5-master/classify/predict.py --name FirstShot --source &amp;quot;./InsectDetectFirstShot/2025-08-26_19-37-56-028066_TID2_crop_Schmetterling.jpg&amp;quot; --weights &amp;quot;insect-detect-ml-main/models/efficientnet-b0_imgsz128.onnx&amp;quot; --img 128 --sort-top1 --sort-prob --concat-csv --device cpu&lt;br /&gt;
&lt;br /&gt;
 python pytorchCUDAtest.py&lt;br /&gt;
&lt;br /&gt;
Das Modell liegt im Verzeichnis insect-detect-ml-main/models mit dem Namen efficientnet-b0_imgsz128.onnx&lt;br /&gt;
&lt;br /&gt;
Visualisiert sieht es so aus. Siehe https://netron.app [https://tippvomtibb.de/WikiResources/efficientnet-b0_imgsz128.onnx]&lt;br /&gt;
&lt;br /&gt;
[Datei:efficientnet-b0_imgsz128.onnx.svg]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
&lt;br /&gt;
[https://community.hiveeyes.org/t/insect-detect-von-max-sittinger/4906]&lt;br /&gt;
&lt;br /&gt;
[https://insectactivitydetectionsystem.de/]&lt;br /&gt;
&lt;br /&gt;
=Comments=&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Insect_Detect&amp;diff=5488</id>
		<title>Insect Detect</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Insect_Detect&amp;diff=5488"/>
		<updated>2026-10-10T11:41:59Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Hier beschreibe ich die Umsetzung (erstmal nur Nachbau) des Projektes Insect Detect, zu finden auf [https://maxsitt.github.io/insect-detect-docs/ Github]&lt;br /&gt;
&lt;br /&gt;
Initiiert durch einen Kollegen, der im Rahmen seiner Taetigkeit beim [https://www.biosphaere-bliesgau.eu/ Biosphärenreservat Bliesgau] ein Projekt zur Erfassung von Insekten (Voegel, Fledermaeuse, ...) angestoszen hat, habe ich im ersten Schritt eine eigene (Hardware-)Variante des Projektes auf Github umgesetzt und werde dieses als Basis für zukünftige Adaptionen nutzen.&lt;br /&gt;
&lt;br /&gt;
=Stueckliste=&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Version 2023&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Version 2024&lt;br /&gt;
|-&lt;br /&gt;
! Komponente&lt;br /&gt;
! Kosten (ca.)&lt;br /&gt;
! Full Setup&lt;br /&gt;
! Minimal Setup&lt;br /&gt;
! Test Setup&lt;br /&gt;
! Kosten (ca.)&lt;br /&gt;
! Full Setup&lt;br /&gt;
! Minimal Setup&lt;br /&gt;
! Test Setup&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| OAK-1 Auto-Focus (&#039;&#039;&#039;O&#039;&#039;&#039;penCV &#039;&#039;&#039;A&#039;&#039;&#039;I &#039;&#039;&#039;K&#039;&#039;&#039;it)&lt;br /&gt;
| 145,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| 141,55 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| Raspberry Pi Zero 2 W(H)&amp;lt;br&amp;gt; H=Header bereits aufgeloetet&lt;br /&gt;
| ~22,00 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| 21,90 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| Micro SDXC card 256 GB&lt;br /&gt;
| 28,99 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 24,95 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| Micro SDHC Card 32 GB&lt;br /&gt;
| 8,95 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Micro USB to USB A adapter, angled&lt;br /&gt;
| 5,50 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Micro USB to USB A adapter&lt;br /&gt;
| 1,85 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| 1,85 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| USB A to micro USB cable, 20 cm, angled&lt;br /&gt;
| 5,60 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| RPi Power Supply&lt;br /&gt;
| 7,99 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| RPi CPU Heatsink&lt;br /&gt;
| 1,20 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| 1,20 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| RPi Header&lt;br /&gt;
| 0,95 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| RPi Stacking Header&lt;br /&gt;
| 1,60 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| 2,12 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| RPi Spacer Bolts 10 mm&lt;br /&gt;
| 3,50 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| RPi Spacer Bolts 20 mm&lt;br /&gt;
| 2,60 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Standoff M2.5, female-male (5 mm)&lt;br /&gt;
| 1,12 €&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Standoff M2.5, female*2 (11-12 mm)&lt;br /&gt;
| 1,92 €&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Screw M2.5 (5 mm)&lt;br /&gt;
| 1,92 €&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| 8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| Thermal Pad (1 mm) 50x50 mm (optional)&lt;br /&gt;
| 4,79 €&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| PiJuice Zero UPS pHAT&lt;br /&gt;
| 54,23 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| PiJuice 12,000mAh LiPo Battery&lt;br /&gt;
| 39,40 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Witty Pi 4 L3V7&lt;br /&gt;
| 28,56 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Li-Ion Battery Pack 3.7V (4400mAh)&lt;br /&gt;
| 14,24 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Voltaic V75 USB Battery Pack&lt;br /&gt;
| 101,14 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#66ff33&amp;quot;| Fibox PC 162513 Enclosure&lt;br /&gt;
| 89,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#66ff33&amp;quot;| Fibox TM 1625 Mounting Plate&lt;br /&gt;
| 7,49 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Cable Gland PG 13.5&lt;br /&gt;
| 0,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Cable Gland PG 13.5 Locknut&lt;br /&gt;
| 0,27 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Stainless Steel Cable Tie&lt;br /&gt;
| 3,90 €&lt;br /&gt;
| *&lt;br /&gt;
| 8&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Cable Tie Mount&lt;br /&gt;
| 0,99 €&lt;br /&gt;
| *&lt;br /&gt;
| 8&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| Acrylic Glas (2 mm) 40x40 mm&lt;br /&gt;
| ~5,00 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| EPDM Sealing Strip 20x5 mm&lt;br /&gt;
| 6,25 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| Silica Gel Pack 50 g&lt;br /&gt;
| 15,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff3300&amp;quot;| Solar Panel 6V 9W&lt;br /&gt;
| 98,30 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Solar Panel Bracket, Medium (optional)&lt;br /&gt;
| 11,75 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Solar Panel Extension Cable, 1 ft&lt;br /&gt;
| ~7,00 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Solar Panel Micro USB Adapter&lt;br /&gt;
| 3,88 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Voltaic 12,800mAh Li-Ion Battery&lt;br /&gt;
| 83,55 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| 2x Heatsink 40x30 mm (optional)&lt;br /&gt;
| 2,35 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#339933&amp;quot;| HPL Sheet (4 mm) 350x250 mm&lt;br /&gt;
| ~5,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#339933&amp;quot;| Aluminium Square Tube (23.5x23.5 mm), 1.5 m&lt;br /&gt;
| ~16,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 4x M4 20 mm Screws (internal hexagon)&lt;br /&gt;
| ~2,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 7x M4 40 mm Screws&lt;br /&gt;
| ~3,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 2x M4 60 mm Screws&lt;br /&gt;
| ~2,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 21x M4 Hex Nuts&lt;br /&gt;
| ~3,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 18x Flat Washer (e.g. M4 15 mm)&lt;br /&gt;
| ~3,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Pipe Clamp (60.3 mm) 70 mm + screws &amp;amp;amp; nuts&lt;br /&gt;
| 5,09 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Pipe Clamp (60.3 mm) 350 mm + screws &amp;amp;amp; nuts&lt;br /&gt;
| 7,81 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#339933&amp;quot;| Flower Platform (e.g. 350x200 mm)&lt;br /&gt;
| ~17,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Total cost&lt;br /&gt;
|&lt;br /&gt;
| ~704 €&lt;br /&gt;
| 531 €&lt;br /&gt;
| 187 €&lt;br /&gt;
|-&lt;br /&gt;
| Total cost with optional components&lt;br /&gt;
|&lt;br /&gt;
| ~730 €&lt;br /&gt;
| 547 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Legende&lt;br /&gt;
|colspan=&amp;quot;9&amp;quot;|&amp;lt;span style=&amp;quot;color: #ff9966;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Hardware &amp;lt;span style=&amp;quot;color: #ff99cc;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Kabel/Adapter &amp;lt;span style=&amp;quot;color: #ffff66;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Akku &amp;lt;span style=&amp;quot;color: #66ff33;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Gehaeuse  &amp;lt;span style=&amp;quot;color: #6699ff;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Befestigungsmaterial &amp;lt;span style=&amp;quot;color: #ff3300;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Solar &amp;lt;span style=&amp;quot;color: #339933;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Platform &amp;lt;span style=&amp;quot;color: #999966;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Sonstiges/Zubehoer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
Der Arbeitsablauf ist grob gesagt: Kamera (Luxonis) -&amp;gt; MicroPC (SBC Raspi (Zero)) -&amp;gt; PC (Linux, Win, Mac).&lt;br /&gt;
  &lt;br /&gt;
==Kamera==&lt;br /&gt;
&lt;br /&gt;
Der Kamera (OAK-1 von Luxonis) hat eine besondere Bedeutung, da sie als eine der wenigen (?) Kameras durch die eingebaute VPU (Vision/Visual/Video Processing Unit) Myriad X [https://www.intel.de/content/www/de/de/products/sku/125926/intel-movidius-myriad-x-vision-processing-unit-4gb/specifications.html] eine Vorverarbeitung (Object Detection) des Videomaterials durchfuehrt und der nachgeschalteten Einheit bereits fertige Trackingdaten zur Verfuegung stellt.&lt;br /&gt;
&lt;br /&gt;
==RasPi==&lt;br /&gt;
Zum Raspi Zero gibt es eigentlich nicht viel Neues zu sagen. &lt;br /&gt;
Bei der Wahl des USV-Moduls sollte man berueckichtigen, dass das PiJuice Zero UPS pHAT schwer oder gar nicht mehr zu beziehen ist.&lt;br /&gt;
&lt;br /&gt;
Da ich eines davon noch besitze hier eine kleine [https://www.makerspace-online.com/pijuice-hat/ Anleitung] zur Inbetriebnahme.&lt;br /&gt;
&lt;br /&gt;
Die IP-Adresse des Pi wird im LoginScreen (HDMI) angezeigt.&lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen laufen hier 2 Programme.&lt;br /&gt;
&lt;br /&gt;
* Das Python Programm webapp.py, welches eine Webschnittstelle zum Pi herstellt. &lt;br /&gt;
&lt;br /&gt;
* Das Python Programm trigger_capture.py, welches die &amp;quot;Detections&amp;quot; als Dateien in einem Ordner ablegt.&lt;br /&gt;
&lt;br /&gt;
==Spannungsversorgung==&lt;br /&gt;
Im Dauerbetrieb wird auf der Insect Detect GithubSeite fuer den PiZero und die Kamera ein Energieverbrauch von ~88Wh pro 20 Stunden angegeben.&lt;br /&gt;
&lt;br /&gt;
Eine eigene Messung steht noch aus.&lt;br /&gt;
 &lt;br /&gt;
Das Ein- und Aus-Schalten funktioniert ueber einen LED-Button.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===PiJuice===&lt;br /&gt;
[https://www.makerspace-online.com/pijuice-hat/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Witty Pi 4 L3V7===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Akku===&lt;br /&gt;
&lt;br /&gt;
Voltaic V75 [https://voltaicsystems.com/v75/]&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Notebook==&lt;br /&gt;
&lt;br /&gt;
Zur Auswertung der gespeicherten Daten (jpg-captures und metadata.csv) von der SDCard des Raspi.&lt;br /&gt;
&lt;br /&gt;
Die Anforderungen an die Hardware:&lt;br /&gt;
* USB 3 &lt;br /&gt;
* Outdoor-Modell&lt;br /&gt;
* lange Akkulaufzeit&lt;br /&gt;
* LTE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
to be continued ...&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
[[File:insect_detect_active_learning_loop.png|600px]][https://maxsitt.github.io/insect-detect-docs/#overview]&lt;br /&gt;
&lt;br /&gt;
Hier eine noch unsortierte Ansammlung der benutzten Befehle der ersten Gehversuche.&lt;br /&gt;
&lt;br /&gt;
chris@worker:~/YOLOv5-cls&amp;gt; python3.12 -m virtualenv env_yolov5&lt;br /&gt;
created virtual environment CPython3.12.11.final.0-64 in 207ms&lt;br /&gt;
  creator CPython3Posix(dest=/home/chris/YOLOv5-cls/env_yolov5, clear=False, no_vcs_ignore=False, global=False)&lt;br /&gt;
  seeder FromAppData(download=False, pip=bundle, via=copy, app_data_dir=/home/chris/.local/share/virtualenv)&lt;br /&gt;
    added seed packages: pip==25.2&lt;br /&gt;
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 python insect-detect-ml-main/process_images.py -source &amp;quot;InsectDetectFirstShot/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 yolov5-master/utils/dataloaders.py &lt;br /&gt;
&lt;br /&gt;
 python3.11 yolov5-master/classify/predict.py --name FirstShot --source &amp;quot;./InsectDetectFirstShot/2025-08-26_19-37-56-028066_TID2_crop_Schmetterling.jpg&amp;quot; --weights &amp;quot;insect-detect-ml-main/models/efficientnet-b0_imgsz128.onnx&amp;quot; --img 128 --sort-top1 --sort-prob --concat-csv --device cpu&lt;br /&gt;
&lt;br /&gt;
 python pytorchCUDAtest.py&lt;br /&gt;
&lt;br /&gt;
Das Modell liegt im Verzeichnis insect-detect-ml-main/models mit dem Namen efficientnet-b0_imgsz128.onnx&lt;br /&gt;
&lt;br /&gt;
Visualisiert sieht es so aus. Siehe https://netron.app [https://tippvomtibb.de/WikiResources/efficientnet-b0_imgsz128.onnx]&lt;br /&gt;
&lt;br /&gt;
[[Datei:efficientnet-b0_imgsz128.onnx.svg|300px]]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
&lt;br /&gt;
[https://community.hiveeyes.org/t/insect-detect-von-max-sittinger/4906]&lt;br /&gt;
&lt;br /&gt;
[https://insectactivitydetectionsystem.de/]&lt;br /&gt;
&lt;br /&gt;
=Comments=&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Insect_Detect&amp;diff=5487</id>
		<title>Insect Detect</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Insect_Detect&amp;diff=5487"/>
		<updated>2026-10-10T11:40:02Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Hier beschreibe ich die Umsetzung (erstmal nur Nachbau) des Projektes Insect Detect, zu finden auf [https://maxsitt.github.io/insect-detect-docs/ Github]&lt;br /&gt;
&lt;br /&gt;
Initiiert durch einen Kollegen, der im Rahmen seiner Taetigkeit beim [https://www.biosphaere-bliesgau.eu/ Biosphärenreservat Bliesgau] ein Projekt zur Erfassung von Insekten (Voegel, Fledermaeuse, ...) angestoszen hat, habe ich im ersten Schritt eine eigene (Hardware-)Variante des Projektes auf Github umgesetzt und werde dieses als Basis für zukünftige Adaptionen nutzen.&lt;br /&gt;
&lt;br /&gt;
=Stueckliste=&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Version 2023&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Version 2024&lt;br /&gt;
|-&lt;br /&gt;
! Komponente&lt;br /&gt;
! Kosten (ca.)&lt;br /&gt;
! Full Setup&lt;br /&gt;
! Minimal Setup&lt;br /&gt;
! Test Setup&lt;br /&gt;
! Kosten (ca.)&lt;br /&gt;
! Full Setup&lt;br /&gt;
! Minimal Setup&lt;br /&gt;
! Test Setup&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| OAK-1 Auto-Focus (&#039;&#039;&#039;O&#039;&#039;&#039;penCV &#039;&#039;&#039;A&#039;&#039;&#039;I &#039;&#039;&#039;K&#039;&#039;&#039;it)&lt;br /&gt;
| 145,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| 141,55 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| Raspberry Pi Zero 2 W(H)&amp;lt;br&amp;gt; H=Header bereits aufgeloetet&lt;br /&gt;
| ~22,00 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| 21,90 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| Micro SDXC card 256 GB&lt;br /&gt;
| 28,99 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 24,95 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| Micro SDHC Card 32 GB&lt;br /&gt;
| 8,95 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Micro USB to USB A adapter, angled&lt;br /&gt;
| 5,50 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Micro USB to USB A adapter&lt;br /&gt;
| 1,85 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| 1,85 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| USB A to micro USB cable, 20 cm, angled&lt;br /&gt;
| 5,60 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| RPi Power Supply&lt;br /&gt;
| 7,99 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| RPi CPU Heatsink&lt;br /&gt;
| 1,20 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| 1,20 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| RPi Header&lt;br /&gt;
| 0,95 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| RPi Stacking Header&lt;br /&gt;
| 1,60 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| 2,12 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| RPi Spacer Bolts 10 mm&lt;br /&gt;
| 3,50 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| RPi Spacer Bolts 20 mm&lt;br /&gt;
| 2,60 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Standoff M2.5, female-male (5 mm)&lt;br /&gt;
| 1,12 €&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Standoff M2.5, female*2 (11-12 mm)&lt;br /&gt;
| 1,92 €&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Screw M2.5 (5 mm)&lt;br /&gt;
| 1,92 €&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| 8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| Thermal Pad (1 mm) 50x50 mm (optional)&lt;br /&gt;
| 4,79 €&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| PiJuice Zero UPS pHAT&lt;br /&gt;
| 54,23 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| PiJuice 12,000mAh LiPo Battery&lt;br /&gt;
| 39,40 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Witty Pi 4 L3V7&lt;br /&gt;
| 28,56 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Li-Ion Battery Pack 3.7V (4400mAh)&lt;br /&gt;
| 14,24 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Voltaic V75 USB Battery Pack&lt;br /&gt;
| 101,14 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#66ff33&amp;quot;| Fibox PC 162513 Enclosure&lt;br /&gt;
| 89,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#66ff33&amp;quot;| Fibox TM 1625 Mounting Plate&lt;br /&gt;
| 7,49 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Cable Gland PG 13.5&lt;br /&gt;
| 0,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Cable Gland PG 13.5 Locknut&lt;br /&gt;
| 0,27 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Stainless Steel Cable Tie&lt;br /&gt;
| 3,90 €&lt;br /&gt;
| *&lt;br /&gt;
| 8&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Cable Tie Mount&lt;br /&gt;
| 0,99 €&lt;br /&gt;
| *&lt;br /&gt;
| 8&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| Acrylic Glas (2 mm) 40x40 mm&lt;br /&gt;
| ~5,00 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| EPDM Sealing Strip 20x5 mm&lt;br /&gt;
| 6,25 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| Silica Gel Pack 50 g&lt;br /&gt;
| 15,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff3300&amp;quot;| Solar Panel 6V 9W&lt;br /&gt;
| 98,30 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Solar Panel Bracket, Medium (optional)&lt;br /&gt;
| 11,75 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Solar Panel Extension Cable, 1 ft&lt;br /&gt;
| ~7,00 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Solar Panel Micro USB Adapter&lt;br /&gt;
| 3,88 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Voltaic 12,800mAh Li-Ion Battery&lt;br /&gt;
| 83,55 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| 2x Heatsink 40x30 mm (optional)&lt;br /&gt;
| 2,35 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#339933&amp;quot;| HPL Sheet (4 mm) 350x250 mm&lt;br /&gt;
| ~5,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#339933&amp;quot;| Aluminium Square Tube (23.5x23.5 mm), 1.5 m&lt;br /&gt;
| ~16,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 4x M4 20 mm Screws (internal hexagon)&lt;br /&gt;
| ~2,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 7x M4 40 mm Screws&lt;br /&gt;
| ~3,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 2x M4 60 mm Screws&lt;br /&gt;
| ~2,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 21x M4 Hex Nuts&lt;br /&gt;
| ~3,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 18x Flat Washer (e.g. M4 15 mm)&lt;br /&gt;
| ~3,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Pipe Clamp (60.3 mm) 70 mm + screws &amp;amp;amp; nuts&lt;br /&gt;
| 5,09 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Pipe Clamp (60.3 mm) 350 mm + screws &amp;amp;amp; nuts&lt;br /&gt;
| 7,81 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#339933&amp;quot;| Flower Platform (e.g. 350x200 mm)&lt;br /&gt;
| ~17,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Total cost&lt;br /&gt;
|&lt;br /&gt;
| ~704 €&lt;br /&gt;
| 531 €&lt;br /&gt;
| 187 €&lt;br /&gt;
|-&lt;br /&gt;
| Total cost with optional components&lt;br /&gt;
|&lt;br /&gt;
| ~730 €&lt;br /&gt;
| 547 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Legende&lt;br /&gt;
|colspan=&amp;quot;9&amp;quot;|&amp;lt;span style=&amp;quot;color: #ff9966;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Hardware &amp;lt;span style=&amp;quot;color: #ff99cc;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Kabel/Adapter &amp;lt;span style=&amp;quot;color: #ffff66;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Akku &amp;lt;span style=&amp;quot;color: #66ff33;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Gehaeuse  &amp;lt;span style=&amp;quot;color: #6699ff;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Befestigungsmaterial &amp;lt;span style=&amp;quot;color: #ff3300;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Solar &amp;lt;span style=&amp;quot;color: #339933;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Platform &amp;lt;span style=&amp;quot;color: #999966;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Sonstiges/Zubehoer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
Der Arbeitsablauf ist grob gesagt: Kamera (Luxonis) -&amp;gt; MicroPC (SBC Raspi (Zero)) -&amp;gt; PC (Linux, Win, Mac).&lt;br /&gt;
  &lt;br /&gt;
==Kamera==&lt;br /&gt;
&lt;br /&gt;
Der Kamera (OAK-1 von Luxonis) hat eine besondere Bedeutung, da sie als eine der wenigen (?) Kameras durch die eingebaute VPU (Vision/Visual/Video Processing Unit) Myriad X [https://www.intel.de/content/www/de/de/products/sku/125926/intel-movidius-myriad-x-vision-processing-unit-4gb/specifications.html] eine Vorverarbeitung (Object Detection) des Videomaterials durchfuehrt und der nachgeschalteten Einheit bereits fertige Trackingdaten zur Verfuegung stellt.&lt;br /&gt;
&lt;br /&gt;
==RasPi==&lt;br /&gt;
Zum Raspi Zero gibt es eigentlich nicht viel Neues zu sagen. &lt;br /&gt;
Bei der Wahl des USV-Moduls sollte man berueckichtigen, dass das PiJuice Zero UPS pHAT schwer oder gar nicht mehr zu beziehen ist.&lt;br /&gt;
&lt;br /&gt;
Da ich eines davon noch besitze hier eine kleine [https://www.makerspace-online.com/pijuice-hat/ Anleitung] zur Inbetriebnahme.&lt;br /&gt;
&lt;br /&gt;
Die IP-Adresse des Pi wird im LoginScreen (HDMI) angezeigt.&lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen laufen hier 2 Programme.&lt;br /&gt;
&lt;br /&gt;
* Das Python Programm webapp.py, welches eine Webschnittstelle zum Pi herstellt. &lt;br /&gt;
&lt;br /&gt;
* Das Python Programm trigger_capture.py, welches die &amp;quot;Detections&amp;quot; als Dateien in einem Ordner ablegt.&lt;br /&gt;
&lt;br /&gt;
==Spannungsversorgung==&lt;br /&gt;
Im Dauerbetrieb wird auf der Insect Detect GithubSeite fuer den PiZero und die Kamera ein Energieverbrauch von ~88Wh pro 20 Stunden angegeben.&lt;br /&gt;
&lt;br /&gt;
Eine eigene Messung steht noch aus.&lt;br /&gt;
 &lt;br /&gt;
Das Ein- und Aus-Schalten funktioniert ueber einen LED-Button.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===PiJuice===&lt;br /&gt;
[https://www.makerspace-online.com/pijuice-hat/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Witty Pi 4 L3V7===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Akku===&lt;br /&gt;
&lt;br /&gt;
Voltaic V75 [https://voltaicsystems.com/v75/]&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Notebook==&lt;br /&gt;
&lt;br /&gt;
Zur Auswertung der gespeicherten Daten (jpg-captures und metadata.csv) von der SDCard des Raspi.&lt;br /&gt;
&lt;br /&gt;
Die Anforderungen an die Hardware:&lt;br /&gt;
* USB 3 &lt;br /&gt;
* Outdoor-Modell&lt;br /&gt;
* lange Akkulaufzeit&lt;br /&gt;
* LTE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
to be continued ...&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
[[File:insect_detect_active_learning_loop.png|600px]][https://maxsitt.github.io/insect-detect-docs/#overview]&lt;br /&gt;
&lt;br /&gt;
Hier eine noch unsortierte Ansammlung der benutzten Befehle der ersten Gehversuche.&lt;br /&gt;
&lt;br /&gt;
chris@worker:~/YOLOv5-cls&amp;gt; python3.12 -m virtualenv env_yolov5&lt;br /&gt;
created virtual environment CPython3.12.11.final.0-64 in 207ms&lt;br /&gt;
  creator CPython3Posix(dest=/home/chris/YOLOv5-cls/env_yolov5, clear=False, no_vcs_ignore=False, global=False)&lt;br /&gt;
  seeder FromAppData(download=False, pip=bundle, via=copy, app_data_dir=/home/chris/.local/share/virtualenv)&lt;br /&gt;
    added seed packages: pip==25.2&lt;br /&gt;
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 python insect-detect-ml-main/process_images.py -source &amp;quot;InsectDetectFirstShot/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 yolov5-master/utils/dataloaders.py &lt;br /&gt;
&lt;br /&gt;
 python3.11 yolov5-master/classify/predict.py --name FirstShot --source &amp;quot;./InsectDetectFirstShot/2025-08-26_19-37-56-028066_TID2_crop_Schmetterling.jpg&amp;quot; --weights &amp;quot;insect-detect-ml-main/models/efficientnet-b0_imgsz128.onnx&amp;quot; --img 128 --sort-top1 --sort-prob --concat-csv --device cpu&lt;br /&gt;
&lt;br /&gt;
 python pytorchCUDAtest.py&lt;br /&gt;
&lt;br /&gt;
Das Modell liegt im Verzeichnis insect-detect-ml-main/models mit dem Namen efficientnet-b0_imgsz128.onnx&lt;br /&gt;
&lt;br /&gt;
Visualisiert sieht es so aus. Siehe https://netron.app [https://tippvomtibb.de/WikiResources/efficientnet-b0_imgsz128.onnx]&lt;br /&gt;
&lt;br /&gt;
[[:File:efficientnet-b0_imgsz128.onnx.svg]]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
&lt;br /&gt;
[https://community.hiveeyes.org/t/insect-detect-von-max-sittinger/4906]&lt;br /&gt;
&lt;br /&gt;
[https://insectactivitydetectionsystem.de/]&lt;br /&gt;
&lt;br /&gt;
=Comments=&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Efficientnet-b0_imgsz128.onnx.svg&amp;diff=5486</id>
		<title>Datei:Efficientnet-b0 imgsz128.onnx.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Efficientnet-b0_imgsz128.onnx.svg&amp;diff=5486"/>
		<updated>2026-10-10T11:39:33Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=KI_Modelldateiformate&amp;diff=5485</id>
		<title>KI Modelldateiformate</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=KI_Modelldateiformate&amp;diff=5485"/>
		<updated>2026-10-10T11:34:10Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Allgemeines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Da es recht viele Dateiformate, in denen Modelldaten gespeichert sind, gibt ist für mich wichtig wie und welche Daten in Datei abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Eins vorab. Es sind wohl alle Formate ineinander konvertierbar.&lt;br /&gt;
&lt;br /&gt;
Sie lassen sich auch mit Hilfe der WebApp Netron [https://netron.app/] visualisieren.&lt;br /&gt;
&lt;br /&gt;
 Netron is a viewer for neural network, deep learning and machine learning models.&lt;br /&gt;
 &lt;br /&gt;
 Netron supports ONNX, TensorFlow Lite, PyTorch, torch.export, ExecuTorch, TorchScript, TensorFlow, Core ML, OpenVINO, Keras, Caffe, Darknet, Safetensors and NumPy.&lt;br /&gt;
 &lt;br /&gt;
 Netron has experimental support for MLIR, JAX, GGUF, RKNN, ncnn, MNN, PaddlePaddle and scikit-learn.&lt;br /&gt;
&lt;br /&gt;
=Die Formate im Überblick=&lt;br /&gt;
Diese Dateiendungen stehen für gängige Machine-Learning- und Deep-Learning-Modellformate: [1, 2]&lt;br /&gt;
&lt;br /&gt;
==.pt / .pth (PyTorch)==&lt;br /&gt;
Das Standard-Speicherformat von PyTorch (basierend auf Python Pickle). Es speichert Gewichte (state_dict) oder ganze Modelle samt Trainings-Metadaten. Es ist ideal zum Weiter-Trainieren, aber unsicher beim Laden fremder Dateien (Code-Ausführung möglich). [1, 2, 3]&lt;br /&gt;
==.safetensors (Hugging Face)==&lt;br /&gt;
Ein von Hugging Face entwickeltes, sicheres Format. Es speichert nur reine Tensordaten neben einem JSON-Header, lädt extrem schnell (Lazy-Loading) und verhindert Sicherheitsrisiken durch schädlichen Python-Code. [1]&lt;br /&gt;
==.onnx (Open Neural Network Exchange)==&lt;br /&gt;
Ein herstellerunabhängiges Standardformat für Rechengraphen. Es dient der Interoperabilität, damit ein Modell aus PyTorch auf anderen Runtimes oder Plattformen (z. B. .NET, Mobile, Web) ausgeführt werden kann. [1, 4]&lt;br /&gt;
==.model (Verschiedene)== &lt;br /&gt;
Ein generischer Name für Modelldateien (häufig genutzt von Frameworks wie TensorFlow, Scikit-Learn, Keras oder SentencePiece).&lt;br /&gt;
==.engine / .trt (TensorRT)==&lt;br /&gt;
Ein hochgradig für NVIDIA-GPUs optimiertes Binärformat. Es wird auf einer spezifischen Hardware-Architektur kompiliert und ist nicht portabel auf andere GPU-Typen, bietet dafür aber maximale Inferenz-Geschwindigkeit. [2, 5]&lt;br /&gt;
&lt;br /&gt;
=Typischer Workflow (Pipeline)=&lt;br /&gt;
&#039;&#039;&#039;Training / Speicherung:&#039;&#039;&#039; Das Modell wird in PyTorch als .pt oder .pth trainiert (oder als .safetensors gesichert).&lt;br /&gt;
&#039;&#039;&#039;Export:&#039;&#039;&#039; Das Modell wird nach ONNX (.onnx) exportiert, um eine neutrale Zwischenform des Graphen zu erhalten.&lt;br /&gt;
&#039;&#039;&#039;Optimierung / Inferenz:&#039;&#039;&#039; Über NVIDIA TensorRT (trtexec) wird aus dem ONNX-Modell eine hardware-spezifische .engine- oder .trt-Datei für den schnellen Produktionseinsatz auf GPUs generiert. [2, 4, 5, 6]&lt;br /&gt;
&lt;br /&gt;
Mehr Details zu den Unterschieden findet man im offiziellen Blogbeitrag zu Common AI Model Formats. [1]&lt;br /&gt;
&lt;br /&gt;
[1] https://huggingface.co&lt;br /&gt;
[2] https://github.com&lt;br /&gt;
[3] https://techjacksolutions.com&lt;br /&gt;
[4] https://www.youtube.com&lt;br /&gt;
[5] https://huggingface.co&lt;br /&gt;
[6] https://github.com&lt;br /&gt;
&lt;br /&gt;
=Die Formate im Detail=&lt;br /&gt;
==.pt / .pth (PyTorch)==&lt;br /&gt;
Das .pt und .pth Format sind technisch gesehen völlig identisch. Es gibt absolut keinen Unterschied im inneren Aufbau der Dateien. Beide Erweiterungen werden in PyTorch verwendet, um &#039;&#039;&#039;serialisierte Modelle, Gewichte oder Tensoren&#039;&#039;&#039; zu speichern.&lt;br /&gt;
Die unterschiedlichen Dateiendungen sind lediglich eine Namenskonvention:&lt;br /&gt;
*.pt: Steht schlicht für PyTorch. Es ist heute der empfohlene Standard, da es Verwechslungen vermeidet.&lt;br /&gt;
*.pth: War in älteren PyTorch-Versionen üblich. Der Wechsel zu .pt wurde vollzogen, weil .pth im Python-Ökosystem bereits für Path Configuration Files (Dateien, die dem Python-Suchpfad Verzeichnisse hinzufügen) reserviert ist.&lt;br /&gt;
===Aufbau===&lt;br /&gt;
Hinter einer .pt oder .pth Datei verbirgt sich seit PyTorch 1.3 (2019) standardmäßig ein unverschlüsseltes ZIP-Archiv. Wenn du die Dateiendung in .zip änderst, kannst du sie mit jedem gängigen Entpacker (wie 7-Zip oder WinRAR) öffnen.&lt;br /&gt;
Ein entpacktes PyTorch-Modell (im modernen TorchScript- oder Zip-basierten Format) sieht strukturell meistens so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mein_modell.pt (ZIP-Archiv)&lt;br /&gt;
│&lt;br /&gt;
├── data.pkl             # Die serialisierten Python-Metadaten (Pickle-Datei)&lt;br /&gt;
├── byteorder            # Datei, die die Endianness (z. B. &#039;little&#039;) definiert&lt;br /&gt;
├── code/                # (Optional bei TorchScript) Enthält den Python/C++ Code der Modellstruktur&lt;br /&gt;
│   ├── __torch__.py&lt;br /&gt;
│   └── ...&lt;br /&gt;
└── data/                # Ordner mit den eigentlichen Binärdaten&lt;br /&gt;
    ├── 0                # Rohdaten-Tensor 1 (z. B. Weights von Layer 1)&lt;br /&gt;
    ├── 1                # Rohdaten-Tensor 2 (z. B. Biases von Layer 1)&lt;br /&gt;
    └── ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====data.pkl====&lt;br /&gt;
data.pkl (Der Pickle-Teil)&lt;br /&gt;
PyTorch nutzt Pythons Pickle-Modul zur Serialisierung. Diese Datei enthält ein Wörterbuch (Python Dictionary), das die Struktur des Modells beschreibt. Es mappt die Namen der Layer (z. B. layer1.weight, layer1.bias) auf die entsprechenden Binärdaten im data/-Ordner.&lt;br /&gt;
====data Ordner====&lt;br /&gt;
Hier liegen die tatsächlichen numerischen Werte (die gelernten Gewichte und Biases) als reine, unformatierte Binärdaten (Raw Bytes). PyTorch trennt die Metadaten (Struktur) strikt von den schweren Binärdaten (Gewichten), um das Laden extrem schnell zu machen. Mittels Memory Mapping (mmap) können die Gewichte beim Laden direkt aus der Datei in den RAM oder GPU-VRAM gespiegelt werden, ohne dass Python jede Zahl einzeln parsen muss.&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
Je nachdem, wie das Modell in PyTorch gespeichert wurde, unterscheidet sich der logische Inhalt der data.pkl:&lt;br /&gt;
&lt;br /&gt;
====Nur die Gewichte (state_dict)====&lt;br /&gt;
Code: torch.save(model.state_dict(), &#039;model.pt&#039;)&lt;br /&gt;
Inhalt: Das Archiv enthält nur die reinen Zahlenwerte der Layer. Die eigentliche Python-Klasse (die Architektur des neuronalen Netzes) ist nicht in der Datei. Zum Laden musst du das Modell erst im Code definieren und dann die Gewichte hineinladen (model.load_state_dict(...)).&lt;br /&gt;
&lt;br /&gt;
====Das gesamte Modell====&lt;br /&gt;
Code: torch.save(model, &#039;model.pt&#039;)&lt;br /&gt;
Inhalt: Pickle speichert hierbei den Pfad zur Python-Klasse und die Gewichte. Achtung: Wenn du die Datei auf einem anderen Computer lädst, auf dem das exakte Python-Skript mit der Modelldefinition fehlt, stürzt der Ladevorgang ab.&lt;br /&gt;
&lt;br /&gt;
====TorchScript-Modelle====&lt;br /&gt;
Code: torch.jit.save(traced_model, &#039;model.pt&#039;)&lt;br /&gt;
Inhalt: Enthält zusätzlich den serialisierten Code (im Ordner code/). Solche Dateien können komplett ohne Python (z. B. in einer C++ Laufzeitumgebung) geladen und ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel TODO&lt;br /&gt;
&lt;br /&gt;
==.safetensors (Hugging Face)==&lt;br /&gt;
Das .safetensors Format wurde von Hugging Face entwickelt, um die gravierenden Sicherheits- und Performance-Nachteile des klassischen .pt (Pickle)-Formats zu lösen.&lt;br /&gt;
Im Gegensatz zu .pt ist eine .safetensors-Datei kein ZIP-Archiv, sondern eine einzelne, kontinuierliche Binärdatei. Ihr Aufbau ist extrem minimalistisch, sicher und auf maximale Ladegeschwindigkeit optimiert.&lt;br /&gt;
&lt;br /&gt;
===Aufbau===&lt;br /&gt;
Eine .safetensors-Datei besteht aus exakt drei Abschnitten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌───────────────────────────┬────────────────────────────────────────────────────────┬────────────────────────────────────────────────────────┐&lt;br /&gt;
│ 1. Header-Größe (8 Bytes) │ 2. JSON-Header (Variabler Text-Bereich)                 │ 3. Tensor-Rohdaten (Reiner Binärblock)                  │&lt;br /&gt;
├───────────────────────────┼────────────────────────────────────────────────────────┼────────────────────────────────────────────────────────┤&lt;br /&gt;
│ Gibt an, wie viele Bytes  │ Enthält Metadaten und die &amp;quot;Gebrauchsanweisung&amp;quot;:        │ Hier liegen alle Gewichte und Biases hintereinander    │&lt;br /&gt;
│ der JSON-Header lang ist. │ Welcher Tensor liegt an welcher Byte-Position (Offset)?│ als unformatierte Bytes (z. B. FP16 oder BF16).        │&lt;br /&gt;
└───────────────────────────┴────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
====Die ersten 8 Bytes (Header Length)====&lt;br /&gt;
Die Datei beginnt immer mit einer 64-Bit-Ganzzahl (Unsigned Long in Little-Endian). Diese Zahl sagt dem Parser exakt, wie viele Bytes er ab jetzt lesen muss, um den gesamten Header zu erfassen.&lt;br /&gt;
&lt;br /&gt;
====Der JSON-Header (Metadaten &amp;amp; Wegweiser)====&lt;br /&gt;
Direkt nach den ersten 8 Bytes folgt ein ganz normaler UTF-8-kodierter JSON-String. &lt;br /&gt;
&lt;br /&gt;
Dieser Header enthält:&lt;br /&gt;
*&#039;&#039;&#039;Globale Metadaten&#039;&#039;&#039; (Optional): Im Feld __metadata__ können Infos wie das Erstellungsdatum, das Framework oder Einsatzzwecke stehen.&lt;br /&gt;
*&#039;&#039;&#039;Die Tensor-Map&#039;&#039;&#039;: Für jeden einzelnen Tensor im Modell gibt es einen Eintrag, der beschreibt, wie er heißt, welche Form er hat, welcher Datentyp genutzt wird und wo genau im darauffolgenden Binärblock er liegt.&lt;br /&gt;
&lt;br /&gt;
====Der Binärblock (Tensor-Rohdaten)====&lt;br /&gt;
Direkt nach dem JSON-Header (auf das Byte genau ausgerichtet) folgen die reinen, unkomprimierten numerischen Daten der Tensoren. Es gibt keine Trennzeichen, keine Ordnerstrukturen und keine Kompression. Die Daten liegen genau so im Speicher, wie die Grafikkarte oder CPU sie erwartet.&lt;br /&gt;
&lt;br /&gt;
 Da die Daten im Safetensors-Format unkomprimiert und perfekt linear angeordnet sind, kann ein System beim Laden die Datei öffnen und die Adressen im RAM direkt an die GPU übergeben. Die Daten müssen nicht ein einziges Mal im Arbeitsspeicher hin- und herkopiert werden (Zero-Copy).&lt;br /&gt;
&lt;br /&gt;
===Code-Beispiel===&lt;br /&gt;
Beispiel für einen solchen JSON-Header:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;__metadata__&amp;quot;: {&lt;br /&gt;
    &amp;quot;format&amp;quot;: &amp;quot;pt&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;model.layers.0.self_attn.q_proj.weight&amp;quot;: {&lt;br /&gt;
    &amp;quot;dtype&amp;quot;: &amp;quot;F16&amp;quot;,&lt;br /&gt;
    &amp;quot;shape&amp;quot;:,&lt;br /&gt;
    &amp;quot;data_offsets&amp;quot;: [0, 33554432]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;model.layers.0.self_attn.k_proj.weight&amp;quot;: {&lt;br /&gt;
    &amp;quot;dtype&amp;quot;: &amp;quot;F16&amp;quot;,&lt;br /&gt;
    &amp;quot;shape&amp;quot;:,&lt;br /&gt;
    &amp;quot;data_offsets&amp;quot;: [33554432, 67108864]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis zu den data_offsets: Die Zahlen [0, 33554432] bedeuten: Dieser spezifische Tensor beginnt bei Byte 0 des Binärblocks und endet bei Byte 33.554.432.&lt;br /&gt;
&lt;br /&gt;
==.onnx==&lt;br /&gt;
Das ONNX-Format (Open Neural Network Exchange) ist grundlegend anders aufgebaut als .pt oder .safetensors. Während die anderen Formate primär flache Wörterbücher (Dictionaries) von Tensoren speichern, speichert ONNX einen vollständigen, serialisierten Berechnungsgraphen (Computation Graph).&lt;br /&gt;
Technisch basiert eine .onnx-Datei auf Protocol Buffers (Protobuf), einem von Google entwickelten Verfahren zur Serialisierung strukturierter Daten.&lt;br /&gt;
&lt;br /&gt;
===Aufbau===&lt;br /&gt;
Die Struktur einer ONNX-Datei ist streng hierarchisch ineinander verschachtelt und folgt der in Protobuf definierten Architektur. Wenn man die Datei logisch zerlegt, sieht sie so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelProto (Das Gesamtmodell)&lt;br /&gt;
│&lt;br /&gt;
├── Metadaten (Version, Ersteller, IR-Version, Opsets)&lt;br /&gt;
│&lt;br /&gt;
└── GraphProto (Der Berechnungsgraph)&lt;br /&gt;
    │&lt;br /&gt;
    ├── Input  (Eingangs-Knoten, z. B. Bildgröße)&lt;br /&gt;
    ├── Output (Ausgangs-Knoten, z. B. Wahrscheinlichkeiten)&lt;br /&gt;
    │&lt;br /&gt;
    ├── NodeProto (Die Operationen / Layer)&lt;br /&gt;
    │   ├── Node 1: Conv (Faltung)  ───► Verweist auf Inputs, Outputs &amp;amp; Attribute&lt;br /&gt;
    │   ├── Node 2: ReLU (Aktivierung)&lt;br /&gt;
    │   └── ...&lt;br /&gt;
    │&lt;br /&gt;
    └── TensorProto (Initializers / Die gelernten Gewichte)&lt;br /&gt;
        ├── Gewichte für Conv 1 (Binärdaten)&lt;br /&gt;
        └── ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
====ModelProto (Der globale Container)====&lt;br /&gt;
Das ist die oberste Ebene der Datei. Sie enthält globale Metadaten, die für die Kompatibilität entscheidend sind:&lt;br /&gt;
ir_version: Die Version der ONNX-Spezifikation.&lt;br /&gt;
opset_import: Extrem wichtig. Es definiert, welche Version der Operatoren-Bibliothek genutzt wird (z. B. &amp;quot;nutze den AI-Opset Version 15&amp;quot;). Das stellt sicher, dass eine Runtime (wie ONNX Runtime) exakt weiß, wie sie eine Operation (wie z. B. Resize oder LSTM) mathematisch ausführen muss.&lt;br /&gt;
====GraphProto (Das Netzwerk-Layout)====&lt;br /&gt;
Der Graph beschreibt den gesamten Datenfluss. Er verbindet die Eingänge mit den Ausgängen über ein Netz aus mathematischen Operationen. Ein Graph hat keine Schleifen (er ist ein Directed Acyclic Graph oder DAG).&lt;br /&gt;
====NodeProto (Die mathematischen Bausteine)====&lt;br /&gt;
Jeder &amp;quot;Node&amp;quot; (Knoten) im Graphen entspricht einer mathematischen Operation (z. B. Matrixmultiplikation, Convolutions, Softmax). Ein Node speichert:&lt;br /&gt;
op_type: Der Name der Operation (z. B. Conv, Add, MatMul).&lt;br /&gt;
input / output: Strings, die die Kanten des Graphen beschreiben. Wenn Node 1 den Output &amp;quot;tensor_1&amp;quot; erzeugt und Node 2 den Input &amp;quot;tensor_1&amp;quot; erwartet, weiß die Runtime, dass diese beiden Layer hintereinandergeschaltet sind.&lt;br /&gt;
attribute: Spezifische Einstellungen für diesen Layer (z. B. die Kernel-Größe oder das Stride-Verhalten bei einer Convolution).&lt;br /&gt;
====TensorProto (Die &amp;quot;Initializer&amp;quot;)====&lt;br /&gt;
Hier liegen die gelernten Gewichte und Biases des Modells.&lt;br /&gt;
Bei kleineren Modellen liegen diese Parameter direkt eingebettet im jeweiligen TensorProto-Feld als Binärdaten innerhalb der Protobuf-Struktur.&lt;br /&gt;
&lt;br /&gt;
Besonderheit bei großen Modellen (LLMs): Da Protobuf ein striktes Größenlimit von 2 GB pro Datei hat, unterstützt ONNX das Speichern von externen Daten. Die .onnx-Datei enthält dann nur noch die Struktur des Graphen, während die schweren Gewicht-Tensoren in separaten Binärdateien (z. B. model.onnx.data) im selben Verzeichnis abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Da ONNX den Code in standardisierte mathematische Knoten übersetzt, kann ein in PyTorch trainiertes Modell als ONNX-Datei exportiert und anschließend ohne Python-Laufzeitumgebung direkt auf einer optimierten Engine wie TensorRT (NVIDIA) oder OpenVINO (Intel) mit maximaler Hardware-Ausnutzung ausgeführt werden.&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=KI_Modelldateiformate&amp;diff=5484</id>
		<title>KI Modelldateiformate</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=KI_Modelldateiformate&amp;diff=5484"/>
		<updated>2026-10-10T11:33:17Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Allgemeines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Da es recht viele Dateiformate, in denen Modelldaten gespeichert sind, gibt ist für mich wichtig wie und welche Daten in Datei abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Eins vorab. Es sind wohl alle Formate ineinander konvertierbar.&lt;br /&gt;
&lt;br /&gt;
Sie lassen sich auch mit Hilfe der WebApp Netron [https://netron.app/] visualisieren.&lt;br /&gt;
&lt;br /&gt;
 Netron is a viewer for neural network, deep learning and machine learning models.&lt;br /&gt;
&lt;br /&gt;
 Netron supports ONNX, TensorFlow Lite, PyTorch, torch.export, ExecuTorch, TorchScript, TensorFlow, Core ML, OpenVINO, Keras, Caffe, Darknet, Safetensors and NumPy.&lt;br /&gt;
&lt;br /&gt;
 Netron has experimental support for MLIR, JAX, GGUF, RKNN, ncnn, MNN, PaddlePaddle and scikit-learn.&lt;br /&gt;
&lt;br /&gt;
=Die Formate im Überblick=&lt;br /&gt;
Diese Dateiendungen stehen für gängige Machine-Learning- und Deep-Learning-Modellformate: [1, 2]&lt;br /&gt;
&lt;br /&gt;
==.pt / .pth (PyTorch)==&lt;br /&gt;
Das Standard-Speicherformat von PyTorch (basierend auf Python Pickle). Es speichert Gewichte (state_dict) oder ganze Modelle samt Trainings-Metadaten. Es ist ideal zum Weiter-Trainieren, aber unsicher beim Laden fremder Dateien (Code-Ausführung möglich). [1, 2, 3]&lt;br /&gt;
==.safetensors (Hugging Face)==&lt;br /&gt;
Ein von Hugging Face entwickeltes, sicheres Format. Es speichert nur reine Tensordaten neben einem JSON-Header, lädt extrem schnell (Lazy-Loading) und verhindert Sicherheitsrisiken durch schädlichen Python-Code. [1]&lt;br /&gt;
==.onnx (Open Neural Network Exchange)==&lt;br /&gt;
Ein herstellerunabhängiges Standardformat für Rechengraphen. Es dient der Interoperabilität, damit ein Modell aus PyTorch auf anderen Runtimes oder Plattformen (z. B. .NET, Mobile, Web) ausgeführt werden kann. [1, 4]&lt;br /&gt;
==.model (Verschiedene)== &lt;br /&gt;
Ein generischer Name für Modelldateien (häufig genutzt von Frameworks wie TensorFlow, Scikit-Learn, Keras oder SentencePiece).&lt;br /&gt;
==.engine / .trt (TensorRT)==&lt;br /&gt;
Ein hochgradig für NVIDIA-GPUs optimiertes Binärformat. Es wird auf einer spezifischen Hardware-Architektur kompiliert und ist nicht portabel auf andere GPU-Typen, bietet dafür aber maximale Inferenz-Geschwindigkeit. [2, 5]&lt;br /&gt;
&lt;br /&gt;
=Typischer Workflow (Pipeline)=&lt;br /&gt;
&#039;&#039;&#039;Training / Speicherung:&#039;&#039;&#039; Das Modell wird in PyTorch als .pt oder .pth trainiert (oder als .safetensors gesichert).&lt;br /&gt;
&#039;&#039;&#039;Export:&#039;&#039;&#039; Das Modell wird nach ONNX (.onnx) exportiert, um eine neutrale Zwischenform des Graphen zu erhalten.&lt;br /&gt;
&#039;&#039;&#039;Optimierung / Inferenz:&#039;&#039;&#039; Über NVIDIA TensorRT (trtexec) wird aus dem ONNX-Modell eine hardware-spezifische .engine- oder .trt-Datei für den schnellen Produktionseinsatz auf GPUs generiert. [2, 4, 5, 6]&lt;br /&gt;
&lt;br /&gt;
Mehr Details zu den Unterschieden findet man im offiziellen Blogbeitrag zu Common AI Model Formats. [1]&lt;br /&gt;
&lt;br /&gt;
[1] https://huggingface.co&lt;br /&gt;
[2] https://github.com&lt;br /&gt;
[3] https://techjacksolutions.com&lt;br /&gt;
[4] https://www.youtube.com&lt;br /&gt;
[5] https://huggingface.co&lt;br /&gt;
[6] https://github.com&lt;br /&gt;
&lt;br /&gt;
=Die Formate im Detail=&lt;br /&gt;
==.pt / .pth (PyTorch)==&lt;br /&gt;
Das .pt und .pth Format sind technisch gesehen völlig identisch. Es gibt absolut keinen Unterschied im inneren Aufbau der Dateien. Beide Erweiterungen werden in PyTorch verwendet, um &#039;&#039;&#039;serialisierte Modelle, Gewichte oder Tensoren&#039;&#039;&#039; zu speichern.&lt;br /&gt;
Die unterschiedlichen Dateiendungen sind lediglich eine Namenskonvention:&lt;br /&gt;
*.pt: Steht schlicht für PyTorch. Es ist heute der empfohlene Standard, da es Verwechslungen vermeidet.&lt;br /&gt;
*.pth: War in älteren PyTorch-Versionen üblich. Der Wechsel zu .pt wurde vollzogen, weil .pth im Python-Ökosystem bereits für Path Configuration Files (Dateien, die dem Python-Suchpfad Verzeichnisse hinzufügen) reserviert ist.&lt;br /&gt;
===Aufbau===&lt;br /&gt;
Hinter einer .pt oder .pth Datei verbirgt sich seit PyTorch 1.3 (2019) standardmäßig ein unverschlüsseltes ZIP-Archiv. Wenn du die Dateiendung in .zip änderst, kannst du sie mit jedem gängigen Entpacker (wie 7-Zip oder WinRAR) öffnen.&lt;br /&gt;
Ein entpacktes PyTorch-Modell (im modernen TorchScript- oder Zip-basierten Format) sieht strukturell meistens so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mein_modell.pt (ZIP-Archiv)&lt;br /&gt;
│&lt;br /&gt;
├── data.pkl             # Die serialisierten Python-Metadaten (Pickle-Datei)&lt;br /&gt;
├── byteorder            # Datei, die die Endianness (z. B. &#039;little&#039;) definiert&lt;br /&gt;
├── code/                # (Optional bei TorchScript) Enthält den Python/C++ Code der Modellstruktur&lt;br /&gt;
│   ├── __torch__.py&lt;br /&gt;
│   └── ...&lt;br /&gt;
└── data/                # Ordner mit den eigentlichen Binärdaten&lt;br /&gt;
    ├── 0                # Rohdaten-Tensor 1 (z. B. Weights von Layer 1)&lt;br /&gt;
    ├── 1                # Rohdaten-Tensor 2 (z. B. Biases von Layer 1)&lt;br /&gt;
    └── ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====data.pkl====&lt;br /&gt;
data.pkl (Der Pickle-Teil)&lt;br /&gt;
PyTorch nutzt Pythons Pickle-Modul zur Serialisierung. Diese Datei enthält ein Wörterbuch (Python Dictionary), das die Struktur des Modells beschreibt. Es mappt die Namen der Layer (z. B. layer1.weight, layer1.bias) auf die entsprechenden Binärdaten im data/-Ordner.&lt;br /&gt;
====data Ordner====&lt;br /&gt;
Hier liegen die tatsächlichen numerischen Werte (die gelernten Gewichte und Biases) als reine, unformatierte Binärdaten (Raw Bytes). PyTorch trennt die Metadaten (Struktur) strikt von den schweren Binärdaten (Gewichten), um das Laden extrem schnell zu machen. Mittels Memory Mapping (mmap) können die Gewichte beim Laden direkt aus der Datei in den RAM oder GPU-VRAM gespiegelt werden, ohne dass Python jede Zahl einzeln parsen muss.&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
Je nachdem, wie das Modell in PyTorch gespeichert wurde, unterscheidet sich der logische Inhalt der data.pkl:&lt;br /&gt;
&lt;br /&gt;
====Nur die Gewichte (state_dict)====&lt;br /&gt;
Code: torch.save(model.state_dict(), &#039;model.pt&#039;)&lt;br /&gt;
Inhalt: Das Archiv enthält nur die reinen Zahlenwerte der Layer. Die eigentliche Python-Klasse (die Architektur des neuronalen Netzes) ist nicht in der Datei. Zum Laden musst du das Modell erst im Code definieren und dann die Gewichte hineinladen (model.load_state_dict(...)).&lt;br /&gt;
&lt;br /&gt;
====Das gesamte Modell====&lt;br /&gt;
Code: torch.save(model, &#039;model.pt&#039;)&lt;br /&gt;
Inhalt: Pickle speichert hierbei den Pfad zur Python-Klasse und die Gewichte. Achtung: Wenn du die Datei auf einem anderen Computer lädst, auf dem das exakte Python-Skript mit der Modelldefinition fehlt, stürzt der Ladevorgang ab.&lt;br /&gt;
&lt;br /&gt;
====TorchScript-Modelle====&lt;br /&gt;
Code: torch.jit.save(traced_model, &#039;model.pt&#039;)&lt;br /&gt;
Inhalt: Enthält zusätzlich den serialisierten Code (im Ordner code/). Solche Dateien können komplett ohne Python (z. B. in einer C++ Laufzeitumgebung) geladen und ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel TODO&lt;br /&gt;
&lt;br /&gt;
==.safetensors (Hugging Face)==&lt;br /&gt;
Das .safetensors Format wurde von Hugging Face entwickelt, um die gravierenden Sicherheits- und Performance-Nachteile des klassischen .pt (Pickle)-Formats zu lösen.&lt;br /&gt;
Im Gegensatz zu .pt ist eine .safetensors-Datei kein ZIP-Archiv, sondern eine einzelne, kontinuierliche Binärdatei. Ihr Aufbau ist extrem minimalistisch, sicher und auf maximale Ladegeschwindigkeit optimiert.&lt;br /&gt;
&lt;br /&gt;
===Aufbau===&lt;br /&gt;
Eine .safetensors-Datei besteht aus exakt drei Abschnitten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌───────────────────────────┬────────────────────────────────────────────────────────┬────────────────────────────────────────────────────────┐&lt;br /&gt;
│ 1. Header-Größe (8 Bytes) │ 2. JSON-Header (Variabler Text-Bereich)                 │ 3. Tensor-Rohdaten (Reiner Binärblock)                  │&lt;br /&gt;
├───────────────────────────┼────────────────────────────────────────────────────────┼────────────────────────────────────────────────────────┤&lt;br /&gt;
│ Gibt an, wie viele Bytes  │ Enthält Metadaten und die &amp;quot;Gebrauchsanweisung&amp;quot;:        │ Hier liegen alle Gewichte und Biases hintereinander    │&lt;br /&gt;
│ der JSON-Header lang ist. │ Welcher Tensor liegt an welcher Byte-Position (Offset)?│ als unformatierte Bytes (z. B. FP16 oder BF16).        │&lt;br /&gt;
└───────────────────────────┴────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
====Die ersten 8 Bytes (Header Length)====&lt;br /&gt;
Die Datei beginnt immer mit einer 64-Bit-Ganzzahl (Unsigned Long in Little-Endian). Diese Zahl sagt dem Parser exakt, wie viele Bytes er ab jetzt lesen muss, um den gesamten Header zu erfassen.&lt;br /&gt;
&lt;br /&gt;
====Der JSON-Header (Metadaten &amp;amp; Wegweiser)====&lt;br /&gt;
Direkt nach den ersten 8 Bytes folgt ein ganz normaler UTF-8-kodierter JSON-String. &lt;br /&gt;
&lt;br /&gt;
Dieser Header enthält:&lt;br /&gt;
*&#039;&#039;&#039;Globale Metadaten&#039;&#039;&#039; (Optional): Im Feld __metadata__ können Infos wie das Erstellungsdatum, das Framework oder Einsatzzwecke stehen.&lt;br /&gt;
*&#039;&#039;&#039;Die Tensor-Map&#039;&#039;&#039;: Für jeden einzelnen Tensor im Modell gibt es einen Eintrag, der beschreibt, wie er heißt, welche Form er hat, welcher Datentyp genutzt wird und wo genau im darauffolgenden Binärblock er liegt.&lt;br /&gt;
&lt;br /&gt;
====Der Binärblock (Tensor-Rohdaten)====&lt;br /&gt;
Direkt nach dem JSON-Header (auf das Byte genau ausgerichtet) folgen die reinen, unkomprimierten numerischen Daten der Tensoren. Es gibt keine Trennzeichen, keine Ordnerstrukturen und keine Kompression. Die Daten liegen genau so im Speicher, wie die Grafikkarte oder CPU sie erwartet.&lt;br /&gt;
&lt;br /&gt;
 Da die Daten im Safetensors-Format unkomprimiert und perfekt linear angeordnet sind, kann ein System beim Laden die Datei öffnen und die Adressen im RAM direkt an die GPU übergeben. Die Daten müssen nicht ein einziges Mal im Arbeitsspeicher hin- und herkopiert werden (Zero-Copy).&lt;br /&gt;
&lt;br /&gt;
===Code-Beispiel===&lt;br /&gt;
Beispiel für einen solchen JSON-Header:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;__metadata__&amp;quot;: {&lt;br /&gt;
    &amp;quot;format&amp;quot;: &amp;quot;pt&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;model.layers.0.self_attn.q_proj.weight&amp;quot;: {&lt;br /&gt;
    &amp;quot;dtype&amp;quot;: &amp;quot;F16&amp;quot;,&lt;br /&gt;
    &amp;quot;shape&amp;quot;:,&lt;br /&gt;
    &amp;quot;data_offsets&amp;quot;: [0, 33554432]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;model.layers.0.self_attn.k_proj.weight&amp;quot;: {&lt;br /&gt;
    &amp;quot;dtype&amp;quot;: &amp;quot;F16&amp;quot;,&lt;br /&gt;
    &amp;quot;shape&amp;quot;:,&lt;br /&gt;
    &amp;quot;data_offsets&amp;quot;: [33554432, 67108864]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis zu den data_offsets: Die Zahlen [0, 33554432] bedeuten: Dieser spezifische Tensor beginnt bei Byte 0 des Binärblocks und endet bei Byte 33.554.432.&lt;br /&gt;
&lt;br /&gt;
==.onnx==&lt;br /&gt;
Das ONNX-Format (Open Neural Network Exchange) ist grundlegend anders aufgebaut als .pt oder .safetensors. Während die anderen Formate primär flache Wörterbücher (Dictionaries) von Tensoren speichern, speichert ONNX einen vollständigen, serialisierten Berechnungsgraphen (Computation Graph).&lt;br /&gt;
Technisch basiert eine .onnx-Datei auf Protocol Buffers (Protobuf), einem von Google entwickelten Verfahren zur Serialisierung strukturierter Daten.&lt;br /&gt;
&lt;br /&gt;
===Aufbau===&lt;br /&gt;
Die Struktur einer ONNX-Datei ist streng hierarchisch ineinander verschachtelt und folgt der in Protobuf definierten Architektur. Wenn man die Datei logisch zerlegt, sieht sie so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelProto (Das Gesamtmodell)&lt;br /&gt;
│&lt;br /&gt;
├── Metadaten (Version, Ersteller, IR-Version, Opsets)&lt;br /&gt;
│&lt;br /&gt;
└── GraphProto (Der Berechnungsgraph)&lt;br /&gt;
    │&lt;br /&gt;
    ├── Input  (Eingangs-Knoten, z. B. Bildgröße)&lt;br /&gt;
    ├── Output (Ausgangs-Knoten, z. B. Wahrscheinlichkeiten)&lt;br /&gt;
    │&lt;br /&gt;
    ├── NodeProto (Die Operationen / Layer)&lt;br /&gt;
    │   ├── Node 1: Conv (Faltung)  ───► Verweist auf Inputs, Outputs &amp;amp; Attribute&lt;br /&gt;
    │   ├── Node 2: ReLU (Aktivierung)&lt;br /&gt;
    │   └── ...&lt;br /&gt;
    │&lt;br /&gt;
    └── TensorProto (Initializers / Die gelernten Gewichte)&lt;br /&gt;
        ├── Gewichte für Conv 1 (Binärdaten)&lt;br /&gt;
        └── ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
====ModelProto (Der globale Container)====&lt;br /&gt;
Das ist die oberste Ebene der Datei. Sie enthält globale Metadaten, die für die Kompatibilität entscheidend sind:&lt;br /&gt;
ir_version: Die Version der ONNX-Spezifikation.&lt;br /&gt;
opset_import: Extrem wichtig. Es definiert, welche Version der Operatoren-Bibliothek genutzt wird (z. B. &amp;quot;nutze den AI-Opset Version 15&amp;quot;). Das stellt sicher, dass eine Runtime (wie ONNX Runtime) exakt weiß, wie sie eine Operation (wie z. B. Resize oder LSTM) mathematisch ausführen muss.&lt;br /&gt;
====GraphProto (Das Netzwerk-Layout)====&lt;br /&gt;
Der Graph beschreibt den gesamten Datenfluss. Er verbindet die Eingänge mit den Ausgängen über ein Netz aus mathematischen Operationen. Ein Graph hat keine Schleifen (er ist ein Directed Acyclic Graph oder DAG).&lt;br /&gt;
====NodeProto (Die mathematischen Bausteine)====&lt;br /&gt;
Jeder &amp;quot;Node&amp;quot; (Knoten) im Graphen entspricht einer mathematischen Operation (z. B. Matrixmultiplikation, Convolutions, Softmax). Ein Node speichert:&lt;br /&gt;
op_type: Der Name der Operation (z. B. Conv, Add, MatMul).&lt;br /&gt;
input / output: Strings, die die Kanten des Graphen beschreiben. Wenn Node 1 den Output &amp;quot;tensor_1&amp;quot; erzeugt und Node 2 den Input &amp;quot;tensor_1&amp;quot; erwartet, weiß die Runtime, dass diese beiden Layer hintereinandergeschaltet sind.&lt;br /&gt;
attribute: Spezifische Einstellungen für diesen Layer (z. B. die Kernel-Größe oder das Stride-Verhalten bei einer Convolution).&lt;br /&gt;
====TensorProto (Die &amp;quot;Initializer&amp;quot;)====&lt;br /&gt;
Hier liegen die gelernten Gewichte und Biases des Modells.&lt;br /&gt;
Bei kleineren Modellen liegen diese Parameter direkt eingebettet im jeweiligen TensorProto-Feld als Binärdaten innerhalb der Protobuf-Struktur.&lt;br /&gt;
&lt;br /&gt;
Besonderheit bei großen Modellen (LLMs): Da Protobuf ein striktes Größenlimit von 2 GB pro Datei hat, unterstützt ONNX das Speichern von externen Daten. Die .onnx-Datei enthält dann nur noch die Struktur des Graphen, während die schweren Gewicht-Tensoren in separaten Binärdateien (z. B. model.onnx.data) im selben Verzeichnis abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Da ONNX den Code in standardisierte mathematische Knoten übersetzt, kann ein in PyTorch trainiertes Modell als ONNX-Datei exportiert und anschließend ohne Python-Laufzeitumgebung direkt auf einer optimierten Engine wie TensorRT (NVIDIA) oder OpenVINO (Intel) mit maximaler Hardware-Ausnutzung ausgeführt werden.&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=KI_Modelldateiformate&amp;diff=5483</id>
		<title>KI Modelldateiformate</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=KI_Modelldateiformate&amp;diff=5483"/>
		<updated>2026-10-10T11:11:54Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Die Seite wurde neu angelegt: „=Allgemeines= Da es recht viele Dateiformate, in denen Modelldaten gespeichert sind, gibt ist für mich wichtig wie und welche Daten in Datei abgelegt werden.  Eins vorab. Es sind wohl alle Formate ineinander konvertierbar.  Sie lassen sich auch mit Hilfe der WebApp netron [https://netron.app/] visualisieren.  =Die Formate im Überblick= Diese Dateiendungen stehen für gängige Machine-Learning- und Deep-Learning-Modellformate: [1, 2]  ==.pt / .pth (PyTor…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Da es recht viele Dateiformate, in denen Modelldaten gespeichert sind, gibt ist für mich wichtig wie und welche Daten in Datei abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Eins vorab. Es sind wohl alle Formate ineinander konvertierbar.&lt;br /&gt;
&lt;br /&gt;
Sie lassen sich auch mit Hilfe der WebApp netron [https://netron.app/] visualisieren.&lt;br /&gt;
&lt;br /&gt;
=Die Formate im Überblick=&lt;br /&gt;
Diese Dateiendungen stehen für gängige Machine-Learning- und Deep-Learning-Modellformate: [1, 2]&lt;br /&gt;
&lt;br /&gt;
==.pt / .pth (PyTorch)==&lt;br /&gt;
Das Standard-Speicherformat von PyTorch (basierend auf Python Pickle). Es speichert Gewichte (state_dict) oder ganze Modelle samt Trainings-Metadaten. Es ist ideal zum Weiter-Trainieren, aber unsicher beim Laden fremder Dateien (Code-Ausführung möglich). [1, 2, 3]&lt;br /&gt;
==.safetensors (Hugging Face)==&lt;br /&gt;
Ein von Hugging Face entwickeltes, sicheres Format. Es speichert nur reine Tensordaten neben einem JSON-Header, lädt extrem schnell (Lazy-Loading) und verhindert Sicherheitsrisiken durch schädlichen Python-Code. [1]&lt;br /&gt;
==.onnx (Open Neural Network Exchange)==&lt;br /&gt;
Ein herstellerunabhängiges Standardformat für Rechengraphen. Es dient der Interoperabilität, damit ein Modell aus PyTorch auf anderen Runtimes oder Plattformen (z. B. .NET, Mobile, Web) ausgeführt werden kann. [1, 4]&lt;br /&gt;
==.model (Verschiedene)== &lt;br /&gt;
Ein generischer Name für Modelldateien (häufig genutzt von Frameworks wie TensorFlow, Scikit-Learn, Keras oder SentencePiece).&lt;br /&gt;
==.engine / .trt (TensorRT)==&lt;br /&gt;
Ein hochgradig für NVIDIA-GPUs optimiertes Binärformat. Es wird auf einer spezifischen Hardware-Architektur kompiliert und ist nicht portabel auf andere GPU-Typen, bietet dafür aber maximale Inferenz-Geschwindigkeit. [2, 5]&lt;br /&gt;
&lt;br /&gt;
=Typischer Workflow (Pipeline)=&lt;br /&gt;
&#039;&#039;&#039;Training / Speicherung:&#039;&#039;&#039; Das Modell wird in PyTorch als .pt oder .pth trainiert (oder als .safetensors gesichert).&lt;br /&gt;
&#039;&#039;&#039;Export:&#039;&#039;&#039; Das Modell wird nach ONNX (.onnx) exportiert, um eine neutrale Zwischenform des Graphen zu erhalten.&lt;br /&gt;
&#039;&#039;&#039;Optimierung / Inferenz:&#039;&#039;&#039; Über NVIDIA TensorRT (trtexec) wird aus dem ONNX-Modell eine hardware-spezifische .engine- oder .trt-Datei für den schnellen Produktionseinsatz auf GPUs generiert. [2, 4, 5, 6]&lt;br /&gt;
&lt;br /&gt;
Mehr Details zu den Unterschieden findet man im offiziellen Blogbeitrag zu Common AI Model Formats. [1]&lt;br /&gt;
&lt;br /&gt;
[1] https://huggingface.co&lt;br /&gt;
[2] https://github.com&lt;br /&gt;
[3] https://techjacksolutions.com&lt;br /&gt;
[4] https://www.youtube.com&lt;br /&gt;
[5] https://huggingface.co&lt;br /&gt;
[6] https://github.com&lt;br /&gt;
&lt;br /&gt;
=Die Formate im Detail=&lt;br /&gt;
==.pt / .pth (PyTorch)==&lt;br /&gt;
Das .pt und .pth Format sind technisch gesehen völlig identisch. Es gibt absolut keinen Unterschied im inneren Aufbau der Dateien. Beide Erweiterungen werden in PyTorch verwendet, um &#039;&#039;&#039;serialisierte Modelle, Gewichte oder Tensoren&#039;&#039;&#039; zu speichern.&lt;br /&gt;
Die unterschiedlichen Dateiendungen sind lediglich eine Namenskonvention:&lt;br /&gt;
*.pt: Steht schlicht für PyTorch. Es ist heute der empfohlene Standard, da es Verwechslungen vermeidet.&lt;br /&gt;
*.pth: War in älteren PyTorch-Versionen üblich. Der Wechsel zu .pt wurde vollzogen, weil .pth im Python-Ökosystem bereits für Path Configuration Files (Dateien, die dem Python-Suchpfad Verzeichnisse hinzufügen) reserviert ist.&lt;br /&gt;
===Aufbau===&lt;br /&gt;
Hinter einer .pt oder .pth Datei verbirgt sich seit PyTorch 1.3 (2019) standardmäßig ein unverschlüsseltes ZIP-Archiv. Wenn du die Dateiendung in .zip änderst, kannst du sie mit jedem gängigen Entpacker (wie 7-Zip oder WinRAR) öffnen.&lt;br /&gt;
Ein entpacktes PyTorch-Modell (im modernen TorchScript- oder Zip-basierten Format) sieht strukturell meistens so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mein_modell.pt (ZIP-Archiv)&lt;br /&gt;
│&lt;br /&gt;
├── data.pkl             # Die serialisierten Python-Metadaten (Pickle-Datei)&lt;br /&gt;
├── byteorder            # Datei, die die Endianness (z. B. &#039;little&#039;) definiert&lt;br /&gt;
├── code/                # (Optional bei TorchScript) Enthält den Python/C++ Code der Modellstruktur&lt;br /&gt;
│   ├── __torch__.py&lt;br /&gt;
│   └── ...&lt;br /&gt;
└── data/                # Ordner mit den eigentlichen Binärdaten&lt;br /&gt;
    ├── 0                # Rohdaten-Tensor 1 (z. B. Weights von Layer 1)&lt;br /&gt;
    ├── 1                # Rohdaten-Tensor 2 (z. B. Biases von Layer 1)&lt;br /&gt;
    └── ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====data.pkl====&lt;br /&gt;
data.pkl (Der Pickle-Teil)&lt;br /&gt;
PyTorch nutzt Pythons Pickle-Modul zur Serialisierung. Diese Datei enthält ein Wörterbuch (Python Dictionary), das die Struktur des Modells beschreibt. Es mappt die Namen der Layer (z. B. layer1.weight, layer1.bias) auf die entsprechenden Binärdaten im data/-Ordner.&lt;br /&gt;
====data Ordner====&lt;br /&gt;
Hier liegen die tatsächlichen numerischen Werte (die gelernten Gewichte und Biases) als reine, unformatierte Binärdaten (Raw Bytes). PyTorch trennt die Metadaten (Struktur) strikt von den schweren Binärdaten (Gewichten), um das Laden extrem schnell zu machen. Mittels Memory Mapping (mmap) können die Gewichte beim Laden direkt aus der Datei in den RAM oder GPU-VRAM gespiegelt werden, ohne dass Python jede Zahl einzeln parsen muss.&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
Je nachdem, wie das Modell in PyTorch gespeichert wurde, unterscheidet sich der logische Inhalt der data.pkl:&lt;br /&gt;
&lt;br /&gt;
====Nur die Gewichte (state_dict)====&lt;br /&gt;
Code: torch.save(model.state_dict(), &#039;model.pt&#039;)&lt;br /&gt;
Inhalt: Das Archiv enthält nur die reinen Zahlenwerte der Layer. Die eigentliche Python-Klasse (die Architektur des neuronalen Netzes) ist nicht in der Datei. Zum Laden musst du das Modell erst im Code definieren und dann die Gewichte hineinladen (model.load_state_dict(...)).&lt;br /&gt;
&lt;br /&gt;
====Das gesamte Modell====&lt;br /&gt;
Code: torch.save(model, &#039;model.pt&#039;)&lt;br /&gt;
Inhalt: Pickle speichert hierbei den Pfad zur Python-Klasse und die Gewichte. Achtung: Wenn du die Datei auf einem anderen Computer lädst, auf dem das exakte Python-Skript mit der Modelldefinition fehlt, stürzt der Ladevorgang ab.&lt;br /&gt;
&lt;br /&gt;
====TorchScript-Modelle====&lt;br /&gt;
Code: torch.jit.save(traced_model, &#039;model.pt&#039;)&lt;br /&gt;
Inhalt: Enthält zusätzlich den serialisierten Code (im Ordner code/). Solche Dateien können komplett ohne Python (z. B. in einer C++ Laufzeitumgebung) geladen und ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel TODO&lt;br /&gt;
&lt;br /&gt;
==.safetensors (Hugging Face)==&lt;br /&gt;
Das .safetensors Format wurde von Hugging Face entwickelt, um die gravierenden Sicherheits- und Performance-Nachteile des klassischen .pt (Pickle)-Formats zu lösen.&lt;br /&gt;
Im Gegensatz zu .pt ist eine .safetensors-Datei kein ZIP-Archiv, sondern eine einzelne, kontinuierliche Binärdatei. Ihr Aufbau ist extrem minimalistisch, sicher und auf maximale Ladegeschwindigkeit optimiert.&lt;br /&gt;
&lt;br /&gt;
===Aufbau===&lt;br /&gt;
Eine .safetensors-Datei besteht aus exakt drei Abschnitten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌───────────────────────────┬────────────────────────────────────────────────────────┬────────────────────────────────────────────────────────┐&lt;br /&gt;
│ 1. Header-Größe (8 Bytes) │ 2. JSON-Header (Variabler Text-Bereich)                 │ 3. Tensor-Rohdaten (Reiner Binärblock)                  │&lt;br /&gt;
├───────────────────────────┼────────────────────────────────────────────────────────┼────────────────────────────────────────────────────────┤&lt;br /&gt;
│ Gibt an, wie viele Bytes  │ Enthält Metadaten und die &amp;quot;Gebrauchsanweisung&amp;quot;:        │ Hier liegen alle Gewichte und Biases hintereinander    │&lt;br /&gt;
│ der JSON-Header lang ist. │ Welcher Tensor liegt an welcher Byte-Position (Offset)?│ als unformatierte Bytes (z. B. FP16 oder BF16).        │&lt;br /&gt;
└───────────────────────────┴────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
====Die ersten 8 Bytes (Header Length)====&lt;br /&gt;
Die Datei beginnt immer mit einer 64-Bit-Ganzzahl (Unsigned Long in Little-Endian). Diese Zahl sagt dem Parser exakt, wie viele Bytes er ab jetzt lesen muss, um den gesamten Header zu erfassen.&lt;br /&gt;
&lt;br /&gt;
====Der JSON-Header (Metadaten &amp;amp; Wegweiser)====&lt;br /&gt;
Direkt nach den ersten 8 Bytes folgt ein ganz normaler UTF-8-kodierter JSON-String. &lt;br /&gt;
&lt;br /&gt;
Dieser Header enthält:&lt;br /&gt;
*&#039;&#039;&#039;Globale Metadaten&#039;&#039;&#039; (Optional): Im Feld __metadata__ können Infos wie das Erstellungsdatum, das Framework oder Einsatzzwecke stehen.&lt;br /&gt;
*&#039;&#039;&#039;Die Tensor-Map&#039;&#039;&#039;: Für jeden einzelnen Tensor im Modell gibt es einen Eintrag, der beschreibt, wie er heißt, welche Form er hat, welcher Datentyp genutzt wird und wo genau im darauffolgenden Binärblock er liegt.&lt;br /&gt;
&lt;br /&gt;
====Der Binärblock (Tensor-Rohdaten)====&lt;br /&gt;
Direkt nach dem JSON-Header (auf das Byte genau ausgerichtet) folgen die reinen, unkomprimierten numerischen Daten der Tensoren. Es gibt keine Trennzeichen, keine Ordnerstrukturen und keine Kompression. Die Daten liegen genau so im Speicher, wie die Grafikkarte oder CPU sie erwartet.&lt;br /&gt;
&lt;br /&gt;
 Da die Daten im Safetensors-Format unkomprimiert und perfekt linear angeordnet sind, kann ein System beim Laden die Datei öffnen und die Adressen im RAM direkt an die GPU übergeben. Die Daten müssen nicht ein einziges Mal im Arbeitsspeicher hin- und herkopiert werden (Zero-Copy).&lt;br /&gt;
&lt;br /&gt;
===Code-Beispiel===&lt;br /&gt;
Beispiel für einen solchen JSON-Header:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;__metadata__&amp;quot;: {&lt;br /&gt;
    &amp;quot;format&amp;quot;: &amp;quot;pt&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;model.layers.0.self_attn.q_proj.weight&amp;quot;: {&lt;br /&gt;
    &amp;quot;dtype&amp;quot;: &amp;quot;F16&amp;quot;,&lt;br /&gt;
    &amp;quot;shape&amp;quot;:,&lt;br /&gt;
    &amp;quot;data_offsets&amp;quot;: [0, 33554432]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;model.layers.0.self_attn.k_proj.weight&amp;quot;: {&lt;br /&gt;
    &amp;quot;dtype&amp;quot;: &amp;quot;F16&amp;quot;,&lt;br /&gt;
    &amp;quot;shape&amp;quot;:,&lt;br /&gt;
    &amp;quot;data_offsets&amp;quot;: [33554432, 67108864]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis zu den data_offsets: Die Zahlen [0, 33554432] bedeuten: Dieser spezifische Tensor beginnt bei Byte 0 des Binärblocks und endet bei Byte 33.554.432.&lt;br /&gt;
&lt;br /&gt;
==.onnx==&lt;br /&gt;
Das ONNX-Format (Open Neural Network Exchange) ist grundlegend anders aufgebaut als .pt oder .safetensors. Während die anderen Formate primär flache Wörterbücher (Dictionaries) von Tensoren speichern, speichert ONNX einen vollständigen, serialisierten Berechnungsgraphen (Computation Graph).&lt;br /&gt;
Technisch basiert eine .onnx-Datei auf Protocol Buffers (Protobuf), einem von Google entwickelten Verfahren zur Serialisierung strukturierter Daten.&lt;br /&gt;
&lt;br /&gt;
===Aufbau===&lt;br /&gt;
Die Struktur einer ONNX-Datei ist streng hierarchisch ineinander verschachtelt und folgt der in Protobuf definierten Architektur. Wenn man die Datei logisch zerlegt, sieht sie so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelProto (Das Gesamtmodell)&lt;br /&gt;
│&lt;br /&gt;
├── Metadaten (Version, Ersteller, IR-Version, Opsets)&lt;br /&gt;
│&lt;br /&gt;
└── GraphProto (Der Berechnungsgraph)&lt;br /&gt;
    │&lt;br /&gt;
    ├── Input  (Eingangs-Knoten, z. B. Bildgröße)&lt;br /&gt;
    ├── Output (Ausgangs-Knoten, z. B. Wahrscheinlichkeiten)&lt;br /&gt;
    │&lt;br /&gt;
    ├── NodeProto (Die Operationen / Layer)&lt;br /&gt;
    │   ├── Node 1: Conv (Faltung)  ───► Verweist auf Inputs, Outputs &amp;amp; Attribute&lt;br /&gt;
    │   ├── Node 2: ReLU (Aktivierung)&lt;br /&gt;
    │   └── ...&lt;br /&gt;
    │&lt;br /&gt;
    └── TensorProto (Initializers / Die gelernten Gewichte)&lt;br /&gt;
        ├── Gewichte für Conv 1 (Binärdaten)&lt;br /&gt;
        └── ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
====ModelProto (Der globale Container)====&lt;br /&gt;
Das ist die oberste Ebene der Datei. Sie enthält globale Metadaten, die für die Kompatibilität entscheidend sind:&lt;br /&gt;
ir_version: Die Version der ONNX-Spezifikation.&lt;br /&gt;
opset_import: Extrem wichtig. Es definiert, welche Version der Operatoren-Bibliothek genutzt wird (z. B. &amp;quot;nutze den AI-Opset Version 15&amp;quot;). Das stellt sicher, dass eine Runtime (wie ONNX Runtime) exakt weiß, wie sie eine Operation (wie z. B. Resize oder LSTM) mathematisch ausführen muss.&lt;br /&gt;
====GraphProto (Das Netzwerk-Layout)====&lt;br /&gt;
Der Graph beschreibt den gesamten Datenfluss. Er verbindet die Eingänge mit den Ausgängen über ein Netz aus mathematischen Operationen. Ein Graph hat keine Schleifen (er ist ein Directed Acyclic Graph oder DAG).&lt;br /&gt;
====NodeProto (Die mathematischen Bausteine)====&lt;br /&gt;
Jeder &amp;quot;Node&amp;quot; (Knoten) im Graphen entspricht einer mathematischen Operation (z. B. Matrixmultiplikation, Convolutions, Softmax). Ein Node speichert:&lt;br /&gt;
op_type: Der Name der Operation (z. B. Conv, Add, MatMul).&lt;br /&gt;
input / output: Strings, die die Kanten des Graphen beschreiben. Wenn Node 1 den Output &amp;quot;tensor_1&amp;quot; erzeugt und Node 2 den Input &amp;quot;tensor_1&amp;quot; erwartet, weiß die Runtime, dass diese beiden Layer hintereinandergeschaltet sind.&lt;br /&gt;
attribute: Spezifische Einstellungen für diesen Layer (z. B. die Kernel-Größe oder das Stride-Verhalten bei einer Convolution).&lt;br /&gt;
====TensorProto (Die &amp;quot;Initializer&amp;quot;)====&lt;br /&gt;
Hier liegen die gelernten Gewichte und Biases des Modells.&lt;br /&gt;
Bei kleineren Modellen liegen diese Parameter direkt eingebettet im jeweiligen TensorProto-Feld als Binärdaten innerhalb der Protobuf-Struktur.&lt;br /&gt;
&lt;br /&gt;
Besonderheit bei großen Modellen (LLMs): Da Protobuf ein striktes Größenlimit von 2 GB pro Datei hat, unterstützt ONNX das Speichern von externen Daten. Die .onnx-Datei enthält dann nur noch die Struktur des Graphen, während die schweren Gewicht-Tensoren in separaten Binärdateien (z. B. model.onnx.data) im selben Verzeichnis abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Da ONNX den Code in standardisierte mathematische Knoten übersetzt, kann ein in PyTorch trainiertes Modell als ONNX-Datei exportiert und anschließend ohne Python-Laufzeitumgebung direkt auf einer optimierten Engine wie TensorRT (NVIDIA) oder OpenVINO (Intel) mit maximaler Hardware-Ausnutzung ausgeführt werden.&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=KI_Vokabel&amp;diff=5482</id>
		<title>KI Vokabel</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=KI_Vokabel&amp;diff=5482"/>
		<updated>2026-10-10T10:27:27Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Warum nutzt man heute dafür Deep Learning? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Maximal Arbitraer=&lt;br /&gt;
&lt;br /&gt;
In der Informatik und Mathematik hat das Konzept der maximalen Arbitrarität eine fundamentale, oft sehr technische Bedeutung. Hier geht es meist um echte Zufälligkeit oder das bewusste Ignorieren von Mustern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kryptographie-echte-zufallszahlen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Kryptographie &amp;amp;amp; Echte Zufallszahlen ==&lt;br /&gt;
&lt;br /&gt;
* Echter Zufall: Computer können von Natur aus nicht rein zufällig handeln. Sie sind deterministisch.&lt;br /&gt;
* Maximale Unvorhersehbarkeit: Für sichere Verschlüsselungen braucht man Schlüssel, die maximal arbiträr (unvorhersehbar) sind.&lt;br /&gt;
* Hardware-Zufall: Man nutzt physikalische Prozesse (wie atomaren Zerfall oder thermisches Rauschen), um diese absolute Willkür zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;algorithmen-arbitrary-choice&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Algorithmen &amp;amp;amp; „Arbitrary Choice“ ==&lt;br /&gt;
&lt;br /&gt;
* Reihenfolge ist egal: In der theoretischen Informatik bedeutet eine „arbiträre Auswahl“, dass ein Algorithmus irgendein Element wählt.&lt;br /&gt;
* Keine Bevorzugung: Es gibt keine Sortierung oder Priorität. Das Ergebnis des Algorithmus muss korrekt sein, egal welches Element zuerst gewählt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;beliebige-genauigkeit-arbitrary-precision&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Beliebige Genauigkeit (Arbitrary Precision) ==&lt;br /&gt;
&lt;br /&gt;
* Keine künstlichen Grenzen: Normalerweise speichert ein Computer Zahlen in festen Größen (z. B. 32-Bit oder 64-Bit).&lt;br /&gt;
* Unbegrenzte Kapazität: Bei Arbitrary-Precision-Arithmetik (BigInfs) entscheidet der Programmierer oder der Speicher dynamisch, wie groß eine Zahl sein darf. Die Grenze ist maximal flexibel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;software-testing-fuzzing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Software-Testing (Fuzzing) ==&lt;br /&gt;
&lt;br /&gt;
* Chaotische Eingaben: Beim sogenannten Fuzz-Testing wird Software mit maximal arbiträren, oft völlig sinnlosen Daten gefüttert.&lt;br /&gt;
* Sicherheitslücken finden: Das Ziel ist es, das Programm durch unvorhersehbare Eingaben zum Absturz zu bringen, um versteckte Bugs zu finden.&lt;br /&gt;
&lt;br /&gt;
Siehe auch Arbitrage. Beide Begriffe stammen vom lateinischen Substantiv arbiter (der Schiedsrichter, Richter oder Vermittler). Daraus bildete sich das lateinische Verb arbitrari (ermessen, entscheiden, glauben) und das Substantiv arbitratus („Gutdünken, freie Wahl, freies Ermessen“).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Zufallszahlen=&lt;br /&gt;
&lt;br /&gt;
 Computer koennen keine echten Zufallszahlen erzeugen.&lt;br /&gt;
&lt;br /&gt;
Ja, diese Aussage ist im Kern richtig, solange man von herkömmlichen Standard-Computern und reiner Software ausgeht. Standard-Computer sind deterministisch. Das bedeutet: Sie folgen strikten, logischen Regeln. Wenn ein Computer denselben Startwert (Seed) und denselben Algorithmus nutzt, wird er immer exakt dieselbe Zahlenfolge berechnen. In der Informatik unterscheidet man daher zwei Arten von Zufall: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pseudo-zufallszahlen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Pseudo-Zufallszahlen (PRNGs) – Kein echter Zufall ==&lt;br /&gt;
&lt;br /&gt;
* Die Methode: Reine Software-Algorithmen berechnen Zahlenreihen.&lt;br /&gt;
* Das Problem: Sie wirken für Menschen zufällig, sind es aber mathematisch nicht. Wer die Formel und den Startwert kennt, kann jede zukünftige Zahl perfekt vorhersagen.&lt;br /&gt;
* Einsatzbereich: Videospiele (z. B. Beute-Verteilung) oder statistische Simulationen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;echte-zufallszahlen-trngs-der-physikalische-trick&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Echte Zufallszahlen (TRNGs) – Der physikalische Trick ==&lt;br /&gt;
&lt;br /&gt;
Moderne Computer können heute über Umwege doch echten Zufall erzeugen. Dafür verlassen sie die reine Software-Ebene und nutzen die chaotische Physik der echten Welt:&lt;br /&gt;
&lt;br /&gt;
* Hardware-Zufallsgeneratoren: Speziell verbaute Chips messen winzige, unvorhersehbare physikalische Prozesse.&lt;br /&gt;
* Beispiele: Thermisches Rauschen (Wärme von Elektronen), atmosphärisches Rauschen, radioaktiver Zerfall oder das unregelmäßige Tippverhalten eines Nutzers auf der Tastatur, oder Mausbewegungen.&lt;br /&gt;
* Einsatzbereich: Hochsichere Verschlüsselungen (Kryptographie) und Banken-IT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fazit&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Ein Computer kann durch reines Nachdenken (Software) niemals echten Zufall erzeugen. Er benötigt dafür immer ein Stück unberechenbare Natur (Hardware). Möchtest du wissen, wie du in einer Programmiersprache wie Python oder JavaScript den Unterschied zwischen sicherem und unsicherem Zufall nutzt?&lt;br /&gt;
&lt;br /&gt;
=Regression=&lt;br /&gt;
In der Künstlichen Intelligenz (KI) und im &#039;&#039;&#039;Maschinellen Lernen&#039;&#039;&#039; ist Regression ein Verfahren, um eine kontinuierliche Zahl vorherzusagen. Das Ziel ist es, den mathematischen Zusammenhang zwischen Eingabedaten (z. B. Größe eines Hauses) und einem konkreten numerischen Ausgabewert (z. B. dem Preis) zu finden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;der-unterschied-regression-vs.-klassifikation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Der Unterschied: Regression vs. Klassifikation ==&lt;br /&gt;
&lt;br /&gt;
Um Regression zu verstehen, hilft der Vergleich mit der Klassifikation:&lt;br /&gt;
&lt;br /&gt;
* Klassifikation (Kategorien): „Ist diese Einnahme Betrug oder legal?“ oder „Ist auf dem Bild eine Katze oder ein Hund?“ (Ja/Nein oder Klassen).&lt;br /&gt;
* Regression (Zahlen): „Wie viel Euro wird dieses Haus kosten?“ oder „Wie hoch wird die Temperatur morgen sein?“ (Konkrete Zahlenwerte).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;typische-beispiele-aus-der-praxis&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Typische Beispiele aus der Praxis ==&lt;br /&gt;
&lt;br /&gt;
* Finanzen: Vorhersage des zukünftigen Preises einer Aktie.&lt;br /&gt;
* Immobilien: Schätzung des Marktwerts eines Hauses basierend auf Quadratmetern, Lage und Baujahr.&lt;br /&gt;
* Wetter: Berechnung der exakten Regenmenge in Millimetern für die nächste Woche.&lt;br /&gt;
* Logistik: Schätzung der genauen Lieferzeit (ETA) für ein Paket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wie-funktioniert-das-einfach-erklärt&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wie funktioniert das einfach erklärt? ==&lt;br /&gt;
&lt;br /&gt;
Stell dir eine Grafik mit vielen Punkten vor. Jeder Punkt ist ein Haus: Die X-Achse zeigt die Quadratmeter, die Y-Achse den Preis. Die einfachste Form der Regression (die lineare Regression) legt nun eine optimale gerade Linie so durch diese Punkte, dass der Abstand zu allen Punkten insgesamt so klein wie möglich ist. Wenn du nun ein neues Haus mit einer unbekannten Größe hast, schaut die KI einfach, wo dieser Wert auf der gezeichneten Linie liegt, und spuckt den passenden Preis aus. Möchtest du ein einfaches Code-Beispiel für eine Regression in Python sehen oder wissen, was der Unterschied zwischen linearer und nicht-linearer Regression ist?&lt;br /&gt;
&lt;br /&gt;
=Over-/Underfitting=&lt;br /&gt;
In der Künstlichen Intelligenz beschreiben Overfitting (Überanpassung) und Underfitting (Unteranpassung) die beiden Hauptfehler, die ein KI-Modell beim Lernen machen kann. Das Ziel ist immer die Generalisierung: Die KI soll Muster so lernen, dass sie auch bei völlig neuen, unbekannten Daten richtige Vorhersagen trifft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;overfitting-überanpassung-das-auswendiglernen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Overfitting (Überanpassung) – Das Auswendiglernen ==&lt;br /&gt;
&lt;br /&gt;
Beim Overfitting lernt die KI die Trainingsdaten zu gut. Sie merkt sich nicht nur die echten Regeln, sondern auch das zufällige Rauschen und Details der Beispiele.&lt;br /&gt;
&lt;br /&gt;
* Das Problem: Das Modell verhält sich wie ein Schüler, der die Übungsaufgaben für die Klassenarbeit exakt auswendig lernt, aber das zugrunde liegende Prinzip nicht versteht.&lt;br /&gt;
* Der Effekt: Bei den bekannten Trainingsdaten ist die Genauigkeit perfekt (fast 100 %). Sobald die KI aber neue, unbekannte Daten sieht, versagt sie völlig.&lt;br /&gt;
* Ursache: Das KI-Modell ist zu komplex für die kleine Menge an Daten, oder es wurde zu lange trainiert.&lt;br /&gt;
&lt;br /&gt;
* Modell lernt die Analyse der Trainingsdaten auswendig.&lt;br /&gt;
* Einmodellierung von Rauschfaktoren&lt;br /&gt;
* Neue Daten ohne Rauschen passen nicht ins Modell&lt;br /&gt;
* Mangelnde Generalisierbarkeit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;underfitting-unteranpassung-das-übergeneralisieren&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. Underfitting (Unteranpassung) – Das Übergeneralisieren ==&lt;br /&gt;
&lt;br /&gt;
Beim Underfitting ist das Modell zu einfach gebaut. Es schafft es nicht einmal, die Struktur der Trainingsdaten richtig zu erfassen.&lt;br /&gt;
&lt;br /&gt;
* Das Problem: Der Schüler ist zu faul oder das Thema ist zu schwer. Er versteht weder die Übungsaufgaben noch die echten Prinzipien.&lt;br /&gt;
* Der Effekt: Die Genauigkeit ist sowohl bei den Trainingsdaten als auch bei neuen Daten sehr schlecht.&lt;br /&gt;
* Ursache: Das Modell ist zu simpel (z. B. eine gerade Linie für ein kurviges Problem) oder es wurde zu kurz trainiert.&lt;br /&gt;
* Das Modell konnte keinen Zusammenhang zwischen den Ein- und Ausgabedaten erkennen.&lt;br /&gt;
* Vorhersagen höchst ungenau&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;der-visuelle-vergleich-am-beispiel-einer-hauspreis-regression&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Der visuelle Vergleich (am Beispiel einer Hauspreis-Regression) ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Underfitting (Zu einfach)&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Sweet Spot (Perfekt)&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Overfitting (Zu komplex)&lt;br /&gt;
|-&lt;br /&gt;
| Eine starre, gerade Linie durch eine wellige Punktewolke.&lt;br /&gt;
| Eine sanfte Kurve, die den echten Trend der Punkte abbildet.&lt;br /&gt;
| Eine wilde Schlangenlinie, die exakt durch jeden einzelnen Punkt zackt.&lt;br /&gt;
|-&lt;br /&gt;
| KI versteht den Trend nicht.&lt;br /&gt;
| KI versteht das Prinzip.&lt;br /&gt;
| KI lernt Fehler und Zufälle mit.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wie-löst-man-das&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wie löst man das? ==&lt;br /&gt;
&lt;br /&gt;
* Gegen Overfitting: Mehr Trainingsdaten hinzufügen, das Modell vereinfachen (weniger Parameter) oder das Training früher abbrechen (Early Stopping).&lt;br /&gt;
* Gegen Underfitting: Ein komplexeres Modell wählen, dem Modell mehr Merkmale (Features) der Daten zur Verfügung stellen oder länger trainieren.&lt;br /&gt;
&lt;br /&gt;
=Regularisierung=&lt;br /&gt;
In der Praxis ist Regularisierung die wichtigste Bremse gegen Overfitting. Sie sorgt dafür, dass ein KI-Modell beim Lernen „bestraft“ wird, wenn es zu komplex, zu flexibel oder zu wild wird. Das Ziel ist es, die Kurve oder die mathematische Formel des Modells bewusst flacher und einfacher zu halten, damit sie sich nicht an jeden einzelnen Datenpunkt klammert. Hier sind die drei bekanntesten Methoden der Regularisierung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;l2-regularisierung-ridge-regression-die-gewichtsbremse&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. L2-Regularisierung (Ridge Regression) – Die Gewichtsbremse ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Jedes Mal, wenn die KI ein Merkmal (z. B. die Anzahl der Badezimmer) extrem stark gewichtet, verhängt die Regularisierung eine mathematische Strafe. Sie zwingt das Modell, alle Gewichte möglichst klein und nah an Null zu halten.&lt;br /&gt;
* Der Effekt: Keine einzelne Eigenschaft darf das gesamte Modell dominieren. Die Vorhersage-Kurve wird dadurch weicher und stabiler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;l1-regularisierung-lasso-die-radikalkur&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. L1-Regularisierung (Lasso) – Die Radikalkur ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Auch hier werden große Gewichte bestraft, aber L1 ist aggressiver als L2. Wenn ein Merkmal für die Vorhersage nicht wirklich wichtig ist, drückt L1 das Gewicht dieses Merkmals exakt auf Null.&lt;br /&gt;
* Der Effekt: Unwichtige Eigenschaften werden komplett aussortiert. Das Modell wird schlanker und nutzt am Ende nur noch die Variablen, die wirklich einen Unterschied machen (Feature Selection).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dropout-der-trick-für-neuronale-netze&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Dropout – Der Trick für Neuronale Netze ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Beim Training von tiefen Neuronalen Netzen schaltet man in jedem Durchgang zufällig (z. B. zu 50 %) einen Teil der künstlichen Neuronen ab.&lt;br /&gt;
* Der Effekt: Die Neuronen dürfen sich nicht mehr aufeinander verlassen. Sie können sich keine „Geheimabsprachen“ merken, um bestimmte Trainingsdaten auswendig zu lernen. Jedes Neuron muss nun eigenständig nützliche Muster erkennen. Das Netzwerk wird dadurch extrem robust.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;zusammenfassung&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
Regularisierung fügt der KI ein wenig Disziplin hinzu. Sie sagt dem Modell: „Finde eine Lösung, aber mach sie so einfach und elegant wie möglich!“ Möchtest du sehen, wie man eine L1- oder L2-Regularisierung mit wenigen Zeilen Code in einer Python-Bibliothek wie scikit-learn einbaut?&lt;br /&gt;
&lt;br /&gt;
==Beispiel scikit-learn==&lt;br /&gt;
Hier ist das Beispiel mit der Bibliothek scikit-learn. Wir vergleichen die Standard-Regression (ohne Bremse) mit L1 (Lasso) und L2 (Ridge).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sklearn.linear_model import LinearRegression, Ridge, Lassofrom sklearn.model_selection import train_test_split&lt;br /&gt;
&lt;br /&gt;
# 1. Daten aufteilen (X = Eigenschaften, y = Zielwert/Preis)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)&lt;br /&gt;
# 2. Ohne Regularisierung (Neigt bei vielen Merkmalen zu Overfitting)model_standard = LinearRegression()&lt;br /&gt;
model_standard.fit(X_train, y_train)&lt;br /&gt;
# 3. L2-Regularisierung (Ridge) -&amp;gt; Hält alle Gewichte kleinmodel_l2 = Ridge(alpha=1.0)  # alpha ist die Stärke der Bestrafung&lt;br /&gt;
model_l2.fit(X_train, y_train)&lt;br /&gt;
# 4. L1-Regularisierung (Lasso) -&amp;gt; Setzt unwichtige Gewichte auf exakt Nullmodel_l1 = Lasso(alpha=0.1)&lt;br /&gt;
model_l1.fit(X_train, y_train)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;was-bewirkt-der-parameter-alpha&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Was bewirkt der Parameter alpha? ==&lt;br /&gt;
&lt;br /&gt;
* alpha = 0: Keine Regularisierung (entspricht der Standard-Regression).&lt;br /&gt;
* alpha sehr hoch: Die Strafe ist extrem streng. Das Modell wird zu stark vereinfacht (Gefahr von Underfitting).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;welches-modell-wählt-man-wann&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Welches Modell wählt man wann? ==&lt;br /&gt;
&lt;br /&gt;
* Ridge (L2): Wenn du glaubst, dass fast alle deine Merkmale ein bisschen wichtig für die Vorhersage sind.&lt;br /&gt;
* Lasso (L1): Wenn du sehr viele Merkmale hast, aber vermutest, dass nur ein paar wenige davon wirklich relevant sind (der Rest wird auf Null gesetzt).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Rauschen=&lt;br /&gt;
&lt;br /&gt;
Unter Rauschfaktoren (oft auch einfach als Rauschen oder Noise bezeichnet) versteht man in der Künstlichen Intelligenz unerwünschte, fehlerhafte oder irrelevante Daten, die ein KI-Modell ablenken und seine Genauigkeit verschlechtern. [1] In der KI gilt die Grundregel: „Garbage in, garbage out“ (Müll rein, Müll raus). Rauschfaktoren sind genau dieser „Müll“, der die echten Muster in den Daten überlagert. [1, 2] Man unterscheidet im Wesentlichen vier Arten von Rauschfaktoren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;datenrauschen-data-noise&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Datenrauschen (Data Noise) ==&lt;br /&gt;
&lt;br /&gt;
Das sind Fehler, die direkt in den Datensätzen stecken, mit denen die KI trainiert wird: [1]&lt;br /&gt;
&lt;br /&gt;
* Messfehler: Defekte Sensoren (z. B. bei autonomen Autos), die falsche Werte liefern.&lt;br /&gt;
* Menschliche Fehler: Falsch beschriftete Daten (z. B. wenn beim Training ein Bild von einer Katze fälschlicherweise als „Hund“ gelabelt wurde).&lt;br /&gt;
* Ausreißer (Outliers): Extrem ungewöhnliche Einzelereignisse in den Daten, die den Gesamttrend verfälschen. [1, 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;signalrauschen-signal-noise&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Signalrauschen (Signal Noise) ==&lt;br /&gt;
&lt;br /&gt;
Hierbei handelt es sich um physikalische Störungen bei der Live-Anwendung der KI: [3]&lt;br /&gt;
&lt;br /&gt;
* Audio-KI: Hintergrundgeräusche (z. B. Baustellenlärm oder Stimmengewirr im Krankenhaus), die es einem Sprachassistenten erschweren, Befehle korrekt zu verstehen. [4]&lt;br /&gt;
* Bild-KI: Bildrauschen bei Nachtaufnahmen (Körnigkeit durch schlechte Lichtverhältnisse), wodurch die KI Objekte oder Gesichter nicht mehr richtig erkennt. [5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;syntaktischesstrukturelles-rauschen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Syntaktisches/Strukturelles Rauschen ==&lt;br /&gt;
&lt;br /&gt;
Dies betrifft vor allem generative KIs (wie ChatGPT): [6]&lt;br /&gt;
&lt;br /&gt;
* Kontextloses Füllen: Wenn ein KI-Modell mit unstrukturierten Texten gefüttert wird, die viele Füllwörter oder irrelevanten Code enthalten, verliert es den Fokus auf den eigentlichen Inhalt. Die KI lernt dann das „Rauschen“ des Schreibstils statt der echten Fakten. [7]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;der-paradoxe-twist-warum-ki-manchmal-rauschen-braucht&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Der paradoxe Twist: Warum KI manchmal Rauschen braucht ==&lt;br /&gt;
&lt;br /&gt;
Obwohl Rauschfaktoren meistens eliminiert werden sollen (z. B. durch Datenbereinigung oder Filter), setzen Entwickler Rauschen in zwei Fällen gezielt als Werkzeug ein: [8, 9]&lt;br /&gt;
&lt;br /&gt;
# Gegen Overfitting (Regularisierung): Man fügt den Trainingsdaten absichtlich künstliches Rauschen hinzu. Die KI lernt dadurch, ungenaue Realdaten zu erwarten, und wird robuster gegen Fehler im echten Leben. [9, 10, 11]&lt;br /&gt;
# Bildgenerierung (Diffusionsmodelle): KIs wie Midjourney oder Stable Diffusion erzeugen Bilder, indem sie mit einem komplett verrauschten Pixel-Chaos starten und dieses Schritt für Schritt gezielt „entrauschen“, bis ein klares Bild entsteht. [12]&lt;br /&gt;
&lt;br /&gt;
Möchtest du wissen, wie man Datenrauschen vor dem KI-Training herausfiltert, oder interessiert dich, wie Bild-KIs Rauschen nutzen, um neue Kunstwerke zu erschaffen? [12]&lt;br /&gt;
&lt;br /&gt;
[1] [https://deepchecks.com/glossary/noise-in-machine-learning/ https://deepchecks.com] [2] [https://www.fau.de/2024/11/news/forschung/kuenstliche-intelligenz/zufaelliges-rauschen-verbessert-leistung-von-ki-systemen/ https://www.fau.de] [3] [https://www.youtube.com/watch?v=PQV5qtS1E1U&amp;amp;t=33 https://www.youtube.com] [4] [https://www.youtube.com/watch?v=uoBknPqpm2w&amp;amp;t=15 https://www.youtube.com] [5] [https://www.youtube.com/watch?v=J52RHqpbzDU https://www.youtube.com] [6] [https://digitalzentrum-berlin.de/ki-modelle-im-faktencheck-chatgpt-und-co-liefern-oft-falschaussagen https://digitalzentrum-berlin.de] [7] [https://mstone.ai/blog/reducing-noise-factors-when-evaluating-genai/ https://mstone.ai] [8] [https://www.dhiria.com/en/blog/noise-in-ai-from-disturbance-to-creative-tool https://www.dhiria.com] [9] [https://www.innovatiana.com/en/post/add-noise-in-ai https://www.innovatiana.com] [10] [https://www.sciencedirect.com/science/article/pii/S2772508126000037 https://www.sciencedirect.com] [11] [https://www.youtube.com/watch?v=tcY0MZQGqWE https://www.youtube.com] [12] [https://www.youtube.com/watch?v=p_FNE5Q-180&amp;amp;t=3 https://www.youtube.com]&lt;br /&gt;
&lt;br /&gt;
=Train-Test-Split=&lt;br /&gt;
&lt;br /&gt;
Der Train-Test-Split (Aufteilung in Trainings- und Testdaten) ist der wichtigste Kontrollschritt beim maschinellen Lernen. Er verhindert, dass man die Leistung einer KI falsch einschätzt, und deckt Overfitting sofort auf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;das-prinzip&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Das Prinzip ==&lt;br /&gt;
&lt;br /&gt;
Man nimmt seinen gesamten Datensatz und schneidet ihn in zwei Teile:&lt;br /&gt;
&lt;br /&gt;
# Trainingsdaten (ca. 70–80 %): Mit diesem Teil lernt die KI. Sie sucht nach Mustern und passt ihre internen Gewichte an.&lt;br /&gt;
# Testdaten (ca. 20–30 %): Dieser Teil wird weggeschlossen. Erst wenn das Training komplett vorbei ist, muss die KI für diese Daten Vorhersagen treffen. Da sie diese Daten noch nie gesehen hat, simuliert dies den Einsatz im echten Leben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;warum-ist-das-zwingend-notwendig&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Warum ist das zwingend notwendig? ==&lt;br /&gt;
&lt;br /&gt;
Wenn man eine KI auf denselben Daten testet, auf denen sie gelernt hat, betrügt man sich selbst. Ein Modell, das einfach nur alle Daten auswendig gelernt hat (Overfitting), würde eine Genauigkeit von 100 % anzeigen. Erst beim Testen mit den isolierten Testdaten zeigt sich, ob die KI die Prinzipien wirklich verstanden hat. ## Das goldene Gesetz: Data Leakage verhindern Es darf niemals Information aus dem Testset in das Trainingsset fließen (Data Leakage).&lt;br /&gt;
&lt;br /&gt;
* Beispiel: Wenn du Daten vor dem Split skalierst oder den Mittelwert bildest, kennt das Trainingsset bereits Eigenschaften des Testsets. Das verfälscht das Testergebnis komplett.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;code-beispiel-scikit-learn&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Code-Beispiel (scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Der Split wird in Python standardmäßig so durchgeführt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sklearn.model_selection import train_test_split &lt;br /&gt;
# test_size=0.2 bedeutet: 80% Training, 20% Test&lt;br /&gt;
# random_state fixiert den Zufall, damit der Split reproduzierbar bleibtX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trainingsdaten gut und Testdaten schlecht =&amp;gt; Overfitted&lt;br /&gt;
Trainingsdaten schlecht und Testdaten schlecht =&amp;gt; ?&lt;br /&gt;
Trainingsdaten gut und Testdaten gut =&amp;gt; gutes Modell&lt;br /&gt;
Trainingsdaten schlecht und Testdaten gut =&amp;gt; Fehler&lt;br /&gt;
&lt;br /&gt;
Hier ist die gewünschte Zusammenfassung im Markdown-Format:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Zustand im Training&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Zustand im Test&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Diagnose&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Maßnahme&lt;br /&gt;
|-&lt;br /&gt;
| Gut&lt;br /&gt;
| Schlecht&lt;br /&gt;
| Overfitting (Überanpassung)&lt;br /&gt;
| Modell vereinfachen, Daten erhöhen, Regularisierung nutzen.&lt;br /&gt;
|-&lt;br /&gt;
| Schlecht&lt;br /&gt;
| Schlecht&lt;br /&gt;
| Underfitting (Unteranpassung)&lt;br /&gt;
| Modell komplexer machen, mehr Features hinzufügen.&lt;br /&gt;
|-&lt;br /&gt;
| Gut&lt;br /&gt;
| Gut&lt;br /&gt;
| Optimales Modell (Sweet Spot)&lt;br /&gt;
| Keine Aktion nötig. Bereit für den Produktiveinsatz.&lt;br /&gt;
|-&lt;br /&gt;
| Schlecht&lt;br /&gt;
| Gut&lt;br /&gt;
| Fehler / Artefakt (Unnatürlich)&lt;br /&gt;
| Code auf Data Leakage prüfen; Verteilung der Datensätze prüfen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-vier-fälle-im-detail&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die vier Fälle im Detail ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;trainingsdaten-gut-und-testdaten-schlecht-overfitting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Trainingsdaten gut und Testdaten schlecht =&amp;amp;gt; Overfitting ==&lt;br /&gt;
&lt;br /&gt;
Das Modell hat die Trainingsdaten quasi auswendig gelernt, inklusive aller Fehler, Ausreißer und des Rauschens. Es verhält sich wie ein Schüler, der die Übungsaufgaben für eine Klausur exakt auswendig lernt, aber das mathematische Prinzip dahinter nicht begreift. Sobald neue, unbekannte Daten (Testdaten) eingespeist werden, bricht die Leistung ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;trainingsdaten-schlecht-und-testdaten-schlecht-underfitting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Trainingsdaten schlecht und Testdaten schlecht =&amp;amp;gt; Underfitting ==&lt;br /&gt;
&lt;br /&gt;
Das Modell ist zu simpel gebaut oder wurde nicht lange genug trainiert, um überhaupt ein Muster in den Daten zu erkennen. Wenn man versucht, eine komplexe, geschwungene Datenwolke mit einer starren, geraden Linie vorherzusagen, trifft das Modell weder die bekannten noch die unbekannten Daten gut. Es hat den zugrunde liegenden Trend einfach nicht verstanden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;trainingsdaten-gut-und-testdaten-gut-optimales-modell&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Trainingsdaten gut und Testdaten gut =&amp;amp;gt; Optimales Modell ==&lt;br /&gt;
&lt;br /&gt;
Das ist das perfekte Ziel-Szenario. Das Modell hat die echten, allgemeingültigen Zusammenhänge aus den Daten extrahiert, ohne sich an Details zu überanpassen. Es liefert sowohl auf bekannten als auch auf völlig neuen Daten stabile und präzise Vorhersagen. Das Modell hat erfolgreich generalisiert und ist bereit für die Praxis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;trainingsdaten-schlecht-und-testdaten-gut-systemfehler&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Trainingsdaten schlecht und Testdaten gut =&amp;amp;gt; Systemfehler ==&lt;br /&gt;
&lt;br /&gt;
Dieses Verhalten ist mathematisch unnatürlich. Eine KI kann auf unbekannten Daten logischerweise nicht besser performen als auf den Daten, mit denen sie trainiert wurde. Tritt dieser Fall auf, liegt fast immer ein technisches Problem vor – wie Data Leakage (Daten aus dem Testset sind unbemerkt ins Training gesickert), ein starkes Daten-Ungleichgewicht (das Testset enthält zufällig nur sehr leichte Beispiele) oder eine viel zu restriktive Regularisierung während des Trainings. Soll ich dir zeigen, wie du diese vier Zustände mit einer Grafik (Learning Curve) direkt beim Trainieren deiner KI sichtbar machen kannst?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weitere Begriffe: geschichteter Split / Stratified Split)&lt;br /&gt;
&lt;br /&gt;
=Kreuzvalidierung (K-Fold/Cross-Validation)=&lt;br /&gt;
&lt;br /&gt;
Die Kreuzvalidierung (engl. Cross-Validation, meist als K-Fold Cross-Validation durchgeführt) ist die Weiterentwicklung des einfachen Train-Test-Splits. Während ein einfacher Split die Daten nur ein einziges Mal teilt, wiederholt die Kreuzvalidierung diesen Prozess mehrfach. Das Ziel ist es, jeden einzelnen Datenpunkt genau einmal zum Testen zu verwenden. Damit schließt man aus, dass ein Modell nur durch Zufall (Glück oder Pech beim Split) gut abgeschnitten hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;das-prinzip-wie-funktioniert-k-fold&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Das Prinzip: Wie funktioniert K-Fold? ==&lt;br /&gt;
&lt;br /&gt;
Das Wort „K“ steht für eine Zahl (sehr oft wählt man K = 5 oder K = 10). Diese Zahl bestimmt, in wie viele gleich große Teile (Folds) die Daten zerlegt werden. Bei einer 5-fachen Kreuzvalidierung passiert Folgendes:&lt;br /&gt;
&lt;br /&gt;
# Die Daten werden in 5 Blöcke (Block 1 bis 5) unterteilt.&lt;br /&gt;
# Es finden 5 aufeinanderfolgende Durchgänge statt:&lt;br /&gt;
#* Durchgang 1: Blöcke 1, 2, 3, 4 sind das Trainingsteam – Block 5 ist das Testteam.&lt;br /&gt;
#* Durchgang 2: Blöcke 1, 2, 3, 5 sind das Trainingsteam – Block 4 ist das Testteam.&lt;br /&gt;
#* Durchgang 3: Blöcke 1, 2, 4, 5 sind das Trainingsteam – Block 3 ist das Testteam.&lt;br /&gt;
#* Durchgang 4: Blöcke 1, 3, 4, 5 sind das Trainingsteam – Block 2 ist das Testteam.&lt;br /&gt;
#* Durchgang 5: Blöcke 2, 3, 4, 5 sind das Trainingsteam – Block 1 ist das Testteam.&lt;br /&gt;
#Am Ende berechnet man den Mittelwert aller 5 Testergebnisse.&lt;br /&gt;
&lt;br /&gt;
===Warum macht man das? (Die Vorteile)===&lt;br /&gt;
Maximale Datennutzung: Besonders bei kleinen Datensätzen wertvoll, da jedes Datenbeispiel mal zum Trainieren und mal zum Testen genutzt wird. &lt;br /&gt;
* Verlässliche Metriken: Wenn das Modell in allen 5 Durchgängen eine Genauigkeit von ca. 85 % erzielt, ist es stabil. Schwankt es zwischen 60 % und 95 %, ist das Modell instabil und unzuverlässig. &lt;br /&gt;
* Perfekt für Hyperparametertuning: Man nutzt die Kreuzvalidierung, um die besten Einstellungen (wie das optimale alpha bei der L1/L2-Regularisierung) zu finden, ohne die finalen, echten Testdaten anzurühren.&lt;br /&gt;
*Schaetzt Fehler besser ab als Train-Test-Split&lt;br /&gt;
&lt;br /&gt;
* Nachteil: dauert laenger&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;code-beispiel-in-python-scikit-learn&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code-Beispiel in Python (scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
In der Praxis musst du diese Schleifen nicht selbst schreiben. scikit-learn übernimmt das mit einer einzigen Zeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sklearn.model_selection import cross_val_scorefrom &lt;br /&gt;
from sklearn.linear_model import Ridge &lt;br /&gt;
&lt;br /&gt;
model = Ridge(alpha=1.0) &lt;br /&gt;
&lt;br /&gt;
# cv=5 bedeutet 5-fache Kreuzvalidierung&lt;br /&gt;
# Es gibt uns direkt 5 Genauigkeits-Scores zurück&lt;br /&gt;
scores = cross_val_score(model, X, y, cv=5)&lt;br /&gt;
&lt;br /&gt;
print(“Scores der 5 Durchgänge:”, scores) &lt;br /&gt;
print(“Mittlere Genauigkeit:”, scores.mean())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Begriffe: Stratified K-Fold (geschichtete Kreuzvalidierung) Zwingend bei ungleich verteilten Klassen (z.B. seltenen Krankheiten).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Clustering=&lt;br /&gt;
Clustering ist ein zentrales Verfahren des Unüberwachten Lernens (Unsupervised Learning) in der Künstlichen Intelligenz. Im Gegensatz zur Regression oder Klassifikation gibt es hier keine vorgegebenen Labels oder Zielwerte (wie z. B. Preise oder Kategorien). Die KI bekommt lediglich einen Haufen Daten und muss selbstständig Gruppen (Cluster) finden. Das Ziel ist es, Datenpunkte so aufzuteilen, dass Elemente innerhalb einer Gruppe sich maximal ähnlich sind, während die Gruppen untereinander sich maximal unterscheiden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-3-bekanntesten-clustering-algorithmen-1.-k-means-der-klassiker&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Die 3 bekanntesten Clustering-Algorithmen==&lt;br /&gt;
1. k-Means (Der Klassiker)&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Du gibst der KI vor, wie viele Gruppen (k) es geben soll. Der Algorithmus platziert zufällig k Mittelpunkte (Zentren) und ordnet jeden Datenpunkt dem nächstgelegenen Zentrum zu. Danach werden die Zentren neu berechnet. Das wiederholt sich, bis die Gruppen stabil sind.&lt;br /&gt;
* Nachteil: Man muss die Anzahl der Gruppen vorab kennen. Zudem funktioniert es nur gut bei kreisförmigen/kugelförmigen Datenwolken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dbscan-der-dichte-spezialist&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. DBSCAN (Der Dichte-Spezialist) ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Dieser Algorithmus sucht nach Regionen, in denen Datenpunkte besonders dicht beieinanderliegen.&lt;br /&gt;
* Vorteil: Er erkennt Gruppen mit völlig beliebigen, komplexen Formen (z. B. eine Gruppe, die sich halbmondförmig um eine andere legt). Zudem erkennt er Ausreißer (Rauschen) automatisch und sortiert sie aus. Du musst die Anzahl der Cluster nicht im Voraus wissen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hierarchisches-clustering-der-stammbaum&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Hierarchisches Clustering (Der Stammbaum) ==&lt;br /&gt;
&lt;br /&gt;
* Wie es funktioniert: Entweder startet jeder Punkt als eigenes Cluster und die KI verschmilzt die ähnlichsten Punkte Schritt für Schritt (Agglomerativ), oder alle starten in einer Gruppe und werden immer feiner aufgeteilt (Divisiv).&lt;br /&gt;
* Ergebnis: Es entsteht ein Baumdiagramm (Dendrogramm), an dem man visuell ablesen kann, welche Daten wie stark miteinander verwandt sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;typische-praxisbeispiele&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Typische Praxisbeispiele ==&lt;br /&gt;
&lt;br /&gt;
* Kundensegmentierung: Eine Marketing-KI analysiert Kaufverhalten und teilt Kunden in Gruppen ein (z. B. „Schnäppchenjäger“, „Premium-Käufer“, „Gelegenheitskäufer“).&lt;br /&gt;
* Bildsegmentierung: Pixel mit ähnlichen Farben und Helligkeiten werden gruppiert, um Objekte auf einem Bild zu isolieren (wichtig für autonomes Fahren).&lt;br /&gt;
* Anomalieerkennung: Wenn Kreditkartentransaktionen geclustert werden und eine Transaktion völlig abseits aller Gruppen liegt, schlägt das System wegen Betrugsverdacht Alarm.&lt;br /&gt;
&lt;br /&gt;
Weitere Begriffe: k-Means  Wie die KI die optimale Anzahl an Clustern (z. B. mit der Ellbogen-Methode) selbst herausfindet?&lt;br /&gt;
&lt;br /&gt;
=Silhouette Methode=&lt;br /&gt;
Die Silhouette-Methode ist neben der Ellbogen-Methode das wichtigste Werkzeug, um die Qualität eines Clusterings zu bewerten und die optimale Anzahl an Gruppen (k) zu bestimmen. Während die Ellbogen-Methode nur misst, wie kompakt die Cluster sind, prüft die Silhouette-Methode zusätzlich, ob die Cluster sauber voneinander getrennt sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;der-silhouette-koeffizient-die-mathematische-idee&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Der Silhouette-Koeffizient (Die mathematische Idee) ==&lt;br /&gt;
&lt;br /&gt;
Für jeden einzelnen Datenpunkt berechnet die Methode einen Wert zwischen -1 und +1:&lt;br /&gt;
&lt;br /&gt;
* a (Kompaktheit): Der durchschnittliche Abstand des Punktes zu allen anderen Punkten im eigenen Cluster (sollte möglichst klein sein).&lt;br /&gt;
* b (Trennung): Der durchschnittliche Abstand des Punktes zu den Punkten im nächstgelegenen fremden Cluster (sollte möglichst groß sein).&lt;br /&gt;
&lt;br /&gt;
Daraus ergibt sich der Wert für einen Punkt: &amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{Silhouette} = \frac{b - a}{\max(a, b)}&amp;lt;/math&amp;gt; ## Wie interpretiert man das Ergebnis? Wenn man das Clustering für den gesamten Datensatz bewertet, bildet man den Mittelpunkt aller Einzelwerte:&lt;br /&gt;
&lt;br /&gt;
* Nahe +1: Perfektes Clustering. Die Punkte liegen dicht zusammen und sind weit von anderen Gruppen entfernt.&lt;br /&gt;
* Nahe 0: Die Cluster überlappen sich stark. Punkte liegen genau auf den Entscheidungsgrenzen.&lt;br /&gt;
* Nahe -1: Fehlplatzierung. Die Punkte wurden vermutlich dem falschen Cluster zugeordnet.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| ## Die optimale Clusteranzahl finden&lt;br /&gt;
|-&lt;br /&gt;
| Um die beste Anzahl an Clustern (k) zu finden, lässt man den Algorithmus (z. B. k-Means) für verschiedene Werte (z. B. k = 2, 3, 4, 5) laufen.&lt;br /&gt;
|-&lt;br /&gt;
| Die Regel lautet: Die Zahl k, die den höchsten durchschnittlichen Silhouette-Koeffizienten liefert, ist mathematisch gesehen die beste Wahl für deine Daten.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;code-beispiel-in-python-scikit-learn&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Code-Beispiel in Python (scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
from sklearn.cluster import KMeansfrom sklearn.metrics import silhouette_score # Wir testen verschiedene Cluster-Anzahlen von 2 bis 5for k in: kmeans = KMeans(n_clusters=k, random_state=42).fit(X) labels = kmeans.labels_&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Berechne den durchschnittlichen Score für dieses k&lt;br /&gt;
score = silhouette_score(X, labels)&lt;br /&gt;
print(f&amp;amp;quot;Für k={k} ist der Silhouette-Score: {score:.3f}&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Weitere Begriffe: Silhouette-Plot um unsaubere Cluster optisch sofort zu entlarven.&lt;br /&gt;
&lt;br /&gt;
=Reinforcement Learning=&lt;br /&gt;
Reinforcement Learning (Bestärkendes Lernen) ist neben dem überwachten (Supervised) und unüberwachten (Unsupervised) Lernen die dritte große Säule des maschinellen Lernens. Das Prinzip basiert auf Psychologie und Evolution: Eine KI lernt hier nicht durch historische Daten, sondern durch Versuch und Irrtum (Trial and Error) sowie durch ein System aus Belohnung und Bestrafung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-4-kernkomponenten-des-reinforcement-learnings&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Die 4 Kernkomponenten des Reinforcement Learnings ==&lt;br /&gt;
&lt;br /&gt;
* Der Agent (Die KI): Das System, das lernen soll (z. B. der Autopilot eines Autos oder eine Spielfigur).&lt;br /&gt;
* Die Umgebung (Environment): Die Welt, in der sich der Agent bewegt (z. B. die Straße oder das Schachbrett).&lt;br /&gt;
* Die Aktion (Action): Die Züge oder Schritte, die der Agent machen kann (z. B. Bremsen, Beschleunigen, Nach-links-Lenken).&lt;br /&gt;
* Die Belohnung (Reward): Das Feedback der Umgebung. Ein positiver Wert für gutes Verhalten (z. B. Ziel erreicht) oder ein negativer Wert für Fehler (z. B. Unfall gebaut).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wie-der-lernprozess-abläuft&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wie der Lernprozess abläuft ==&lt;br /&gt;
&lt;br /&gt;
# Völliges Chaos zu Beginn: Der Agent weiß am Anfang absolut nichts über die Welt. Er wählt seine Aktionen maximal arbiträr (zufällig) aus.&lt;br /&gt;
# Das Feedback: Macht er etwas richtig, kriegt er Pluspunkte. Macht er etwas falsch, kriegt er Minuspunkte.&lt;br /&gt;
# Die Optimierung: Der Agent versucht über Millionen von Durchgängen, seine Strategie (Policy) mathematisch so anzupassen, dass er die langfristige Summe aller Belohnungen maximiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;berühmte-praxisbeispiele&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Berühmte Praxisbeispiele ==&lt;br /&gt;
&lt;br /&gt;
* Gaming-KIs: Googles AlphaGo schlug den Weltmeister im extrem komplexen Brettspiel Go. Andere KIs lernten durch Reinforcement Learning, Videospiele wie Super Mario, StarCraft oder Dota 2 auf Profi-Niveau zu spielen.&lt;br /&gt;
* Robotik &amp;amp;amp; Autonomes Fahren: Roboter lernen, wie sie laufen, Greifarme bewegen oder Hindernissen ausweichen, indem sie in virtuellen Simulationen Millionen Mal abstürzen, bis sie die perfekte Balance finden.&lt;br /&gt;
* ChatGPT (RLHF): Moderne Sprachmodelle nutzen Reinforcement Learning from Human Feedback. Menschliche Trainer bewerten die Antworten der KI. Die KI lernt dadurch, nützlicher, freundlicher und sicherer zu antworten.&lt;br /&gt;
* Multi-Agent Hide and Seek bezieht sich meist auf ein berühmtes KI-Experiment von OpenAI (2019)https://openai.com/index/emergent-tool-use/. Dabei wurden zwei Teams von KI-Agenten (Hiders und Seekers) mittels Reinforcement Learning in eine virtuelle 3D-Welt gesetzt, um Verstecken zu spielen.&lt;br /&gt;
&lt;br /&gt;
Weitere Begriffe: Exploration-Exploitation-Dilemma (der Konflikt zwischen Neuem ausprobieren und Bekanntes nutzen), Q-Learning&lt;br /&gt;
&lt;br /&gt;
==Historischer Kontext==&lt;br /&gt;
Das Verstärkende Lernen ist historisch gesehen völlig unabhängig von neuronalen Netzen entstanden. Es bildete ein ganz eigenes historisches Teilgebiet, das seine Wurzeln weit vor dem heutigen KI-Boom hatte. [1, 2] Die Entstehung des Reinforcement Learnings basiert historisch auf der Verschmelzung zweier völlig unterschiedlicher Denkschulen: [1]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-psychologische-wurzel-trial-and-error-verhaltensbiologie&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1. Die psychologische Wurzel: “Trial-and-Error” (Verhaltensbiologie) ===&lt;br /&gt;
&lt;br /&gt;
Lange bevor es Computer gab, untersuchten Psychologen, wie Tiere und Menschen lernen.&lt;br /&gt;
&lt;br /&gt;
* Edward Thorndikes „Gesetz des Effekts“ (1898): Er stellte fest, dass Reaktionen, die eine angenehme Konsequenz haben, häufiger wiederholt werden. [3]&lt;br /&gt;
* B.F. Skinner (Operante Konditionierung): Er trainierte Tauben und Ratten in Boxen rein über Belohnung und Bestrafung. [4]&lt;br /&gt;
* Die Brücke zur Informatik: Bereits 1948 schlug Alan Turing ein „Pleasure-Pain-System“ für Maschinen vor. 1952 baute Claude Shannon die mechanische Maus „Theseus“, die rein durch Versuch und Irrtum den Weg aus einem Labyrinth erlernte. [5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-mathematische-wurzel-optimal-control-regelungstechnik&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Die mathematische Wurzel: “Optimal Control” (Regelungstechnik) ===&lt;br /&gt;
&lt;br /&gt;
Seit den 1950er Jahren suchten Ingenieure und Mathematiker nach Wegen, dynamische Systeme (wie Raketen oder Fabrikanlagen) mathematisch optimal zu steuern. [1, 6]&lt;br /&gt;
&lt;br /&gt;
* Richard Bellman (1957): Er erfand die [https://de.wikipedia.org/wiki/Dynamische_Programmierung Dynamische Programmierung] und die mathematische Grundlage aller heutigen RL-Systeme: das Markov-Entscheidungsproblem (MDP). [4, 7]&lt;br /&gt;
* Das Problem damals: Bellmans Gleichungen funktionierten perfekt, wenn man die gesamte Welt exakt mathematisch beschreiben konnte (ein “Modell” der Welt hatte). Für die echte, komplexe Welt war das unbrauchbar. [8, 9]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;die-historische-verschmelzung-die-geburtsstunde-des-rl&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Die historische Verschmelzung (Die Geburtsstunde des RL) ===&lt;br /&gt;
&lt;br /&gt;
In den späten 1970er und 1980er Jahren brachten Forscher wie Richard Sutton und Andrew Barto diese beiden Welten zusammen. Sie fragten sich: Können wir die mathematische Optimierung von Bellman nutzen, während die KI die Spielregeln der Welt rein durch die psychologische Methode von Versuch und Irrtum (Trial-and-Error) erlernt? [3, 4, 6, 8] Daraus entstanden die historischen, klassischen RL-Algorithmen, die ohne jedes neuronale Netz funktionierten:&lt;br /&gt;
&lt;br /&gt;
* Tabellarisches Q-Learning (1989 von Chris Watkins): Die KI speichert ihr Wissen nicht in “Neuronen”, sondern in einer riesigen Excel-Tabelle (einer Q-Tabelle). Für jeden Zustand der Welt wird für jede Aktion ein mathematischer Wert eingetragen, wie gut diese Aktion war. [8, 10]&lt;br /&gt;
* Beispiel Tic-Tac-Toe: Ein System namens BOXES (1968 von Michie und Chambers) lernte das Spiel perfekt, indem es Streichholzschachteln für jeden Spielzustand nutzte – völlig ohne neuronale Struktur. [5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;warum-nutzt-man-heute-dafür-deep-learning&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Warum nutzt man heute dafür Deep Learning? ===&lt;br /&gt;
&lt;br /&gt;
Klassisches Reinforcement Learning (mit Tabellen) stößt an seine Grenzen, wenn es zu viele Zustände gibt. Beim Schach oder bei Videospielen gibt es mehr mögliche Zustände als Atome im Universum – die Tabelle würde unendlich groß werden. [10] Erst im Jahr 2013 kombinierte die Firma DeepMind das historische Reinforcement Learning mit tiefen neuronalen Netzen (Deep Reinforcement Learning). Das neuronale Netz fungiert seitdem lediglich als “Schätzer”, der die riesige Tabelle ersetzt. [11, 12, 13] &lt;br /&gt;
&lt;br /&gt;
Weiterhin interessant: Wie funktioniert das historische Q-Learning mit einer Tabelle im Detail? Wie kann ein KI-System ganz ohne neuronale Netze kluge Entscheidungen treffen?&lt;br /&gt;
&lt;br /&gt;
[1] [http://incompleteideas.net/book/ebook/node12.html https://incompleteideas.net] [2] [https://cacm.acm.org/federal-funding-of-academic-research/rediscovering-reinforcement-learning/ https://cacm.acm.org] [3] [https://www.youtube.com/watch?v=ul6B2oFPNDM&amp;amp;t=178 https://www.youtube.com] [4] [https://intuitionlabs.ai/articles/reinforcement-learning-explained https://intuitionlabs.ai] [5] [https://www.sciencedirect.com/topics/engineering/reinforcement-learning-technique https://www.sciencedirect.com] [6] [http://www.scholarpedia.org/article/Reinforcement_learning https://www.scholarpedia.org] [7] [https://aws.amazon.com/what-is/reinforcement-learning/ https://aws.amazon.com] [8] [https://medium.com/@aiforhuman/the-roots-of-reinforcement-learning-ad605c4d6d89 https://medium.com] [9] [http://www.umiacs.umd.edu/~hal/courses/2016F_RL/RL1.pdf https://www.umiacs.umd.edu] [10] [https://www.prodot.de/ki-glossar/reinforcement-learning https://www.prodot.de] [11] [https://www.mathworks.com/help/reinforcement-learning/ug/what-is-reinforcement-learning.html https://www.mathworks.com] [12] [https://iabac.org/blog/the-evolution-of-reinforcement-learning-in-machine-learning https://iabac.org] [13] [https://www.youtube.com/watch?v=rkrfWpmG3aM https://www.youtube.com]&lt;br /&gt;
&lt;br /&gt;
=CrossEntropyLoss=&lt;br /&gt;
`CrossEntropyLoss` ist eine sehr häufig verwendete **Verlustfunktion (Loss Function) für Klassifikationsprobleme** in PyTorch.&lt;br /&gt;
&lt;br /&gt;
Sie beantwortet während des Trainings im Wesentlichen die Frage:&lt;br /&gt;
&lt;br /&gt;
 „Wie stark weicht die Vorhersage des neuronalen Netzes von der richtigen Zielklasse ab?“&lt;br /&gt;
&lt;br /&gt;
Nehmen wir deinen Ziffernklassifikator. Die Taxonomie bzw. Klassenmenge besteht aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0, 1, 2, 3, 4, 5, 6, 7, 8, 9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für ein Bild ist die Zielklasse beispielsweise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
y = 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das neuronale Netz liefert aber nicht einfach `7`, sondern zunächst **10 Ausgabewerte**, sogenannte **Logits**:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Klasse     Logit&lt;br /&gt;
  0         0.2&lt;br /&gt;
  1        -0.5&lt;br /&gt;
  2         0.8&lt;br /&gt;
  3         0.1&lt;br /&gt;
  4        -0.3&lt;br /&gt;
  5         0.4&lt;br /&gt;
  6         0.2&lt;br /&gt;
  7         3.8   ←&lt;br /&gt;
  8         0.5&lt;br /&gt;
  9         1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je größer der Logit, desto stärker spricht das Modell für diese Klasse.&lt;br /&gt;
&lt;br /&gt;
==Was macht `CrossEntropyLoss` daraus?==&lt;br /&gt;
&lt;br /&gt;
Vereinfacht passieren zwei Dinge:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{Logits}&lt;br /&gt;
\xrightarrow{\text{Softmax}}&lt;br /&gt;
\text{Wahrscheinlichkeiten}&lt;br /&gt;
\xrightarrow{\text{Vergleich mit Zielklasse}}&lt;br /&gt;
\text{Loss}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 CrossEntropyLoss kombiniert diese Berechnungen intern. Deshalb sollte man vor CrossEntropyLoss normalerweise **kein eigenes `softmax()`** aufrufen.&lt;br /&gt;
&lt;br /&gt;
In PyTorch sieht das beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
&lt;br /&gt;
# Ausgabe des neuronalen Netzes:&lt;br /&gt;
# 4 Bilder und jeweils 10 Klassen&lt;br /&gt;
logits = torch.rand(4, 10)&lt;br /&gt;
&lt;br /&gt;
# Richtige Zielklassen der vier Bilder&lt;br /&gt;
y = torch.tensor([2, 7, 0, 9], dtype=torch.long)&lt;br /&gt;
&lt;br /&gt;
# Verlustfunktion erzeugen&lt;br /&gt;
loss_fn = nn.CrossEntropyLoss()&lt;br /&gt;
&lt;br /&gt;
# Verlust berechnen&lt;br /&gt;
loss = loss_fn(logits, y)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{logits.shape=}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{y.shape=}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;{loss=}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist entscheidend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logits.shape = (4, 10)&lt;br /&gt;
                │   │&lt;br /&gt;
                │   └── 10 mögliche Klassen&lt;br /&gt;
                └────── 4 Bilder&lt;br /&gt;
&lt;br /&gt;
y.shape = (4,)&lt;br /&gt;
           │&lt;br /&gt;
           └── eine richtige Zielklasse pro Bild&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das passt genau zu deinem bisherigen Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bild x[0] → Zielklasse 2&lt;br /&gt;
Bild x[1] → Zielklasse 7&lt;br /&gt;
Bild x[2] → Zielklasse 0&lt;br /&gt;
Bild x[3] → Zielklasse 9&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### Warum braucht man überhaupt einen Loss?&lt;br /&gt;
&lt;br /&gt;
Beim Training läuft vereinfacht diese Kette ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Trainingsbild&lt;br /&gt;
     ↓&lt;br /&gt;
Neuronales Netz&lt;br /&gt;
     ↓&lt;br /&gt;
Logits&lt;br /&gt;
     ↓&lt;br /&gt;
CrossEntropyLoss ← richtige Zielklasse&lt;br /&gt;
     ↓&lt;br /&gt;
Loss&lt;br /&gt;
     ↓&lt;br /&gt;
Backpropagation&lt;br /&gt;
     ↓&lt;br /&gt;
Gewichte des Netzes verändern&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein **kleiner Loss** bedeutet: Die Vorhersage passt gut zur Zielklasse.&lt;br /&gt;
&lt;br /&gt;
Ein **großer Loss** bedeutet: Die Vorhersage passt schlecht zur Zielklasse.&lt;br /&gt;
&lt;br /&gt;
Dabei berücksichtigt Cross Entropy nicht nur, ob die endgültige Klassifikation richtig oder falsch war, sondern auch, **wie sicher das Modell dabei war**. Eine selbstbewusste falsche Vorhersage wird stärker bestraft als eine unsichere falsche Vorhersage.&lt;br /&gt;
&lt;br /&gt;
Das ist auch der entscheidende Unterschied zur **Accuracy**:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{CrossEntropyLoss → zum Trainieren}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{Accuracy → zum Bewerten}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Accuracy ist nämlich nicht gut geeignet, um mittels Backpropagation die Gewichte eines neuronalen Netzes schrittweise zu verbessern.&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5481</id>
		<title>Mathematische Coprozessoren</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5481"/>
		<updated>2026-10-10T06:03:13Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* NVIDIA MicroArchitektur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Die Idee rechenintensive Operationen in einen dafuer spezialisierten eigenen Prozessor auszulagern ist nicht Neues.&lt;br /&gt;
&lt;br /&gt;
 Der Intel 80387 ist ein 1987 eingeführter mathematischer Coprozessor (Floating-Point Unit, FPU), der speziell zur Entlastung des Mikroprozessors Intel 80386 bei Gleitkomma- und Trigonometrieberechnungen entwickelt wurde.&lt;br /&gt;
&lt;br /&gt;
In diesem Zusammenhang fallen mir immer wieder FPGAs ein. &lt;br /&gt;
&lt;br /&gt;
Mit dem Wunsch die KI-spezifischen Operationen von den Grafikkarten, die ja nur als &amp;quot;Nebenprodukt&amp;quot; fuer allgemeine KI-Berechnungen herhalten muss, zu loesen, bin ich vermutlich nicht alleine.&lt;br /&gt;
&lt;br /&gt;
Dann schauen wir mal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=GPUs und ihre Cores=&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: left;&amp;quot;&lt;br /&gt;
|+ Vergleich der Kern-Bezeichnungen (Core Names) von NVIDIA, AMD und Intel&lt;br /&gt;
|- style=&amp;quot;background:#efefef; font-weight:bold;&amp;quot;&lt;br /&gt;
! Hersteller !! Kern-Typ !! Offizieller Name (Marketing) !! Interne / Technische Bezeichnung !! Hauptaufgabe / Fokus&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;NVIDIA&#039;&#039;&#039; || Standard-Rechenkern || CUDA Core || ALU / SP (Streaming Processor) || Universelle Gleitkomma- (FP32/FP64) und Ganzzahlberechnungen (INT32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Tensor Core || Tensor Cores (verschiedene Generationen) || Spezialisierte Matrix-Multiplikationen für Deep Learning und KI (FP8, FP16, BF16, INT8, INT4).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || RT Core || BVH Traversal / Triangle Intersection Unit || Beschleunigung von Lichtstrahlen- und Dreiecksberechnungen (Raytracing in Spielen/Rendering).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;AMD&#039;&#039;&#039; || Standard-Rechenkern || Stream Processor (Stream-Prozessor) || Compute Unit (CU) / Dual Compute Unit / Work Group Processor (WGP) || Universelle mathematische Berechnungen (Grafik-Pipeline, FP32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || AI Accelerator (ab RDNA 3) || Matrix Core (CDNA-Architektur für Rechenzentren) || Matrix-Operationen und Wellenform-Befehle (Wave Matrix Multiply-Accumulate / WMMA).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Accelerator || Ray Accelerator (RA) || Dedizierte Hardware für Box-Sorting und Ray-Triangle-Schnittmengenberechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Intel&#039;&#039;&#039; || Standard-Rechenkern || Execution Unit (EU) / Xe-core || Vector Engine (XVE) || Standardmäßige Vektor- und Thread-Verarbeitung für Grafik und allgemeine GPU-Berechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Intel XMX (Xe Matrix Extensions) || Matrix Engine (XME) || Hochleistungs-Matrix-Rechenwerke für KI-Skalierung (XeSS) und Deep Learning (DP4a, Systolic Arrays).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Tracing Unit || Ray Tracing Unit (RTU) || Hardwarebeschleunigung für Bounding Box- und Primitiven-Tests (ab Xe-HPG / Arc-Grafikkarten).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FPGA=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:fpga speziell tensor multiplikationen.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=NVIDIA MicroArchitektur=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:uebersicht nvidia microarchitecture.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=Zahlenrepresentation und Genauigkeitsanspruch=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:KI_f32fp64_int8.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5480</id>
		<title>Mathematische Coprozessoren</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5480"/>
		<updated>2026-10-10T06:02:58Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Die Idee rechenintensive Operationen in einen dafuer spezialisierten eigenen Prozessor auszulagern ist nicht Neues.&lt;br /&gt;
&lt;br /&gt;
 Der Intel 80387 ist ein 1987 eingeführter mathematischer Coprozessor (Floating-Point Unit, FPU), der speziell zur Entlastung des Mikroprozessors Intel 80386 bei Gleitkomma- und Trigonometrieberechnungen entwickelt wurde.&lt;br /&gt;
&lt;br /&gt;
In diesem Zusammenhang fallen mir immer wieder FPGAs ein. &lt;br /&gt;
&lt;br /&gt;
Mit dem Wunsch die KI-spezifischen Operationen von den Grafikkarten, die ja nur als &amp;quot;Nebenprodukt&amp;quot; fuer allgemeine KI-Berechnungen herhalten muss, zu loesen, bin ich vermutlich nicht alleine.&lt;br /&gt;
&lt;br /&gt;
Dann schauen wir mal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=GPUs und ihre Cores=&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: left;&amp;quot;&lt;br /&gt;
|+ Vergleich der Kern-Bezeichnungen (Core Names) von NVIDIA, AMD und Intel&lt;br /&gt;
|- style=&amp;quot;background:#efefef; font-weight:bold;&amp;quot;&lt;br /&gt;
! Hersteller !! Kern-Typ !! Offizieller Name (Marketing) !! Interne / Technische Bezeichnung !! Hauptaufgabe / Fokus&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;NVIDIA&#039;&#039;&#039; || Standard-Rechenkern || CUDA Core || ALU / SP (Streaming Processor) || Universelle Gleitkomma- (FP32/FP64) und Ganzzahlberechnungen (INT32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Tensor Core || Tensor Cores (verschiedene Generationen) || Spezialisierte Matrix-Multiplikationen für Deep Learning und KI (FP8, FP16, BF16, INT8, INT4).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || RT Core || BVH Traversal / Triangle Intersection Unit || Beschleunigung von Lichtstrahlen- und Dreiecksberechnungen (Raytracing in Spielen/Rendering).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;AMD&#039;&#039;&#039; || Standard-Rechenkern || Stream Processor (Stream-Prozessor) || Compute Unit (CU) / Dual Compute Unit / Work Group Processor (WGP) || Universelle mathematische Berechnungen (Grafik-Pipeline, FP32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || AI Accelerator (ab RDNA 3) || Matrix Core (CDNA-Architektur für Rechenzentren) || Matrix-Operationen und Wellenform-Befehle (Wave Matrix Multiply-Accumulate / WMMA).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Accelerator || Ray Accelerator (RA) || Dedizierte Hardware für Box-Sorting und Ray-Triangle-Schnittmengenberechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Intel&#039;&#039;&#039; || Standard-Rechenkern || Execution Unit (EU) / Xe-core || Vector Engine (XVE) || Standardmäßige Vektor- und Thread-Verarbeitung für Grafik und allgemeine GPU-Berechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Intel XMX (Xe Matrix Extensions) || Matrix Engine (XME) || Hochleistungs-Matrix-Rechenwerke für KI-Skalierung (XeSS) und Deep Learning (DP4a, Systolic Arrays).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Tracing Unit || Ray Tracing Unit (RTU) || Hardwarebeschleunigung für Bounding Box- und Primitiven-Tests (ab Xe-HPG / Arc-Grafikkarten).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FPGA=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:fpga speziell tensor multiplikationen.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=NVIDIA MicroArchitektur=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:uebersicht nvidia microarchitecture.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Zahlenrepresentation und Genauigkeitsanspruch=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:KI_f32fp64_int8.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5479</id>
		<title>Mathematische Coprozessoren</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5479"/>
		<updated>2026-10-10T06:02:44Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Die Idee rechenintensive Operationen in einen dafuer spezialisierten eigenen Prozessor auszulagern ist nicht Neues.&lt;br /&gt;
&lt;br /&gt;
 Der Intel 80387 ist ein 1987 eingeführter mathematischer Coprozessor (Floating-Point Unit, FPU), der speziell zur Entlastung des Mikroprozessors Intel 80386 bei Gleitkomma- und Trigonometrieberechnungen entwickelt wurde.&lt;br /&gt;
&lt;br /&gt;
In diesem Zusammenhang fallen mir immer wieder FPGAs ein. &lt;br /&gt;
&lt;br /&gt;
Mit dem Wunsch die KI-spezifischen Operationen von den Grafikkarten, die ja nur als &amp;quot;Nebenprodukt&amp;quot; fuer allgemeine KI-Berechnungen herhalten muss, zu loesen, bin ich vermutlich nicht alleine.&lt;br /&gt;
&lt;br /&gt;
Dann schauen wir mal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=GPUs und ihre Cores=&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: left;&amp;quot;&lt;br /&gt;
|+ Vergleich der Kern-Bezeichnungen (Core Names) von NVIDIA, AMD und Intel&lt;br /&gt;
|- style=&amp;quot;background:#efefef; font-weight:bold;&amp;quot;&lt;br /&gt;
! Hersteller !! Kern-Typ !! Offizieller Name (Marketing) !! Interne / Technische Bezeichnung !! Hauptaufgabe / Fokus&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;NVIDIA&#039;&#039;&#039; || Standard-Rechenkern || CUDA Core || ALU / SP (Streaming Processor) || Universelle Gleitkomma- (FP32/FP64) und Ganzzahlberechnungen (INT32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Tensor Core || Tensor Cores (verschiedene Generationen) || Spezialisierte Matrix-Multiplikationen für Deep Learning und KI (FP8, FP16, BF16, INT8, INT4).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || RT Core || BVH Traversal / Triangle Intersection Unit || Beschleunigung von Lichtstrahlen- und Dreiecksberechnungen (Raytracing in Spielen/Rendering).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;AMD&#039;&#039;&#039; || Standard-Rechenkern || Stream Processor (Stream-Prozessor) || Compute Unit (CU) / Dual Compute Unit / Work Group Processor (WGP) || Universelle mathematische Berechnungen (Grafik-Pipeline, FP32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || AI Accelerator (ab RDNA 3) || Matrix Core (CDNA-Architektur für Rechenzentren) || Matrix-Operationen und Wellenform-Befehle (Wave Matrix Multiply-Accumulate / WMMA).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Accelerator || Ray Accelerator (RA) || Dedizierte Hardware für Box-Sorting und Ray-Triangle-Schnittmengenberechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Intel&#039;&#039;&#039; || Standard-Rechenkern || Execution Unit (EU) / Xe-core || Vector Engine (XVE) || Standardmäßige Vektor- und Thread-Verarbeitung für Grafik und allgemeine GPU-Berechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Intel XMX (Xe Matrix Extensions) || Matrix Engine (XME) || Hochleistungs-Matrix-Rechenwerke für KI-Skalierung (XeSS) und Deep Learning (DP4a, Systolic Arrays).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Tracing Unit || Ray Tracing Unit (RTU) || Hardwarebeschleunigung für Bounding Box- und Primitiven-Tests (ab Xe-HPG / Arc-Grafikkarten).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FPGA=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:fpga speziell tensor multiplikationen.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=NVIDIA MicroArchitektur=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:uebersicht nvidia microarchitecture.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Zahlenrepresentation und Genauigkeitsanspruch=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:KI_f32fp64_int8.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5478</id>
		<title>Mathematische Coprozessoren</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5478"/>
		<updated>2026-10-10T06:01:59Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Zahlenrepresentation und Genauigkeitsanspruch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Die Idee rechenintensive Operationen in einen dafuer spezialisierten eigenen Prozessor auszulagern ist nicht Neues.&lt;br /&gt;
&lt;br /&gt;
 Der Intel 80387 ist ein 1987 eingeführter mathematischer Coprozessor (Floating-Point Unit, FPU), der speziell zur Entlastung des Mikroprozessors Intel 80386 bei Gleitkomma- und Trigonometrieberechnungen entwickelt wurde.&lt;br /&gt;
&lt;br /&gt;
In diesem Zusammenhang fallen mir immer wieder FPGAs ein. &lt;br /&gt;
&lt;br /&gt;
Mit dem Wunsch die KI-spezifischen Operationen von den Grafikkarten, die ja nur als &amp;quot;Nebenprodukt&amp;quot; fuer allgemeine KI-Berechnungen herhalten muss, zu loesen, bin ich vermutlich nicht alleine.&lt;br /&gt;
&lt;br /&gt;
Dann schauen wir mal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=GPUs und ihre Cores=&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: left;&amp;quot;&lt;br /&gt;
|+ Vergleich der Kern-Bezeichnungen (Core Names) von NVIDIA, AMD und Intel&lt;br /&gt;
|- style=&amp;quot;background:#efefef; font-weight:bold;&amp;quot;&lt;br /&gt;
! Hersteller !! Kern-Typ !! Offizieller Name (Marketing) !! Interne / Technische Bezeichnung !! Hauptaufgabe / Fokus&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;NVIDIA&#039;&#039;&#039; || Standard-Rechenkern || CUDA Core || ALU / SP (Streaming Processor) || Universelle Gleitkomma- (FP32/FP64) und Ganzzahlberechnungen (INT32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Tensor Core || Tensor Cores (verschiedene Generationen) || Spezialisierte Matrix-Multiplikationen für Deep Learning und KI (FP8, FP16, BF16, INT8, INT4).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || RT Core || BVH Traversal / Triangle Intersection Unit || Beschleunigung von Lichtstrahlen- und Dreiecksberechnungen (Raytracing in Spielen/Rendering).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;AMD&#039;&#039;&#039; || Standard-Rechenkern || Stream Processor (Stream-Prozessor) || Compute Unit (CU) / Dual Compute Unit / Work Group Processor (WGP) || Universelle mathematische Berechnungen (Grafik-Pipeline, FP32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || AI Accelerator (ab RDNA 3) || Matrix Core (CDNA-Architektur für Rechenzentren) || Matrix-Operationen und Wellenform-Befehle (Wave Matrix Multiply-Accumulate / WMMA).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Accelerator || Ray Accelerator (RA) || Dedizierte Hardware für Box-Sorting und Ray-Triangle-Schnittmengenberechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Intel&#039;&#039;&#039; || Standard-Rechenkern || Execution Unit (EU) / Xe-core || Vector Engine (XVE) || Standardmäßige Vektor- und Thread-Verarbeitung für Grafik und allgemeine GPU-Berechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Intel XMX (Xe Matrix Extensions) || Matrix Engine (XME) || Hochleistungs-Matrix-Rechenwerke für KI-Skalierung (XeSS) und Deep Learning (DP4a, Systolic Arrays).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Tracing Unit || Ray Tracing Unit (RTU) || Hardwarebeschleunigung für Bounding Box- und Primitiven-Tests (ab Xe-HPG / Arc-Grafikkarten).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FPGA=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:fpga speziell tensor multiplikationen.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=NVIDIA MicroArchitektur=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:uebersicht nvidia microarchitecture.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Zahlenrepresentation und Genauigkeitsanspruch=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:KI_f32fp64_int8.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5477</id>
		<title>Mathematische Coprozessoren</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5477"/>
		<updated>2026-10-10T06:01:48Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* NVIDIA MicroArchitektur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Die Idee rechenintensive Operationen in einen dafuer spezialisierten eigenen Prozessor auszulagern ist nicht Neues.&lt;br /&gt;
&lt;br /&gt;
 Der Intel 80387 ist ein 1987 eingeführter mathematischer Coprozessor (Floating-Point Unit, FPU), der speziell zur Entlastung des Mikroprozessors Intel 80386 bei Gleitkomma- und Trigonometrieberechnungen entwickelt wurde.&lt;br /&gt;
&lt;br /&gt;
In diesem Zusammenhang fallen mir immer wieder FPGAs ein. &lt;br /&gt;
&lt;br /&gt;
Mit dem Wunsch die KI-spezifischen Operationen von den Grafikkarten, die ja nur als &amp;quot;Nebenprodukt&amp;quot; fuer allgemeine KI-Berechnungen herhalten muss, zu loesen, bin ich vermutlich nicht alleine.&lt;br /&gt;
&lt;br /&gt;
Dann schauen wir mal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=GPUs und ihre Cores=&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: left;&amp;quot;&lt;br /&gt;
|+ Vergleich der Kern-Bezeichnungen (Core Names) von NVIDIA, AMD und Intel&lt;br /&gt;
|- style=&amp;quot;background:#efefef; font-weight:bold;&amp;quot;&lt;br /&gt;
! Hersteller !! Kern-Typ !! Offizieller Name (Marketing) !! Interne / Technische Bezeichnung !! Hauptaufgabe / Fokus&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;NVIDIA&#039;&#039;&#039; || Standard-Rechenkern || CUDA Core || ALU / SP (Streaming Processor) || Universelle Gleitkomma- (FP32/FP64) und Ganzzahlberechnungen (INT32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Tensor Core || Tensor Cores (verschiedene Generationen) || Spezialisierte Matrix-Multiplikationen für Deep Learning und KI (FP8, FP16, BF16, INT8, INT4).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || RT Core || BVH Traversal / Triangle Intersection Unit || Beschleunigung von Lichtstrahlen- und Dreiecksberechnungen (Raytracing in Spielen/Rendering).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;AMD&#039;&#039;&#039; || Standard-Rechenkern || Stream Processor (Stream-Prozessor) || Compute Unit (CU) / Dual Compute Unit / Work Group Processor (WGP) || Universelle mathematische Berechnungen (Grafik-Pipeline, FP32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || AI Accelerator (ab RDNA 3) || Matrix Core (CDNA-Architektur für Rechenzentren) || Matrix-Operationen und Wellenform-Befehle (Wave Matrix Multiply-Accumulate / WMMA).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Accelerator || Ray Accelerator (RA) || Dedizierte Hardware für Box-Sorting und Ray-Triangle-Schnittmengenberechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Intel&#039;&#039;&#039; || Standard-Rechenkern || Execution Unit (EU) / Xe-core || Vector Engine (XVE) || Standardmäßige Vektor- und Thread-Verarbeitung für Grafik und allgemeine GPU-Berechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Intel XMX (Xe Matrix Extensions) || Matrix Engine (XME) || Hochleistungs-Matrix-Rechenwerke für KI-Skalierung (XeSS) und Deep Learning (DP4a, Systolic Arrays).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Tracing Unit || Ray Tracing Unit (RTU) || Hardwarebeschleunigung für Bounding Box- und Primitiven-Tests (ab Xe-HPG / Arc-Grafikkarten).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FPGA=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:fpga speziell tensor multiplikationen.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=NVIDIA MicroArchitektur=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:uebersicht nvidia microarchitecture.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Zahlenrepresentation und Genauigkeitsanspruch=&lt;br /&gt;
&amp;lt;pdf width=1000&amp;gt;File:KI_f32fp64_int8.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5476</id>
		<title>Mathematische Coprozessoren</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5476"/>
		<updated>2026-10-10T06:01:39Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Die Idee rechenintensive Operationen in einen dafuer spezialisierten eigenen Prozessor auszulagern ist nicht Neues.&lt;br /&gt;
&lt;br /&gt;
 Der Intel 80387 ist ein 1987 eingeführter mathematischer Coprozessor (Floating-Point Unit, FPU), der speziell zur Entlastung des Mikroprozessors Intel 80386 bei Gleitkomma- und Trigonometrieberechnungen entwickelt wurde.&lt;br /&gt;
&lt;br /&gt;
In diesem Zusammenhang fallen mir immer wieder FPGAs ein. &lt;br /&gt;
&lt;br /&gt;
Mit dem Wunsch die KI-spezifischen Operationen von den Grafikkarten, die ja nur als &amp;quot;Nebenprodukt&amp;quot; fuer allgemeine KI-Berechnungen herhalten muss, zu loesen, bin ich vermutlich nicht alleine.&lt;br /&gt;
&lt;br /&gt;
Dann schauen wir mal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=GPUs und ihre Cores=&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: left;&amp;quot;&lt;br /&gt;
|+ Vergleich der Kern-Bezeichnungen (Core Names) von NVIDIA, AMD und Intel&lt;br /&gt;
|- style=&amp;quot;background:#efefef; font-weight:bold;&amp;quot;&lt;br /&gt;
! Hersteller !! Kern-Typ !! Offizieller Name (Marketing) !! Interne / Technische Bezeichnung !! Hauptaufgabe / Fokus&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;NVIDIA&#039;&#039;&#039; || Standard-Rechenkern || CUDA Core || ALU / SP (Streaming Processor) || Universelle Gleitkomma- (FP32/FP64) und Ganzzahlberechnungen (INT32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Tensor Core || Tensor Cores (verschiedene Generationen) || Spezialisierte Matrix-Multiplikationen für Deep Learning und KI (FP8, FP16, BF16, INT8, INT4).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || RT Core || BVH Traversal / Triangle Intersection Unit || Beschleunigung von Lichtstrahlen- und Dreiecksberechnungen (Raytracing in Spielen/Rendering).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;AMD&#039;&#039;&#039; || Standard-Rechenkern || Stream Processor (Stream-Prozessor) || Compute Unit (CU) / Dual Compute Unit / Work Group Processor (WGP) || Universelle mathematische Berechnungen (Grafik-Pipeline, FP32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || AI Accelerator (ab RDNA 3) || Matrix Core (CDNA-Architektur für Rechenzentren) || Matrix-Operationen und Wellenform-Befehle (Wave Matrix Multiply-Accumulate / WMMA).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Accelerator || Ray Accelerator (RA) || Dedizierte Hardware für Box-Sorting und Ray-Triangle-Schnittmengenberechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Intel&#039;&#039;&#039; || Standard-Rechenkern || Execution Unit (EU) / Xe-core || Vector Engine (XVE) || Standardmäßige Vektor- und Thread-Verarbeitung für Grafik und allgemeine GPU-Berechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Intel XMX (Xe Matrix Extensions) || Matrix Engine (XME) || Hochleistungs-Matrix-Rechenwerke für KI-Skalierung (XeSS) und Deep Learning (DP4a, Systolic Arrays).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Tracing Unit || Ray Tracing Unit (RTU) || Hardwarebeschleunigung für Bounding Box- und Primitiven-Tests (ab Xe-HPG / Arc-Grafikkarten).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FPGA=&lt;br /&gt;
&amp;lt;pdf width=1000 height=300&amp;gt;File:fpga speziell tensor multiplikationen.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=NVIDIA MicroArchitektur=&lt;br /&gt;
&amp;lt;pdf width=1000&amp;gt;File:uebersicht nvidia microarchitecture.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Zahlenrepresentation und Genauigkeitsanspruch=&lt;br /&gt;
&amp;lt;pdf width=1000&amp;gt;File:KI_f32fp64_int8.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5475</id>
		<title>Mathematische Coprozessoren</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5475"/>
		<updated>2026-10-10T06:01:21Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Die Idee rechenintensive Operationen in einen dafuer spezialisierten eigenen Prozessor auszulagern ist nicht Neues.&lt;br /&gt;
&lt;br /&gt;
 Der Intel 80387 ist ein 1987 eingeführter mathematischer Coprozessor (Floating-Point Unit, FPU), der speziell zur Entlastung des Mikroprozessors Intel 80386 bei Gleitkomma- und Trigonometrieberechnungen entwickelt wurde.&lt;br /&gt;
&lt;br /&gt;
In diesem Zusammenhang fallen mir immer wieder FPGAs ein. &lt;br /&gt;
&lt;br /&gt;
Mit dem Wunsch die KI-spezifischen Operationen von den Grafikkarten, die ja nur als &amp;quot;Nebenprodukt&amp;quot; fuer allgemeine KI-Berechnungen herhalten muss, zu loesen, bin ich vermutlich nicht alleine.&lt;br /&gt;
&lt;br /&gt;
Dann schauen wir mal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=GPUs und ihre Cores=&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: left;&amp;quot;&lt;br /&gt;
|+ Vergleich der Kern-Bezeichnungen (Core Names) von NVIDIA, AMD und Intel&lt;br /&gt;
|- style=&amp;quot;background:#efefef; font-weight:bold;&amp;quot;&lt;br /&gt;
! Hersteller !! Kern-Typ !! Offizieller Name (Marketing) !! Interne / Technische Bezeichnung !! Hauptaufgabe / Fokus&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;NVIDIA&#039;&#039;&#039; || Standard-Rechenkern || CUDA Core || ALU / SP (Streaming Processor) || Universelle Gleitkomma- (FP32/FP64) und Ganzzahlberechnungen (INT32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Tensor Core || Tensor Cores (verschiedene Generationen) || Spezialisierte Matrix-Multiplikationen für Deep Learning und KI (FP8, FP16, BF16, INT8, INT4).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || RT Core || BVH Traversal / Triangle Intersection Unit || Beschleunigung von Lichtstrahlen- und Dreiecksberechnungen (Raytracing in Spielen/Rendering).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;AMD&#039;&#039;&#039; || Standard-Rechenkern || Stream Processor (Stream-Prozessor) || Compute Unit (CU) / Dual Compute Unit / Work Group Processor (WGP) || Universelle mathematische Berechnungen (Grafik-Pipeline, FP32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || AI Accelerator (ab RDNA 3) || Matrix Core (CDNA-Architektur für Rechenzentren) || Matrix-Operationen und Wellenform-Befehle (Wave Matrix Multiply-Accumulate / WMMA).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Accelerator || Ray Accelerator (RA) || Dedizierte Hardware für Box-Sorting und Ray-Triangle-Schnittmengenberechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Intel&#039;&#039;&#039; || Standard-Rechenkern || Execution Unit (EU) / Xe-core || Vector Engine (XVE) || Standardmäßige Vektor- und Thread-Verarbeitung für Grafik und allgemeine GPU-Berechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Intel XMX (Xe Matrix Extensions) || Matrix Engine (XME) || Hochleistungs-Matrix-Rechenwerke für KI-Skalierung (XeSS) und Deep Learning (DP4a, Systolic Arrays).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Tracing Unit || Ray Tracing Unit (RTU) || Hardwarebeschleunigung für Bounding Box- und Primitiven-Tests (ab Xe-HPG / Arc-Grafikkarten).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FPGA=&lt;br /&gt;
&amp;lt;pdf width=1000 height=200&amp;gt;File:fpga speziell tensor multiplikationen.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=NVIDIA MicroArchitektur=&lt;br /&gt;
&amp;lt;pdf width=1000&amp;gt;File:uebersicht nvidia microarchitecture.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Zahlenrepresentation und Genauigkeitsanspruch=&lt;br /&gt;
&amp;lt;pdf width=1000&amp;gt;File:KI_f32fp64_int8.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5474</id>
		<title>Mathematische Coprozessoren</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5474"/>
		<updated>2026-10-10T06:00:42Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Die Idee rechenintensive Operationen in einen dafuer spezialisierten eigenen Prozessor auszulagern ist nicht Neues.&lt;br /&gt;
&lt;br /&gt;
 Der Intel 80387 ist ein 1987 eingeführter mathematischer Coprozessor (Floating-Point Unit, FPU), der speziell zur Entlastung des Mikroprozessors Intel 80386 bei Gleitkomma- und Trigonometrieberechnungen entwickelt wurde.&lt;br /&gt;
&lt;br /&gt;
In diesem Zusammenhang fallen mir immer wieder FPGAs ein. &lt;br /&gt;
&lt;br /&gt;
Mit dem Wunsch die KI-spezifischen Operationen von den Grafikkarten, die ja nur als &amp;quot;Nebenprodukt&amp;quot; fuer allgemeine KI-Berechnungen herhalten muss, zu loesen, bin ich vermutlich nicht alleine.&lt;br /&gt;
&lt;br /&gt;
Dann schauen wir mal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=GPUs und ihre Cores=&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: left;&amp;quot;&lt;br /&gt;
|+ Vergleich der Kern-Bezeichnungen (Core Names) von NVIDIA, AMD und Intel&lt;br /&gt;
|- style=&amp;quot;background:#efefef; font-weight:bold;&amp;quot;&lt;br /&gt;
! Hersteller !! Kern-Typ !! Offizieller Name (Marketing) !! Interne / Technische Bezeichnung !! Hauptaufgabe / Fokus&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;NVIDIA&#039;&#039;&#039; || Standard-Rechenkern || CUDA Core || ALU / SP (Streaming Processor) || Universelle Gleitkomma- (FP32/FP64) und Ganzzahlberechnungen (INT32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Tensor Core || Tensor Cores (verschiedene Generationen) || Spezialisierte Matrix-Multiplikationen für Deep Learning und KI (FP8, FP16, BF16, INT8, INT4).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || RT Core || BVH Traversal / Triangle Intersection Unit || Beschleunigung von Lichtstrahlen- und Dreiecksberechnungen (Raytracing in Spielen/Rendering).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;AMD&#039;&#039;&#039; || Standard-Rechenkern || Stream Processor (Stream-Prozessor) || Compute Unit (CU) / Dual Compute Unit / Work Group Processor (WGP) || Universelle mathematische Berechnungen (Grafik-Pipeline, FP32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || AI Accelerator (ab RDNA 3) || Matrix Core (CDNA-Architektur für Rechenzentren) || Matrix-Operationen und Wellenform-Befehle (Wave Matrix Multiply-Accumulate / WMMA).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Accelerator || Ray Accelerator (RA) || Dedizierte Hardware für Box-Sorting und Ray-Triangle-Schnittmengenberechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Intel&#039;&#039;&#039; || Standard-Rechenkern || Execution Unit (EU) / Xe-core || Vector Engine (XVE) || Standardmäßige Vektor- und Thread-Verarbeitung für Grafik und allgemeine GPU-Berechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Intel XMX (Xe Matrix Extensions) || Matrix Engine (XME) || Hochleistungs-Matrix-Rechenwerke für KI-Skalierung (XeSS) und Deep Learning (DP4a, Systolic Arrays).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Tracing Unit || Ray Tracing Unit (RTU) || Hardwarebeschleunigung für Bounding Box- und Primitiven-Tests (ab Xe-HPG / Arc-Grafikkarten).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FPGA=&lt;br /&gt;
&amp;lt;pdf width=1000&amp;gt;File:fpga speziell tensor multiplikationen.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=NVIDIA MicroArchitektur=&lt;br /&gt;
&amp;lt;pdf width=1000&amp;gt;File:uebersicht nvidia microarchitecture.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Zahlenrepresentation und Genauigkeitsanspruch=&lt;br /&gt;
&amp;lt;pdf width=1000&amp;gt;File:KI_f32fp64_int8.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:KI_f32fp64_int8.pdf&amp;diff=5473</id>
		<title>Datei:KI f32fp64 int8.pdf</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:KI_f32fp64_int8.pdf&amp;diff=5473"/>
		<updated>2026-10-10T06:00:30Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Uebersicht_nvidia_microarchitecture.pdf&amp;diff=5472</id>
		<title>Datei:Uebersicht nvidia microarchitecture.pdf</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Uebersicht_nvidia_microarchitecture.pdf&amp;diff=5472"/>
		<updated>2026-10-10T05:59:19Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Fpga_speziell_tensor_multiplikationen.pdf&amp;diff=5471</id>
		<title>Datei:Fpga speziell tensor multiplikationen.pdf</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Fpga_speziell_tensor_multiplikationen.pdf&amp;diff=5471"/>
		<updated>2026-10-10T05:57:57Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5470</id>
		<title>Mathematische Coprozessoren</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Mathematische_Coprozessoren&amp;diff=5470"/>
		<updated>2026-10-10T05:36:34Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Die Seite wurde neu angelegt: „=Allgemeines= Die Idee rechenintensive Operationen in einen dafuer spezialisierten eigenen Prozessor auszulagern ist nicht Neues.   Der Intel 80387 ist ein 1987 eingeführter mathematischer Coprozessor (Floating-Point Unit, FPU), der speziell zur Entlastung des Mikroprozessors Intel 80386 bei Gleitkomma- und Trigonometrieberechnungen entwickelt wurde.  In diesem Zusammenhang fallen mir immer wieder FPGAs ein.   Mit dem Wunsch die KI-spezifischen Operation…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Die Idee rechenintensive Operationen in einen dafuer spezialisierten eigenen Prozessor auszulagern ist nicht Neues.&lt;br /&gt;
&lt;br /&gt;
 Der Intel 80387 ist ein 1987 eingeführter mathematischer Coprozessor (Floating-Point Unit, FPU), der speziell zur Entlastung des Mikroprozessors Intel 80386 bei Gleitkomma- und Trigonometrieberechnungen entwickelt wurde.&lt;br /&gt;
&lt;br /&gt;
In diesem Zusammenhang fallen mir immer wieder FPGAs ein. &lt;br /&gt;
&lt;br /&gt;
Mit dem Wunsch die KI-spezifischen Operationen von den Grafikkarten, die ja nur als &amp;quot;Nebenprodukt&amp;quot; fuer allgemeine KI-Berechnungen herhalten muss, zu loesen, bin ich vermutlich nicht alleine.&lt;br /&gt;
&lt;br /&gt;
Dann schauen wir mal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=GPUs und ihre Cores=&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: left;&amp;quot;&lt;br /&gt;
|+ Vergleich der Kern-Bezeichnungen (Core Names) von NVIDIA, AMD und Intel&lt;br /&gt;
|- style=&amp;quot;background:#efefef; font-weight:bold;&amp;quot;&lt;br /&gt;
! Hersteller !! Kern-Typ !! Offizieller Name (Marketing) !! Interne / Technische Bezeichnung !! Hauptaufgabe / Fokus&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;NVIDIA&#039;&#039;&#039; || Standard-Rechenkern || CUDA Core || ALU / SP (Streaming Processor) || Universelle Gleitkomma- (FP32/FP64) und Ganzzahlberechnungen (INT32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Tensor Core || Tensor Cores (verschiedene Generationen) || Spezialisierte Matrix-Multiplikationen für Deep Learning und KI (FP8, FP16, BF16, INT8, INT4).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || RT Core || BVH Traversal / Triangle Intersection Unit || Beschleunigung von Lichtstrahlen- und Dreiecksberechnungen (Raytracing in Spielen/Rendering).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;AMD&#039;&#039;&#039; || Standard-Rechenkern || Stream Processor (Stream-Prozessor) || Compute Unit (CU) / Dual Compute Unit / Work Group Processor (WGP) || Universelle mathematische Berechnungen (Grafik-Pipeline, FP32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || AI Accelerator (ab RDNA 3) || Matrix Core (CDNA-Architektur für Rechenzentren) || Matrix-Operationen und Wellenform-Befehle (Wave Matrix Multiply-Accumulate / WMMA).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Accelerator || Ray Accelerator (RA) || Dedizierte Hardware für Box-Sorting und Ray-Triangle-Schnittmengenberechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Intel&#039;&#039;&#039; || Standard-Rechenkern || Execution Unit (EU) / Xe-core || Vector Engine (XVE) || Standardmäßige Vektor- und Thread-Verarbeitung für Grafik und allgemeine GPU-Berechnungen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| KI- / Matrix-Kern || Intel XMX (Xe Matrix Extensions) || Matrix Engine (XME) || Hochleistungs-Matrix-Rechenwerke für KI-Skalierung (XeSS) und Deep Learning (DP4a, Systolic Arrays).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Raytracing-Kern || Ray Tracing Unit || Ray Tracing Unit (RTU) || Hardwarebeschleunigung für Bounding Box- und Primitiven-Tests (ab Xe-HPG / Arc-Grafikkarten).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FPGA=&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Hauptseite&amp;diff=5469</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Hauptseite&amp;diff=5469"/>
		<updated>2026-10-09T17:27:51Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Tipp des Tages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:SchimpansenProgrammierer.png|mini|5-jaehriger Schimpanse(KI generierter Inhalt)|link=5-jaehriger Schimpanse]]&lt;br /&gt;
&lt;br /&gt;
==Allgemeines==&lt;br /&gt;
Dieses Wiki erhaelt permanent Erweiterungen. Derzeit beinhaltet dieses Wiki knapp 300 Artikel. Ich nutze dieses Wiki als persoenliche Informationsquelle zu fast allen Dingen mit denen ich mich so beschaeftige, um sie einfach oeffentlich und schnell zur Hand zu haben. Viele Seiten befinden sich noch im Intranet-Wiki und lassen sich aufgrund von Urheberrechtsbestimmungen nicht ohne Ueberarbeitung in dieses oeffentliche Wiki uebertragen. Wenn also Fragen auftauchen, dann schreibt das bitte in die Kommentare. Ich pruefe dann gezielt, ob ich hierzu einen Beitrag freischalten kann. &lt;br /&gt;
&lt;br /&gt;
Meine Site ist &#039;&#039;&#039;bannerfree&#039;&#039;&#039; und &#039;&#039;&#039;genderfree&#039;&#039;&#039;. Es gibt keine Affiliate-Links und maximal, wenn man eine Empfehlung so deuten will, mal Schleichwerbung. An einem Verzicht auf Umlaute und scharfes S (SZ) arbeite ich.&lt;br /&gt;
&lt;br /&gt;
===Hinweis zu Suchanfragen===&lt;br /&gt;
&lt;br /&gt;
Sinnvoll ist es bei der Wikisuche mindestens &#039;&#039;&#039;4&#039;&#039;&#039; Buchstaben mit voran- und nachgestelltem * (Wildcard) nutzen.&lt;br /&gt;
Zum Beispiel &amp;quot;*Ardu*&amp;quot;, &amp;quot;*FHEM*&amp;quot;, &amp;quot;*ENC2*&amp;quot;.&lt;br /&gt;
Woerter mit 3 Buchstaben findet man auch. Grosz- und Kleinschreibung wird nicht unterschieden. In den runden Klammern vor dem eigentlichen WikiBeitrag steht ein Gruppenname, so sind zusammengehoerende Beitraege besser erkennbar.&lt;br /&gt;
&lt;br /&gt;
Bei der Suche z. B. nach &#039;&#039;&#039;KI&#039;&#039;&#039; funktionieren auch 2 Buchstaben. Bei KI habe ich den Gruppennamen nicht konsequent in runde Klammern gesetzt.&lt;br /&gt;
&lt;br /&gt;
[[Spezial:Alle_Seiten|Alle Seiten im Ueberblick]]&lt;br /&gt;
&lt;br /&gt;
 Nach über 30 Jahre werde ich mich wohl von SuSE verabschieden. Gefuehlt war jedes Upgrade mit einem NVIDIA-Problem einhergegangen. Das war aber noch in den Griff zu kriegen. Seit Leap 16 habe ich einfach zu viele Baustellen. Es sind im Wesentlichen Plasma/KDE-Probleme, KDE-Wallet-Katastrophe, fehlende neue Versionen in den Repositories, keine verlaessliche Unterstuetzung von Cloud-Speichern in Dolphin, ... Nach ein wenig Recherche werde ich jetzt Fedora (44.1.7) eine Chance geben.&lt;br /&gt;
&lt;br /&gt;
==CLX LAB==&lt;br /&gt;
[[Datei:CLXLAB Icon.webp|mini|KI generierter Inhalt|100px]]&lt;br /&gt;
&lt;br /&gt;
Heute habe ich die Idee eines virtuellen Labors mal verankert. So richtig weisz ich noch nicht wie es genau funktionieren soll, aber der Anfang ist gemacht.&lt;br /&gt;
Einfach ne eMail an tibb(at)clx.de und schon kann&#039;s losgehen. Notwendiges Hardware-Equipment kann ich zur Verfügung stellen.&lt;br /&gt;
&lt;br /&gt;
Ich suche Mitarbeitende für folgende Projekte:&lt;br /&gt;
- Insect Detect&lt;br /&gt;
- Meshtastic&lt;br /&gt;
- Fox ESS API&lt;br /&gt;
- Victon Energy Cerbo GX Programming&lt;br /&gt;
uvm.&lt;br /&gt;
&lt;br /&gt;
Fundierte Hard- und Softwarekenntnisse sind Voraussetzung.&lt;br /&gt;
&lt;br /&gt;
20260101&lt;br /&gt;
[[Datei:Selbstlernautomation.png|100px|mini|KI generierter Inhalt]]&lt;br /&gt;
Playful robot mascot with tech emblem&lt;br /&gt;
Einen Gedanken, den ich ab 2026 mal intensiver verfolgen werde, ist der, ich nenne ihn mal, &amp;quot;&#039;&#039;&#039;Selbstlernautomation&#039;&#039;&#039;&amp;quot;. &lt;br /&gt;
Nach meiner aktuellen Vorstellung bedeutet dies, die Realisierung eines Systemes (Regelungssystem, Roboter, Rover, ), welches bei moeglichst optimaler Hardwareanpassung (Aktuatoren, Sensoren) an die Umgebung und Aufgabe, unter zuhilfenahme von Erfahrungsdaten (Datenarchive, Wetterprognosen, ...), einen KI-basierten Regelungsmechanismus nutzt, um die gestellte Aufgabe besser als ein darauf geschulter Mensch zu erfuellen. Weiter geht&#039;s auf der Einstiegsseite im CLXLAB zu [[(CLXLAB) Selbstlernautomation|Selbstlernautomation]].&lt;br /&gt;
&lt;br /&gt;
20260626&lt;br /&gt;
[[Datei:BASE73Logo.png|mini|100px|KI generierter Inhalt]]&lt;br /&gt;
Meine &#039;Virtual Lab&#039; -Idee  mit hybridem Makerspace hat jetzt eine eigene Heimat.&lt;br /&gt;
&lt;br /&gt;
http://base73.tech&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tipp des Tages==&lt;br /&gt;
2026-10-09&lt;br /&gt;
&lt;br /&gt;
Mir war bisher nicht aufgefallen, dass ich hier beim TinkerTibb ja auch meine Cheat-Sheet-Sammlung einstellen kann. [https://tippvomtibb.de/mediawiki/Cheat_Sheets] &lt;br /&gt;
&lt;br /&gt;
2026-07-09&lt;br /&gt;
&lt;br /&gt;
Ich habe gelegentlich mehrere Monitore an einem Rechner. Davon steht der ein oder andere aber so, dass er nicht vom Arbeitsplatz einsehbar ist. Da hilft folgender Befehl um den Bildschirminhalt in einem Fenster auf dem Hauptmonitor zu sehen.&lt;br /&gt;
&lt;br /&gt;
 ffplay -f x11grab -video_size 1280x1024 -i :0.0+3840,0 &lt;br /&gt;
&lt;br /&gt;
Siehe Tipp[[(LinuxDesktop)_Screen/Monitor_im_Fenster]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2026-07-27&lt;br /&gt;
&lt;br /&gt;
 deathbyclawd.com The SaaSpocalypse Survicval Scanner&lt;br /&gt;
&lt;br /&gt;
siehe auch &lt;br /&gt;
&lt;br /&gt;
 replacebyclawd.com&lt;br /&gt;
&lt;br /&gt;
==Fundstueck der Woche==&lt;br /&gt;
2026-09-14&lt;br /&gt;
&lt;br /&gt;
 Das Ding ist der Hammer! Live long and prosper! [https://www.youtube.com/watch?v=Sl_FQ-48mbw]&lt;br /&gt;
&lt;br /&gt;
2026-07-26&lt;br /&gt;
&lt;br /&gt;
 Excalidraw ist einfaches digitales Whiteboard. Ich benutze bisher Miro, mal schauen.&lt;br /&gt;
&lt;br /&gt;
2026-07-24&lt;br /&gt;
&lt;br /&gt;
 WhatsApp Kanal: Everlast AI&lt;br /&gt;
&lt;br /&gt;
2026-07-09&lt;br /&gt;
&lt;br /&gt;
 Ahoylist https://ahoylist.net/  [https://github.com/yarrlist/AhoyList] eng verwandt mit https://yarrlist.net/&lt;br /&gt;
&lt;br /&gt;
2026-07-06&lt;br /&gt;
&lt;br /&gt;
 Paketsender Send &amp;amp; receive TCP, UDP, SSL, DTLS. HTTP Requests. And Panel Generation. Ich werde die Software erst einmal beim Analysieren des MODBUS einsetzen.&lt;br /&gt;
&lt;br /&gt;
2026-07-06&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl nmap --script modbus-discover.nse --script-args=&#039;modbus-discover.aggressive=true&#039; -p 502 192.168.178.xxx&lt;br /&gt;
&lt;br /&gt;
kann man nach MODBUS-Clients scannen. Der genauen Funktion der nmap-Scripts werde ich eine eigene Seite widmen. &lt;br /&gt;
&lt;br /&gt;
2026-06-28&lt;br /&gt;
&lt;br /&gt;
https://orocos.org/ Das werde ich bei Gelegenheit mal genauer unter die Lupe nehmen.&lt;br /&gt;
&lt;br /&gt;
2026-06-20&lt;br /&gt;
&lt;br /&gt;
Ich habe mal ChatGPT eine Saarlandkarte anfertigen lassen. &#039;&#039;&#039;LOL&#039;&#039;&#039; z. B. St. Ingbert und Luxemburg&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis bestätigt meinen bisherigen Eindruck der LLMs.&lt;br /&gt;
&lt;br /&gt;
Erstmal Wow und dann Upps!&lt;br /&gt;
&lt;br /&gt;
(Ab sofort als Kurzform: [[Erst Wow dann Upps!]])&lt;br /&gt;
&lt;br /&gt;
[[Datei:ChatGPT Image Jun 28, 2026, 12 22 42 PM.png|150px|KI generierter Inhalt]]&lt;br /&gt;
[[Datei:ChatGPT Image Jun 28, 2026, 12 23 03 PM.png|150px|KI generierter Inhalt]]&lt;br /&gt;
&lt;br /&gt;
Auf die Fehler hingewiesen, wurde es daneben noch doller.&lt;br /&gt;
&lt;br /&gt;
Das deutet schon darauf hin, warum so viele KI-Projekte scheitern werden.&lt;br /&gt;
&lt;br /&gt;
2026-01-04&lt;br /&gt;
&lt;br /&gt;
Sehr informative Wetterseite. [https://www.ventusky.com/de Ventusky]&lt;br /&gt;
&lt;br /&gt;
2025-12-03&lt;br /&gt;
 Und schon wieder Apple. Bei der Firma hat man wohl zu viele Sammeltassen im Schrank. Im Einstellungstest wird angeblich folgendes gefragt: In einer Klasse sind 24 Mädchen und 36 Jungen. Zusammen sind es 100. Wie kann das sein? &lt;br /&gt;
 Da ist eine Personalchefin wohl übers Ziel hinausgeschossen. Mit mathematisch formal korrekten Angaben (Kennzeichnung der Wertangabe durch einen vertikalen Strich mit Hinweis auf das verwendete Zahlensystem) ist die Loesung simpel. Scheinbar knacken Schimpansen den Apple-Einstellungstest am besten.&lt;br /&gt;
&lt;br /&gt;
2025-12-01&lt;br /&gt;
 Und da sind sie wieder die Schimpansen. Diesmal bei Apple. Das kommt davon wenn man als Programmierer nur noch KlickiBuntis einstellt.&lt;br /&gt;
 &lt;br /&gt;
 Bug in iOS: Bei iOS 16–17 gab es mehrfach das Problem, dass nur wenige Einträge angezeigt wurden, die Liste aber viel länger war. &lt;br /&gt;
&lt;br /&gt;
2025-10-07&lt;br /&gt;
 SuS kommen nach der 4. Stunde zum Lehrer. &amp;quot;Wir koennen unmoeglich jetzt den GLN schreiben!&amp;quot; &amp;quot;Unser Mathelehrer hat uns die ersten 4 Stunden gequaelt.&amp;quot; &amp;quot;Wir sind jetzt zu keinem klaren Gedanken mehr faehig!&amp;quot;&lt;br /&gt;
 Lehrer: &amp;quot;Ach Gott, was hat er denn mit euch gemacht?&amp;quot; SuS: &amp;quot;Irgendetwas mit &#039;T&#039;!&amp;quot;&lt;br /&gt;
 Lehrer: &amp;quot;Tangente?&amp;quot; SuS: &amp;quot;Nee, ich glaub Integral oder so.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2025-09-06&lt;br /&gt;
&lt;br /&gt;
 Schenkelklopfer im Buch &amp;quot;Factfulness&amp;quot; [https://en.wikipedia.org/wiki/Factfulness] erstes Kapitel: &amp;quot;Wissenschaftler, Schimpansen und Sie&amp;quot;. Puh, nochmal Glueck gehabt.&lt;br /&gt;
&lt;br /&gt;
2025-08-17&lt;br /&gt;
&lt;br /&gt;
 Nach Jahren mit [https://app.diagrams.net/ draw.io], [https://lucidchart.com lucidcharts], [https://miro.com/ miro] u. v. a. habe ich heute zum ersten Mal hier im Wiki ein Flussdiagramm mit [https://www.mermaidchart.com/ mermaid] und [https://graphviz.org/ GraphViz] mit Hilfe der [https://www.mediawiki.org/wiki/Extension:Kroki Kroki-Extension] integriert. Ich bin begeistert.&lt;br /&gt;
&lt;br /&gt;
2025-06-20&lt;br /&gt;
&lt;br /&gt;
 1234 ist kein Passwort! Es ist eine PIN! lol &lt;br /&gt;
&lt;br /&gt;
2025-06-08&lt;br /&gt;
&lt;br /&gt;
 Free Online OCR [https://tools.pdf24.org/de/ocr-pdf] Zum Konvertieren von Foto/Grafik nach Dokument, ohne sensiblen Inhalt, sehr praktikabel.&lt;br /&gt;
&lt;br /&gt;
2025-05-25 &lt;br /&gt;
 &lt;br /&gt;
 Die genialste Erfindung der Chinesen war die GDPR (General Data Protection Regulation, DSGVO). Seit sie diese in die europaeischen Koepfe gepflanzt haben, ist ihr Technologievorsprung nicht mehr einzuholen.  &lt;br /&gt;
&lt;br /&gt;
2025-05-04&lt;br /&gt;
&lt;br /&gt;
 Online Tester fuer htaccess  [https://htaccess.madewithlove.com/]&lt;br /&gt;
 &lt;br /&gt;
2025-01-05&lt;br /&gt;
&lt;br /&gt;
 Langweilst Du dich auch so, wie mich. &lt;br /&gt;
&lt;br /&gt;
2025-01-03&lt;br /&gt;
&lt;br /&gt;
 So viel Schwachsinn hab ich in meinem Leben noch nicht gesehen und die meinen noch sie machens besonders gudd.&lt;br /&gt;
2024-09-06&lt;br /&gt;
&lt;br /&gt;
 The oldest computer was owned by Adam and Eve. It was an Apple. Only one wrong byte and everything was crashed!&lt;br /&gt;
&lt;br /&gt;
2024-07-13&lt;br /&gt;
&lt;br /&gt;
 Der drollige Troll: drollig oder drollig? &lt;br /&gt;
 *Drollig von Troll (nordisches Fabelwesen (ungehobelt, grob oder ungeschickt)) Hat eine leicht negative oder scherzhafte Konnotation.&lt;br /&gt;
 *Drollig von Drol(l) (altdeutsch Possenreißer, Spaszmacher, (Hof-)Narr, Clown) Hat eine positive, niedliche oder humorvolle Bedeutung. &lt;br /&gt;
&lt;br /&gt;
2024-06-28&lt;br /&gt;
&lt;br /&gt;
 Suno AI Explore [https://suno.com/explore] eignet sich durchaus als Radioersatz!.&lt;br /&gt;
&lt;br /&gt;
2024-01-01&lt;br /&gt;
&lt;br /&gt;
 Nach einer (sehr) langen Suche nach einem (dauerhaft) hoerbaren Sender aus dem Groszraum Los Angeles:&lt;br /&gt;
 Popstar!Radio Hollywood https://streaming.live365.com/a40380&lt;br /&gt;
&lt;br /&gt;
2023-04-24&lt;br /&gt;
&lt;br /&gt;
 Ausbildungsklasse: Mechatroniker&amp;lt;br&amp;gt;&lt;br /&gt;
 Thema: Kräftezerlegung&amp;lt;br&amp;gt;&lt;br /&gt;
 Schuelerreaktion: Geben Sie (Lehrer) sich keine Muehe, Physik habe ich noch nie verstanden!&lt;br /&gt;
&lt;br /&gt;
2023-04-21&lt;br /&gt;
&lt;br /&gt;
 Verzweifelter Lehrer im Lehrerzimmer nach der Korrektur eines Leistungsnachweises:&amp;lt;br&amp;gt;&lt;br /&gt;
 Jetzt habe ich mit denen wochenlang Kraefteparallelogramme geuebt und die geben mir in der Klassenarbeit lauder Drache ab. Arrrrrr!&lt;br /&gt;
&lt;br /&gt;
2023-01-28&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Meine Erfahrung zeigt, dass auf den groeszten Haufen immer noch einer drauf geschissen wird.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2022-11-16&lt;br /&gt;
&lt;br /&gt;
 „Wir leben alle unter dem gleichen Himmel, aber wir haben nicht alle den gleichen Horizont.“ Konrad Adenauer&lt;br /&gt;
&lt;br /&gt;
2022-10-02&lt;br /&gt;
&lt;br /&gt;
 Logik-Simulator: [https://academo.org/demos/logic-gate-simulator/]&lt;br /&gt;
&lt;br /&gt;
2022-08-04&lt;br /&gt;
&lt;br /&gt;
 Die Selbsthilfegruppe „UTF-8-Probleme“ trifft sich diesmal abweichend im grÃƒÂ¼nen Saal.&lt;br /&gt;
&lt;br /&gt;
2021-04-03&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Bildung im 3D-Raum ist um einiges besser als Unterricht per Zoom-Call&amp;quot;, sagt Ball. Cybersecurity-Experte Baggili stimmt dem zu: &amp;quot;Der wahre Mehrwert des Metaverses zeigt sich vor allem dann, wenn es dafür eingesetzt wird, unser Leben zu bereichern&amp;quot;, sagt er. &lt;br /&gt;
&lt;br /&gt;
[[Fundstücke Archiv]]&lt;br /&gt;
&lt;br /&gt;
==Weisheiten aus dem Schulalltag==&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Lehrer&#039;&#039;&#039;: Lest euch zur Eingewoehnung in das neue Thema im Buch einmal die Seiten 42 bis 45 durch.&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;Schüler&#039;&#039;&#039;: Wie 4 Seiten lesen! Das ist nicht Ihr Ernst.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Schüler&#039;&#039;&#039;: Herr ... ! Das was Sie mit uns machen ist Quaelerei! &lt;br /&gt;
 Frueher habe ich 3 Kopien bekommen, musste die für die Arbeit auswendig lernen, habe meine 1 bekommen und gut war. &lt;br /&gt;
 Heute muss ich mir den Stoff selbst erarbeiten und den Quatsch fuer die Arbeit auch noch verstehen!&lt;br /&gt;
&lt;br /&gt;
mehr -&amp;gt; [[Schenkelklopfer]]&lt;br /&gt;
&lt;br /&gt;
==Die Leiden des Supporters==&lt;br /&gt;
&lt;br /&gt;
[[Datei:LED Rotation Daumenhoch 7Seg 200.gif|mini]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kunde&#039;&#039;&#039;: Das Ding tut nicht was es soll!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Supporter&#039;&#039;&#039;: Haben Sie im Handbuch die Anleitung gelesen?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kunde&#039;&#039;&#039;: JA! Ziehen Sie den Nippel durch die Lasche und dann noch 10 Seiten Blabla.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Supporter&#039;&#039;&#039;: Ja genau! Ihre Lösung steht im Blabla!&lt;br /&gt;
&lt;br /&gt;
==Die drei großen Lügen der EDV-Administratoren==&lt;br /&gt;
&lt;br /&gt;
# Ich weiß woran es liegt!&lt;br /&gt;
# Ich komme sofort!&lt;br /&gt;
# Jetzt funktioniert es wieder!&lt;br /&gt;
&lt;br /&gt;
Variante 2:&lt;br /&gt;
&lt;br /&gt;
1) Ich glaub, ich weiß, woran das liegt.&lt;br /&gt;
&lt;br /&gt;
2) Ich komme gleich vorbei.&lt;br /&gt;
&lt;br /&gt;
3) Jetzt sollte es funktionieren.&lt;br /&gt;
&lt;br /&gt;
==3 Arten von Fehlern==&lt;br /&gt;
* &#039;&#039;&#039;Heisenbugs&#039;&#039;&#039;: Fehler, die verschwinden, wenn man versucht, sie zu debuggen.&lt;br /&gt;
* &#039;&#039;&#039;Schrödingbugs&#039;&#039;&#039;: Fehler, die nur auftauchen, wenn man versucht, etwas anderes zu debuggen.&lt;br /&gt;
* &#039;&#039;&#039;Mandelbugs&#039;&#039;&#039;: komplexe Fehler, die sich mehr und mehr ins Chaotische steigern, je genauer man hinsieht.&lt;br /&gt;
Quelle: Damian Conway: Perl - Best Practices&lt;br /&gt;
&lt;br /&gt;
==Elektrikerweisheit==&lt;br /&gt;
&lt;br /&gt;
Strom macht ganz schnell klein, schwarz und haesslich ;)&lt;br /&gt;
&lt;br /&gt;
==Ich werd bekloppt!==&lt;br /&gt;
&lt;br /&gt;
Seit Jahren kämpfe ich als (Mathematik-)Lehrer gegen eine zunehmende Seuche, in der Sekundarstufe 2 (Klassen 10+). Jahr für Jahr können immer weniger Schueler mit mathematischen Formeln und Termen umgehen. Seit ein paar Jahren kommt noch hinzu, dass durch die Handy- und Tablet-Seuche immer weniger Schueler etwas mit einem PC anfangen koennen und das logische Denken beim Entwickeln von Algorithmen viele voellig ueberfordert. Folglich sind die Schuelerzahlen im Bereich Technik und Informatik stark ruecklaeufig. &lt;br /&gt;
&lt;br /&gt;
Und jetzt finde ich durch Zufall diesen [https://scienceblogs.de/mathlog/2020/03/13/macht-mengenlehre-krank/ Artikel], weil einer meiner letzten Ideen war, mich notgedrungen in Mathematik von Zahlen und Buchstaben zu trennen und eine abstrakte Form des Umgangs mit (mathematischen) Zusammenhaengen zu suchen. Ich erinnerte mich an meine Grundschulzeit und die Mengenlehre. &lt;br /&gt;
&lt;br /&gt;
Ich profitiere heute noch davon, in der Grundschule diesen &amp;quot;Mathematikunterricht&amp;quot; gehabt zu haben. Und wenn man die Kommentare unter dem Artikel liest, sind nicht wenige meiner Meinung und erstaunlicherweise viele scheinbar auch im Bereich der Softwareentwicklung taetig.&lt;br /&gt;
Ich lehne mich mal weit aus dem Fenster: &amp;quot;In der Grundschule braucht man in Mathematik nur Mengenlehre und Kopfrechnen als gesunde Basis!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Weisheiten zum Nachdenken==&lt;br /&gt;
&lt;br /&gt;
 Mit deinem Gehirn waere mir langweilig.&lt;br /&gt;
&lt;br /&gt;
 Neid ist die höchste Form der Anerkennung.&lt;br /&gt;
&lt;br /&gt;
 Geruechte sind oft Luegen mit Widerhaken.&lt;br /&gt;
&lt;br /&gt;
 Nichtbeachtung ist die hoechste Form der Missachtung.&lt;br /&gt;
&lt;br /&gt;
==Spruch des Tages==&lt;br /&gt;
&lt;br /&gt;
 Die Worte hör&#039; ich wohl, allein mir fehlt der Sinn. [[Die Worte hör&#039; ich wohl, allein mir fehlt der Sinn.|-&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
 Sturges Gesetz: „90 % von allem ist Schrott“ (original: Ninety percent of everything is crud)&lt;br /&gt;
&lt;br /&gt;
 Viele Programmierer produzieren Kot statt Code.&lt;br /&gt;
&lt;br /&gt;
 In jeder Besprechung braucht man mindestens einen Stusskompensator, sonst werden schlechte Ideen am Ende noch beschlossen.&lt;br /&gt;
&lt;br /&gt;
 Beim Nutzen von KI basierten Systemen gelten aehnliche Prinzipien wie in der Finanzwelt: Die Gebildeten machen Quantenspruenge der Erkenntnis, so wie die Reichen immer reicher werden, während Kreti und Plethi über zu wenig Geld jammern und stolz wie Oskar sind, wenn sie mithilfe von Bildgeneratoren einem Frosch Schamhaare auf den Kopf gezaubert haben.&lt;br /&gt;
&lt;br /&gt;
 Der o. g. Spruch kommt mir vor wie eine angepasste Form von: Der Laie staunt, der Fachmann wundert sich.&lt;br /&gt;
&lt;br /&gt;
 Holt mal einer den Pfarrer fuer die Reste des Deputys&lt;br /&gt;
&lt;br /&gt;
 Trivialitaeten sind des Kleingeists Himmelreich&lt;br /&gt;
&lt;br /&gt;
==Kaffeespende==&lt;br /&gt;
&lt;br /&gt;
Wer bei mir mal vorbei kommen moechte, dem spendiere ich einen Kaffee.&lt;br /&gt;
&lt;br /&gt;
[https://citymapper.com/directions?startcoord=&amp;amp;endcoord=49.400455%2C7.17435&amp;amp;endname=%2F%2F%2Fbeginn.krippe.ortschaft BECOMEACOFFEE ;-)]&lt;br /&gt;
&lt;br /&gt;
Wer unbedingt Geld los werden will, sollte das lieber jemandem geben, der es dringender benoetigt.&lt;br /&gt;
&lt;br /&gt;
z.B. [https://www.paypal.com/DE/fundraiser/charity/3961454 world&#039;s education for kids e.V.]&lt;br /&gt;
&lt;br /&gt;
Und nein ich stehe nicht in Verbindung mit einer der Spendenorganisationen und auch nicht mit [https://www.paypal.com/fundraiser/hub Paypal Spenden].&lt;br /&gt;
&lt;br /&gt;
==Request for Comments==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Cheat_Sheets&amp;diff=5468</id>
		<title>Cheat Sheets</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Cheat_Sheets&amp;diff=5468"/>
		<updated>2026-10-09T17:25:50Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* PyCharm */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Python=&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;1&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:Python_Cheat_Sheet_DE_A3-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;2&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:Python_Cheat_Sheet_DE_A3-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=PyCharm=&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;1&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:PyCharm_Cheat_Sheet_DE-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;2&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:PyCharm_Cheat_Sheet_DE-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=PyTorch=&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;1&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:PyTorch_Cheat_Sheet_DE_A3.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;2&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:PyTorch_Cheat_Sheet_DE_A3.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:PyTorch_Cheat_Sheet_DE_A3.pdf&amp;diff=5467</id>
		<title>Datei:PyTorch Cheat Sheet DE A3.pdf</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:PyTorch_Cheat_Sheet_DE_A3.pdf&amp;diff=5467"/>
		<updated>2026-10-09T17:25:22Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Cheat_Sheets&amp;diff=5466</id>
		<title>Cheat Sheets</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Cheat_Sheets&amp;diff=5466"/>
		<updated>2026-10-09T17:11:22Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* PyCharm */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Python=&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;1&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:Python_Cheat_Sheet_DE_A3-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;2&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:Python_Cheat_Sheet_DE_A3-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=PyCharm=&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;1&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:PyCharm_Cheat_Sheet_DE-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;2&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:PyCharm_Cheat_Sheet_DE-1.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Cheat_Sheets&amp;diff=5465</id>
		<title>Cheat Sheets</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Cheat_Sheets&amp;diff=5465"/>
		<updated>2026-10-09T17:11:05Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* PyCharm */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Python=&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;1&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:Python_Cheat_Sheet_DE_A3-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;2&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:Python_Cheat_Sheet_DE_A3-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=PyCharm=&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;1&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:PyCharm_Cheat_Sheet_DE-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;2&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:PyCharm_Cheat_Sheet_DE-1.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Cheat_Sheets&amp;diff=5464</id>
		<title>Cheat Sheets</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Cheat_Sheets&amp;diff=5464"/>
		<updated>2026-10-09T17:10:41Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Python=&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;1&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:Python_Cheat_Sheet_DE_A3-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;2&amp;quot; width=&amp;quot;850&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:Python_Cheat_Sheet_DE_A3-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=PyCharm=&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;1&amp;quot; width=&amp;quot;1000&amp;quot; height=&amp;quot;707&amp;quot;&amp;gt;File:PyCharm_Cheat_Sheet_DE-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;2&amp;quot; width=&amp;quot;1000&amp;quot; height=&amp;quot;707&amp;quot;&amp;gt;File:PyCharm_Cheat_Sheet_DE-1.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Cheat_Sheets&amp;diff=5463</id>
		<title>Cheat Sheets</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Cheat_Sheets&amp;diff=5463"/>
		<updated>2026-10-09T17:10:18Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: /* Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Python=&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;1&amp;quot; width=&amp;quot;830&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:Python_Cheat_Sheet_DE_A3-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;2&amp;quot; width=&amp;quot;830&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;File:Python_Cheat_Sheet_DE_A3-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=PyCharm=&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;1&amp;quot; width=&amp;quot;1000&amp;quot; height=&amp;quot;707&amp;quot;&amp;gt;File:PyCharm_Cheat_Sheet_DE-1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf page=&amp;quot;2&amp;quot; width=&amp;quot;1000&amp;quot; height=&amp;quot;707&amp;quot;&amp;gt;File:PyCharm_Cheat_Sheet_DE-1.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
</feed>