TensorFlow:
Keras: Python API für TensorFlow, wurde mittlerweile in TensorFlow integriert
äquivalente Imports (seit TensorFlow 2.4):
import keras
from tensorflow import keras
Schritte:
x
und eines Ziel-Arrays y
model.compile()
und "Lernen" via model.fit(x, y)
model.predict(...)
Laden von Daten:
from sklearn import datasets
iris = datasets.load_iris()
x = iris.data
y = iris.target
Trainieren des Netzwerks:
from tensorflow import keras
model = keras.Sequential([
keras.layers.Dense(8),
keras.layers.Activation("relu"),
keras.layers.Dense(3),
keras.layers.Activation("softmax")
])
model.compile(
loss="sparse_categorical_crossentropy",
metrics=["accuracy"]
)
model.fit(x, y, epochs=300, validation_split=0.1)
Anwenden der Klassifikation auf neue Daten:
test_data = [
[5.3, 3.4, 1.9, 0.6],
[6.0, 3.0, 4.7, 1.5],
[6.5, 3.1, 5.0, 1.7]
]
y_pred = model.predict(test_data)
# [[0.9 0.1 0. ]
# [0. 0.8 0.2]
# [0. 0.7 0.3]]
Machine Learning Verfahren, das in etwa die Interaktion von Neuronen im Gehirn nachahmt
manche Layer (z.B. Dense, Convolution) können optional eine eingebaute (nachgeschaltete) Aktivierungsfunktion haben
Activation
Dense
Conv1D
, Conv2D
, Conv3D
MaxPooling1D
, MaxPooling2D
, MaxPooling3D
Dropout
BatchNormalization
sequenzielles API (erlaubt nur lineare Verarbeitung - jeder Layer hat einen Input und einen Output):
model = keras.models.Sequential([
keras.layers.Dense(256, activation="relu"),
keras.layers.Dense(128, activation="relu"),
keras.layers.Dense(10, activation="softmax"),
])
oder
model = keras.models.Sequential()
model.add(keras.layers.Dense(256, activation="relu"))
model.add(keras.layers.Dense(128, activation="relu"))
model.add(keras.layers.Dense(10, activation="softmax"))
Funktionales API (erlaubt komplexere Verarbeitung):
inputs = keras.layers.Input(shape=[28, 28])
x = keras.layers.Dense(256, activation="relu")(inputs)
x = keras.layers.Dense(128, activation="relu")(x)
outputs = keras.layers.Dense(10, activation="softmax")(x)
model = keras.Model(inputs, outputs)
Daten laden:
(
(x_train, y_train),
(x_test, y_test),
) = keras.datasets.mnist.load_data()
sequenzielles API:
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation="relu"),
keras.layers.Dense(10, activation="softmax"),
])
funktionales API:
inputs = keras.layers.Input(shape=(28, 28))
x = keras.layers.Flatten()(inputs)
x = keras.layers.Dense(128, activation="relu")(x)
outputs = keras.layers.Dense(10, activation="softmax")(x)
model = keras.Model(inputs, outputs)
model.compile(
loss="sparse_categorical_crossentropy",
metrics=["accuracy"],
)
model.fit(x_train, y_train, epochs=15, validation_split=0.1)
Hinzufügen eines Rescaling-Layers:
keras.layers.Rescaling(1/255)
Speichern eines trainierten Modells:
model.save("path/to/folder")
Laden eines Modells:
model = keras.models.load_model("path/to/folder")
from sklearn import datasets
from sklearn import model_selection
iris = datasets.load_iris()
x = iris.data
y = iris.target
from tensorflow import keras
model = keras.Sequential([
keras.layers.Dense(8),
keras.layers.Activation("relu"),
keras.layers.Dense(3),
keras.layers.Activation("softmax")
])
model.compile(
loss="sparse_categorical_crossentropy",
metrics=["accuracy"]
)
model.fit(x, y, epochs=300, validation_split=0.1, verbose=False)
layer_0 = model.get_layer(index=0)
layer_1 = model.get_layer(index=1)
layer_2 = model.get_layer(index=2)
layer_3 = model.get_layer(index=3)
# input values for an iris setosa flower
values_0 = np.array([[5.1, 3.5, 1.4, 0.2]])
Werte nach layer_0
(dense Layer):
values_1 = layer_0(values_0)
was im Hintergrund geschieht (mögliche Implementierung in numpy):
values_1 = values_0 @ layer_0.kernel + layer_0.bias
(Matrix-Multiplikation und Addition)
Werte nach layer_1
(RELU Aktivierungslayer):
values_2 = layer_1(values_1)
was im Hintergrund geschieht (mögliche Implementierung in numpy):
values_2 = np.maximum(values_1, 0)
(Ersetzen von negativen Werten durch 0)
Werte nach layer_2
(dense Layer):
values_3 = layer_2(values_2)
was im Hintergrund geschieht (mögliche Implementierung in numpy):
values_3 = values_2 @ layer_2.kernel + layer_2.bias
Werte nach layer_3
(Softmax Aktivierungslayer):
values_4 = layer_3(values_3)
was im Hintergrund geschieht (mögliche Implementierung in Python):
from scipy.special import softmax
# from sklearn.utils.extmath import softmax
values_4 = softmax(values_3)
Funktion, die Werte voraussagt und Zwischenwerte ausgibt:
def predict_and_log(values_0):
print(values_0, end="\n\n")
values_1 = layer_0(values_0)
print(values_1, end="\n\n")
values_2 = layer_1(values_1)
print(values_2, end="\n\n")
values_3 = layer_2(values_2)
print(values_3, end="\n\n")
values_4 = layer_3(values_3)
print(values_4, end="\n\n")
predict_and_log(np.array([[5.1, 3.5, 1.4, 0.2]]))
predict_and_log(np.array([[7.0, 3.2, 4.7, 1.4]]))
predict_and_log(np.array([[6.3, 3.3, 6.0, 2.5]]))
zum Vergleich: Lineare Regression - http://www.clungu.com/scikit-learn/tutorial/Scikit-learn/
Laden und Vorbereiten des Datensatzes:
from sklearn import datasets
from sklearn import utils
from sklearn import model_selection
from sklearn import preprocessing
housing = datasets.fetch_california_housing()
scaler = preprocessing.StandardScaler().fit(housing.data)
x = scaler.transform(housing.data)
y = housing.target
Modell erstellen und trainieren:
from keras.models import Sequential
from tensorflow.keras import layers
model = Sequential([
layers.Dense(16, activation="relu"),
layers.Dropout(0.1),
layers.Dense(16, activation="relu"),
layers.Dropout(0.1),
layers.Dense(1, activation="linear"),
])
model.compile(loss="mean_squared_error")
model.fit(x, y, epochs=100, validation_split=0.25, verbose=1)
Evaluieren:
model.evaluate(x, y)
see https://keras.io/examples/vision/image_classification_from_scratch/