TensorFlow er Googles maskinlæringsbibliotek. I praksis bruger man næsten altid Keras-API'et (tf.keras), som er den nemme vej. Kræver Python-grundlaget – se Python cheat sheet'et først.
# I terminalen:
# pip install tensorflow
import tensorflow as tf
import numpy as np
print(tf.__version__) # tjek at det virker
import tensorflow as tf er standard-aliaset. numpy (np) bruges til data – TensorFlow arbejder med numpy-arrays.
# Data skal være tal i arrays
# X = input (features), y = svar (labels)
X = np.array([[0], [1], [2], [3]])
y = np.array([0, 2, 4, 6]) # y = 2x
# Normalisér: del ind i træning/test
X_train, X_test = X[:3], X[3:]
y_train, y_test = y[:3], y[3:]
Normalisering hjælper: skalér store tal ned, fx billed-pixels fra 0-255 til 0-1 (pixels / 255.0). Hold altid noget data tilbage som test, som modellen aldrig ser under træning.
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(1,)),
tf.keras.layers.Dense(8, activation="relu"),
tf.keras.layers.Dense(1)
])
Sequential = lagene står i rækkefølge. Dense = fuldt forbundet lag. Første lag skal kende shape (formen af ét input-eksempel). activation="relu" giver ikke-linearitet; uden den kan modellen kun lære lige linjer.
# 10 klasser (fx cifre 0-9)
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(784,)),
tf.keras.layers.Dense(128, activation="relu"),
tf.keras.layers.Dense(10, activation="softmax")
])
# Labels som heltal → sparse_categorical
model.compile(
optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"]
)
softmax giver sandsynligheder der summer til 1. Brug sparse_categorical_crossentropy når labels er heltal (0, 1, 2…), og categorical_crossentropy når de er one-hot vektorer.historik = model.fit(
X_train, y_train,
epochs=50, # gennemløb af data
batch_size=32, # eksempler ad gangen
validation_split=0.2 # 20% til kontrol
)
# Se hvad der skete
print(historik.history["loss"])
print(historik.history["val_accuracy"])
epochs = hvor mange gange hele træningssættet gennemløbes. validation_split holder en del af træningsdata tilbage til løbende kontrol. Faldende loss = modellen lærer.
# Test på data modellen ALDRIG har set
test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"Test-nøjagtighed: {test_acc:.1%}")
# Brug modellen
gæt = model.predict(np.array([[5]]))
print(gæt) # fx [[10.2]]
# Klassifikation: find højeste sandsynlighed
sandsynligheder = model.predict(X_test[:1])
klasse = np.argmax(sandsynligheder) # fx 7
# Gem hele modellen
model.save("min_model.keras")
# Indlæs senere (helt færdigtrænet)
model = tf.keras.models.load_model(
"min_model.keras")
gæt = model.predict(np.array([[5]]))
Træning kan tage lang tid – gem altid modellen bagefter, så du kan bruge den uden at træne igen.
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(784,)),
tf.keras.layers.Dense(128, activation="relu"),
tf.keras.layers.Dropout(0.2), # sluk 20% tilfældigt
tf.keras.layers.Dense(10, activation="softmax")
])
# Stop når modellen ikke bliver bedre
tidlig_stop = tf.keras.callbacks.EarlyStopping(
patience=5, restore_best_weights=True)
model.fit(X_train, y_train, epochs=100,
validation_split=0.2,
callbacks=[tidlig_stop])
Overfitting = modellen har lært træningsdata udenad men fejler på nye data. Symptom: loss falder, men val_loss stiger. Modgifte: Dropout, EarlyStopping, eller mere data.
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(28, 28, 1)),
tf.keras.layers.Conv2D(32, 3, activation="relu"),
tf.keras.layers.MaxPooling2D(2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(10, activation="softmax")
])
Conv2D finder mønstre (kanter, former), MaxPooling2D formindsker, Flatten laver billedet om til en flad liste til Dense-lagene. Bruges til alt med billeder.
tf.keras.Sequential([...])byg model lag for lag
Dense(n, activation)fuldt forbundet lag
model.compile(...)vælg optimizer + loss
model.fit(X, y, epochs)træn modellen
model.evaluate(X, y)test på nye data
model.predict(X)forudsig
model.save(fil)gem trænet model
np.argmax(pred)klasse med højest sandsynlighed
shape passer ikke: input skal have samme form som Input(shape=...) angiver.evaluate.accuracy stiger på træning men falder på validering → overfitting. Tilføj Dropout.pip install tensorflow kræver meget plads – sørg for stabil internetforbindelse og diskplads.