Dr. Stefan Hackstein
stefan.hackstein@fhnw.ch
Slides
Abschlusstag: 12. Januar, Vormittags?
Strukturen in Daten finden
Lineare Regression
Output Layer
Hidden Layers
Weights * Inputs + Bias
Weights * Inputs + Bias
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Reinforcement Learning: Gaming, Robotik, Automatisierung
(10.11. Yanick Schraner)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Explainable AI: Transparenz, Vertrauen, Sicherheit
(04.11., 17.11. & 08.12. Susanne Suter)
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Reinforcement Learning: Gaming, Robotik, Automatisierung
(10.11. Yanick Schraner)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Explainable AI: Transparenz, Vertrauen, Sicherheit
(04.11., 17.11. & 08.12. Susanne Suter)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Reinforcement Learning: Gaming, Robotik, Automatisierung
(10.11. Yanick Schraner)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Explainable AI: Transparenz, Vertrauen, Sicherheit
(04.11., 17.11. & 08.12. Susanne Suter)
Reinforcement Learning: Gaming, Robotik, Automatisierung
(10.11. Yanick Schraner)
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Reinforcement Learning: Gaming, Robotik, Automatisierung
(10.11. Yanick Schraner)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Explainable AI: Transparenz, Vertrauen, Sicherheit
(04.11., 17.11. & 08.12. Susanne Suter)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Reinforcement Learning: Gaming, Robotik, Automatisierung
(10.11. Yanick Schraner)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Explainable AI: Transparenz, Vertrauen, Sicherheit
(04.11., 17.11. & 08.12. Susanne Suter)
Explainable AI: Transparenz, Vertrauen, Sicherheit
(04.11., 17.11. & 08.12. Susanne Suter)
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Reinforcement Learning: Gaming, Robotik, Automatisierung
(10.11. Yanick Schraner)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Explainable AI: Transparenz, Vertrauen, Sicherheit
(04.11., 17.11. & 08.12. Susanne Suter)
Case Study: Fragestellung
Daten Erkunden
Modell & Trainingsloop erstellen
Evaluieren
Overfitten
Regularisieren
Optimieren
Case Study: Fragestellung
Daten Erkunden
Modell & Trainingsloop erstellen
Evaluieren
Overfitten
Regularisieren
Optimieren
Case Study: Fragestellung
Report
Daten Erkunden
Modell & Trainingsloop erstellen
Evaluieren
Overfitten
Regularisieren
Optimieren
Case Study: Fragestellung
Report
Hands-On: MNIST Datensatz
Öffnen sie dieses Notebook und bearbeiten Sie die Aufgaben. Beantworten Sie so folgende Fragen:
Die Lösung finden Sie in diesem Notebook
Notebook auf Drive kopieren um Resultate zu speichern
Hands-On: MNIST Datensatz
Welche Daten enthält der Datensatz?
data.shape -> (N_data, size_input)
Die shape eines Datensatzes zeigt die Anzahl der Elemente (N_data) sowie das format der einzelnen Elemente (size_input)
Hands-On: MNIST Datensatz
Welches Format haben die Daten?
Die type(x) Funktion gibt die Klasse von x an
type(data[0]) -> class
Die built-in Funktion x.dtype gibt den Datentyp von x an
data.dtype -> data_type
Hands-On: MNIST Datensatz
Welche Klassen gibt es und wie sind diese verteilt?
numpy.unique(x) liefert eine liste aller Elemente die in x vorkommen
labels = np.unique(target)
numpy.bincount(x) liefert die Anzahl von Integerwerten in x, geordnet nach Zahlenwert der Integer
counts = np.bincount(target.astype(int))
Hands-On: MNIST Datensatz
Wie machen wir die Klassen dem Modell verständlich?
Um Stringlabel in für das Modell verständliche Floats zu verwandeln nutzen wir One-Hot-Encoding
# zB "3" -> [0,0,0,1,0,0,0,0,0,0]
#
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
labels = encoder.fit_transform(target)
Die letzte Zeile erwartet target mit shape (N,1)
Hands-On: MNIST Datensatz
Welche Skalierung der Daten ist sinnvoll?
In den Knoten eines Neuronalen Netzes werden viele Werte aufsummiert, was zu sehr grossen Ergebnissen führen kann.
Ausserdem haben grundsätzilch hohe Features ein stärkeres Gewicht.
Um das zu verhindern werden die Input-Daten auf [-1,1] skaliert.
Dazu benutzt man idR das Min-Max scaling
scaled_data = (data - np.min(data)) / (np.max(data) - np.min(data)) * 2 - 1
Lernen mit Zieldaten (Label)
Lernen mit Zieldaten (Label / Target)
Lernen ohne Zieldaten
Lernen ohne Zieldaten
Interaktion mit Umgebung
Interaktion mit Umgebung
Deep Learning Modell = Neuronales Netz
Neuronales Netz = einfache Dartstellung sehr komplizierter Rechnung
LinReg mit Basisfunktionen aus LinReg mit Basis aus Linreg mit Basis aus ...
Layer = Level für Lineare Regression
Mehrere Knoten (Perceptronen)
Knoten = gewichtete Summe & Aktivierungsfunktion
Wahl der Aktivierung:
Wenn möglich, bereits existierende Architektur / Modelle verwenden
Wenn möglich, bereits existierende Architektur / Modelle verwenden
from torch import nn
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
def forward(self, x):
return x
model = Classifier()
output = model(data)
Pytorch (Meta)
from torch import nn
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.fc4 = nn.Linear(784, 10)
def forward(self, x):
x = self.fc4(x)
return x
model = Classifier()
output = model(data)
Pytorch (Meta)
from torch import nn
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, 64)
self.fc4 = nn.Linear(64, 10)
def forward(self, x):
x = self.fc1(x)
x = self.fc2(x)
x = self.fc3(x)
x = self.fc4(x)
return x
model = Classifier()
output = model(data)
Pytorch (Meta)
from torch import nn
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, 64)
self.fc4 = nn.Linear(64, 10)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc3(x))
x = self.fc4(x)
return x
model = Classifier()
output = model(data)
Pytorch (Meta)
from torch import nn
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, 64)
self.fc4 = nn.Linear(64, 10)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc3(x))
x = F.softmax(self.fc4(x), dim=1)
return x
model = Classifier()
output = model(data)
Pytorch (Meta)
from torch import nn
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, 64)
self.fc4 = nn.Linear(64, 10)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc3(x))
x = F.softmax(self.fc4(x), dim=1)
return x
model = Classifier()
output = model(data)
Pytorch (Meta)
import tensorflow as tf
from tensorflow.keras import layers
class Classifier(tf.keras.Model):
def __init__(self):
super(Classifier, self).__init__()
self.fc1 = layers.Dense(64, activation='relu')
self.fc2 = layers.Dense(64, activation='relu')
self.fc3 = layers.Dense(64, activation='relu')
self.fc4 = layers.Dense(10, activation='softmax')
def call(self, x):
x = self.fc1(x)
x = self.fc2(x)
x = self.fc3(x)
x = self.fc4(x)
return x
model = Classifier()
model.build((None, 784))
model(data)
Tensorflow (Google)
import torch.nn as nn
model = nn.Sequential(
nn.Linear(784, 64),
nn.ReLU(),
nn.Linear(64, 64),
nn.ReLU(),
nn.Linear(64, 64),
nn.ReLU(),
nn.Linear(64, 10),
nn.Softmax(dim=1)
)
output = model(data)
Pytorch (Meta)
from tensorflow.keras import models
model = models.Sequential([
layers.Dense(64, activation='relu', input_shape=(784,)),
layers.Dense(64, activation='relu'),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
model(data)
Tensorflow (Google)
Pytorch
Tensorflow
Pytorch
Tensorflow
Beide Frameworks sehr nützlich & weit verbreitet
Mathematik identisch & Aufbau sehr ähnlich
Wahl meist durch Arbeitsumfeld bestimmt
for images, labels in trainloader:
prediction = model(images)
loss = criterion(prediction, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
trainloader = DataLoader(trainset, batch_size=256, shuffle=True)
criterion = nn.CrossEntropyLoss()
Pytorch
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
Pytorch
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
Pytorch
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
for images, labels in trainloader:
Pytorch
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
for images, labels in trainloader:
prediction = model(images)
loss = criterion(prediction, labels)
Pytorch
Forward-Pass
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
for images, labels in trainloader:
prediction = model(images)
loss = criterion(prediction, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
Pytorch
Backward-Pass
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
running_loss = 0
for images, labels in trainloader:
prediction = model(images)
loss = criterion(prediction, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss += loss.item()
Pytorch
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
running_loss = 0
for images, labels in trainloader:
prediction = model(images)
loss = criterion(prediction, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss += loss.item()
Pytorch
model.compile(optimizer=optimizers.Adam(learning_rate=0.003),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(train_images, train_labels, epochs=1, batch_size=64)
print(f'Training loss: {history.history["loss"][0]}')
Tensorflow
Ableitung der Kosten -> Richtung für Verbesserung -> Update
Ableitung der Kosten -> Richtung für Verbesserung -> Update
Ableitung der Kosten -> Richtung für Verbesserung -> Update
Ableitung der Kosten -> Richtung für Verbesserung -> Update
Stochastic Gradient Descent (SGD)
Stochastic Gradient Descent (SGD)
Stochastic Gradient Descent (SGD)
Stochastic Gradient Descent (SGD)
Stochastic Gradient Descent (SGD)
Stochastic Gradient Descent (SGD)
Stochastic Gradient Descent (SGD)
Stochastic Gradient Descent (SGD)
Stochastic Gradient Descent (SGD)
Stochastic Gradient Descent (SGD)
SGD
Momentum
Hands-On: MNIST Classifier
Bearbeiten Sie dieses Notebook
Die Lösung finden Sie in diesem Notebook
Wie gut und stabil ist mein Model?
from sklearn.metrics import confusion_matrix, f1_score
conf_mat = confusion_matrix(all_labels, all_preds)
f1 = f1_score(all_labels, all_preds, average='macro')
ImageNet Klassifikation
ImageNet Klassifikation
Hands-On: MNIST Classifier
Bearbeiten Sie dieses Notebook
Die Lösung finden Sie in diesem Notebook
Ist das Modell geeignet, Muster zu erkennen?
# Get one batch from the training_loader
images, labels = next(iter(training_loader))
# alternativ:
for images, labels in training_loader:
break
# Train the model on the batch for 100 iterations
for _ in range(100):
train(model, criterion, optimizer, [(images, labels)])
Ist das Modell geeignet, Muster zu erkennen?
Hands-On: MNIST Classifier
Bearbeiten Sie dieses Notebook
Die Lösung finden Sie in diesem Notebook
Text
l1_regularization_loss = torch.norm(model.parameters(), 1)
l1_regularization_loss = torch.norm(model.parameters(), 1)
optimizer = torch.optim.Adam(model.parameters(), lr=lr, weight_decay=beta)
l1_regularization_loss = torch.norm(model.parameters(), 1)
optimizer = torch.optim.Adam(model.parameters(), lr=lr, weight_decay=beta)
nn.Dropout(0.2) # 0.2 of neurons set to 0
l1_regularization_loss = torch.norm(model.parameters(), 1)
optimizer = torch.optim.Adam(model.parameters(), lr=lr, weight_decay=beta)
nn.Dropout(0.2) # 0.2 of neurons set to 0
nn.BatchNorm1d()
Dense(N, kernel_regularizer=keras.regularizers.l2(beta), bias_regularizer=keras.regularizers.l2(beta))
tf.keras.layers.Dropout(0.2) # 0.2 of neurons set to 0
tf.keras.layers.BatchNormalization(),
Dense(N, kernel_regularizer=keras.regularizers.l1(beta), bias_regularizer=keras.regularizers.l1(beta))
Hands-On: MNIST Classifier
Bearbeiten Sie dieses Notebook
Die Lösung finden Sie in diesem Notebook
Möglichkeiten & Grenzen
Möglichkeiten
Möglichkeiten
Möglichkeiten
Möglichkeiten
Möglichkeiten
Möglichkeiten
Möglichkeiten
Gefahren
Gefahren
Gefahren
Gefahren
Gefahren
Gefahren
Gefahren
Grenzen
Grenzen
Curse of Dimensionality
Abstände zwischen den Datenpunkten steigen exponentiell mit Dimension
Benötigte Anzahl Daten steigt Exponentiell mit Anzahl extrahierter Informationen
Grenzen
Grenzen
Grenzen
Grenzen
Grenzen
Modell auf unbekannten Daten optimieren
aber
Testset erst ganz zum Schluss verwenden
Modell auf unbekannten Daten optimieren
aber
Testset erst ganz zum Schluss verwenden
Weiteres Datenset absplitten
from torch.utils.data import random_split
train_ratio, valid_ratio = 0.8, 0.2
# Gesamteanzahl der Trainingsdaten
N_training = len(training_data)
# Berechne die Anzahl der Beispiele für jeden Split
train_size = int(train_ratio * N_training)
valid_size = N_training - train_size
# Teile den Trainingsdatensatz in Train und Valid auf
train_data, valid_data = random_split(training_data,
[train_size, valid_size])
from torch.utils.data import random_split
train_ratio, valid_ratio = 0.8, 0.2
# Gesamteanzahl der Trainingsdaten
N_training = len(training_data)
# Berechne die Anzahl der Beispiele für jeden Split
train_size = int(train_ratio * N_training)
valid_size = N_training - train_size
# Teile den Trainingsdatensatz in Train und Valid auf
train_data, valid_data = random_split(training_data,
[train_size, valid_size])
import tensorflow as tf
from sklearn.model_selection import train_test_split
valid_ratio = 0.2
input_data = your_input_data
labels = your_labels
input_train, input_valid, labels_train, labels_valid =
train_test_split(input_data, labels, test_size=valid_ratio, random_state=42)
# Create TensorFlow Datasets
train_dataset = tf.data.Dataset.from_tensor_slices((input_train, labels_train))
valid_dataset = tf.data.Dataset.from_tensor_slices((input_valid, labels_valid))
class MLP_var(nn.Module):
def __init__(self, N_layer: int):
super(MLP_var, self).__init__()
layers = []
layers.append(nn.Linear(28*28, 64))
layers.append(nn.ReLU())
for _ in range(N_layer-1):
layers.append(nn.Linear(64, 64))
layers.append(nn.ReLU())
layers.append(nn.Linear(64, 10))
self.model = nn.Sequential(*layers)
def forward(self, x):
x = x.view(x.size(0), -1)
x = self.model(x)
return x
Try different Values, pick best score
Try different Values, pick best score
Gridsearch
for (N_layer, lr) in product(N_layer_values, learning_rate_values):
model = MLP_var(N_layer)
model.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=lr)
losses_train, losses_valid, f1_scores_train, f1_scores_valid = full_training(
model, criterion, optimizer, training_loader, valid_loader, epochs=epochs
)
Hands-On: MNIST Classifier
Bearbeiten Sie dieses Notebook
Die Lösung finden Sie in diesem Notebook
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Reinforcement Learning: Gaming, Robotik, Automatisierung
(10.11. Yanick Schraner)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Explainable AI: Transparenz, Vertrauen, Sicherheit
(04.11., 17.11. & 08.12. Susanne Suter)
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Convolutional Neural Network (CNN)
Findet Strukturen
Convolutional Neural Network (CNN)
Klassifiziert durch Strukturen
Erstellen neue Daten wie Trainingsdaten
aus Zufalls-zahlen
Varational Autoencoder
Generative Adversarial Network
Varational Autoencoder
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Reinforcement Learning: Gaming, Robotik, Automatisierung
(10.11. Yanick Schraner)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Explainable AI: Transparenz, Vertrauen, Sicherheit
(04.11., 17.11. & 08.12. Susanne Suter)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Transformer
Transformiert Sequenz zu neuer Sequenz
Transformer
Recurrent Neural Network (RNN)
Verwendet letzten Output
-> Kurzzeitgedächtnis
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Reinforcement Learning: Gaming, Robotik, Automatisierung
(10.11. Yanick Schraner)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Explainable AI: Transparenz, Vertrauen, Sicherheit
(04.11., 17.11. & 08.12. Susanne Suter)
Reinforcement Learning: Gaming, Robotik, Automatisierung
(10.11. Yanick Schraner)
Findet versprechendste Aktion in beliebigem Zustand
Hin und wieder neues ausprobieren
-> auf Veränderung reagieren
Hin und wieder neues ausprobieren
-> auf Veränderung reagieren
Früher: Tabelle
Heute:
Neuronales Netz
Computer Vision: Klassifizierung, Objekterkennung, Bildgenerierung
(16.09., 30.09. & 28.10. Amadeus Oertel)
Natural Language Processing: Übersetzungen, Chatbots
(22.09., 29.09. & 20.10. Fabian Märki & Joel Akaret)
Reinforcement Learning: Gaming, Robotik, Automatisierung
(10.11. Yanick Schraner)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Explainable AI: Transparenz, Vertrauen, Sicherheit
(04.11., 17.11. & 08.12. Susanne Suter)
Zeitreihenanalyse: Markt- & Wetterprognosen, Anomalieerkennung
(03.11. Fernando Benites)
Kurzzeit-
Gedächtnis
Text
Langes
Kurzzeit-
Gedächtnis
Slurm: Umgang mit HPC Rechenclustern
Unterlagen auf Teams:
General > Class Materials > 20230710 - HowToSlurm.pdf
Bitte nehmen Sie sich einen Moment Zeit, um uns zu bewerten.