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 ymodel.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
ActivationDenseConv1D, Conv2D, Conv3DMaxPooling1D, MaxPooling2D, MaxPooling3DDropoutBatchNormalizationsequenzielles 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/