Tensorflow ist eine Bibliothek zum Erstellen und trainieren von [[machine_learning|neuronalen Netzwerken]].
=====Arten von Modellen=====
In TensorFlow, einer weit verbreiteten Deep-Learning-Bibliothek, gibt es verschiedene Arten von Modellen, die verwendet werden können, um neuronale Netzwerke aufzubauen.
[[https://www.youtube.com/watch?v=EvGS3VAsG4Y|Sequencial vs functional API]]
====Sequential====
Das Sequential-Modell ist die einfachste Art von Modell in TensorFlow. Es besteht aus einer linearen Stapelung von Schichten, wobei jede Schicht direkt mit der vorherigen verbunden ist. Es eignet sich gut für einfache sequentielle Aufgaben, bei denen keine Rückkopplungsschleifen oder mehrere Eingänge/Ausgänge vorhanden sind.
import tensorflow as tf
model = tf.keras.Sequential([
tf.keras.layers.Dense(64, activation='relu', input_shape=(input_dim,)),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(num_classes, activation='softmax')
])
====Functional====
Das Functional-Modell ermöglicht eine größere Flexibilität als das Sequential-Modell. Es ermöglicht die Erstellung von Modellen mit mehreren Eingängen und Ausgängen sowie komplexeren Architekturen wie verzweigten Schichten und Rückkopplungsschleifen.
import tensorflow as tf
inputs = tf.keras.Input(shape=(input_dim,))
x = tf.keras.layers.Dense(64, activation='relu')(inputs)
x = tf.keras.layers.Dense(64, activation='relu')(x)
outputs = tf.keras.layers.Dense(num_classes, activation='softmax')(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
====Subclassing====
Das Subclassing-Modell ermöglicht die ultimative Flexibilität bei der Erstellung von Modellen in TensorFlow. Mit dieser Methode können benutzerdefinierte Schichten und Berechnungen erstellt werden. Das Modell wird erstellt, indem eine Unterklasse der tf.keras.Model Klasse erstellt und die erforderlichen Schichten und Berechnungen definiert werden.
import tensorflow as tf
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel, self).__init__()
self.dense1 = tf.keras.layers.Dense(64, activation='relu')
self.dense2 = tf.keras.layers.Dense(64, activation='relu')
self.dense3 = tf.keras.layers.Dense(num_classes, activation='softmax')
def call(self, inputs):
x = self.dense1(inputs)
x = self.dense2(x)
return self.dense3(x)
model = MyModel()
====Convolutional====
CNNs sind speziell für die Verarbeitung von Bildern entwickelt worden. Sie bestehen aus speziellen Schichten wie Convolutional-Layern und Pooling-Layern, die Muster in Bildern erkennen können. CNNs haben in der Bilderkennung und im Computersehen beeindruckende Erfolge erzielt.
import tensorflow as tf
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(image_height, image_width, channels)),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(num_classes, activation='softmax')
])
====Recurrent====
RNNs sind darauf spezialisiert, sequenzielle Daten zu verarbeiten, bei denen die vorherigen Schritte den aktuellen beeinflussen. Sie sind besonders nützlich für Aufgaben wie Spracherkennung und maschinelles Übersetzen. TensorFlow bietet verschiedene RNN-Schichttypen wie SimpleRNN, LSTM und GRU.
import tensorflow as tf
model = tf.keras.Sequential([
tf.keras.layers.SimpleRNN(64, input_shape=(sequence_length, input_dim)),
tf.keras.layers.Dense(num_classes, activation='softmax')
])
* Long Short-Term Memory (LSTM): LSTMs sind eine Art von RNN mit einer spezialisierten Speicherzelle, die es ihnen ermöglicht, lange Abhängigkeiten in sequenziellen Daten zu erfassen. Sie eignen sich gut für Aufgaben, die lange Abhängigkeiten involvieren, und werden häufig für verschiedene Sequenz-zu-Sequenz-Aufgaben wie maschinelle Übersetzung und Textgenerierung eingesetzt.
* Gated Recurrent Unit (GRU): GRUs sind eine andere Variante von RNNs mit einer vereinfachten Struktur im Vergleich zu LSTMs, aber auch mit Gating-Mechanismen zur Steuerung des Informationsflusses. Sie sind rechentechnisch weniger aufwendig als LSTMs und liefern oft ähnliche Ergebnisse, wodurch sie eine beliebte Wahl für Sequenzmodellierungsaufgaben sind.
* Bidirectional RNN: In einem bidirektionalen RNN wird die Eingabesequenz sowohl in Vorwärts- als auch in Rückwärtsrichtung verarbeitet. Dadurch kann das RNN vergangenen und zukünftigen Kontext bei Vorhersagen berücksichtigen. [[https://en.wikipedia.org/wiki/Named-entity_recognition|Named Entity Recognition]] und [[https://en.wikipedia.org/wiki/Sentiment_analysis|Sentiment analysis]].
* Attention-based RNN: Attention-Mechanismen werden verwendet, um sich auf bestimmte Teile der Eingabesequenz zu konzentrieren, während Vorhersagen getroffen werden. RNNs mit Attention sind besonders nützlich, wenn verschiedene Teile der Eingabesequenz unterschiedlich zum Ergebnis beitragen.
* Transformer: Der Transformer ist eine Art von Architektur, die nicht auf rekurrente Verbindungen angewiesen ist, sondern Selbst-Aufmerksamkeitsmechanismen nutzt. Er ist aufgrund seiner Parallelisierungsfähigkeiten und der Fähigkeit, lange Sequenzen effektiv zu verarbeiten, bei verschiedenen Aufgaben der natürlichen Sprachverarbeitung beliebt geworden.
* Clockwork RNN: Clockwork RNNs haben unterschiedliche Zeitschritte für verschiedene Neuronen in der versteckten Schicht. Dadurch können verschiedene Teile des Netzwerks mit unterschiedlichen Frequenzen arbeiten, was bei Daten mit hierarchischen zeitlichen Mustern hilfreich sein kann.
* Echo State Network (ESN): ESN ist eine Art von [[https://en.wikipedia.org/wiki/Reservoir_computing|Reservoir-Computing]]-Netzwerk, bei dem die versteckte Schicht spärlich und zufällig verbunden ist. Die rekurrenten Verbindungen sind festgelegt und nur die Ausgabeschicht wird trainiert. ESNs wurden in verschiedenen Aufgaben der Zeitreihenvorhersage eingesetzt.
* Hierarchical RNN: Hierarchische RNNs stapeln mehrere RNN-Schichten, um hierarchische Repräsentationen sequenzieller Daten zu lernen. Dies kann hilfreich sein, wenn Daten mehrere Ebenen von zeitlichen Abhängigkeiten aufweisen.
* Dilated RNN: Dilated RNNs verwenden verdünnte (oder spärliche) Faltungen in der rekurrenten Schicht, wodurch das Netzwerk ein größeres [[https://de.wikipedia.org/wiki/Rezeptives_Feld|Rezeptivfeld]] erhält, ohne die Berechnung erheblich zu erhöhen.
====Transfer Learning====
Transfer Learning ermöglicht es, vortrainierte Modelle zu verwenden und sie für neue Aufgaben anzupassen. Anstatt ein Modell von Grund auf neu zu trainieren, können Sie ein bereits trainiertes Modell nehmen und es auf Ihren spezifischen Datensatz feinabstimmen. Dies ist besonders nützlich, wenn Sie über begrenzte Daten verfügen.
import tensorflow as tf
base_model = tf.keras.applications.MobileNetV2(input_shape=(image_height, image_width, channels),
include_top=False,
weights='imagenet')
model = tf.keras.Sequential([
base_model,
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(num_classes, activation='softmax')
])
====Transformer====
Transformer-Modelle haben in der natürlichen Sprachverarbeitung große Aufmerksamkeit erlangt, insbesondere durch den Erfolg des Modells "GPT" (Generative Pre-trained Transformer). Diese Modelle verwenden Aufmerksamkeitsmechanismen, um die Beziehungen zwischen den Wörtern in einem Text zu modellieren.
import tensorflow as tf
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(sequence_length,), dtype=tf.int32),
tf.keras.layers.Embedding(vocab_size, embedding_dim),
tf.keras.layers.Transformer(num_layers=2, d_model=128, num_heads=4,
dff=512, input_vocab_size=vocab_size,
maximum_position_encoding=1000),
tf.keras.layers.Dense(vocab_size, activation='softmax')
])
====GAN====
GANs (Generative Adversarial Networks) sind eine Art von Deep-Learning-Modell, bei dem ein Generator-Modell versucht, Daten zu generieren, die von einem Diskriminator-Modell nicht von echten Daten unterschieden werden können. GANs werden häufig für die Generierung von Bildern, Videos oder Musik verwendet. TensorFlow bietet Möglichkeiten zur Implementierung von GANs, einschließlich der Verwendung von convolutional oder transformativen Modellen für den Generator und des Diskriminators.
import tensorflow as tf
# Generator-Modell
generator = tf.keras.Sequential([
tf.keras.layers.Dense(256, input_dim=100, activation='relu'),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(28*28, activation='sigmoid'),
tf.keras.layers.Reshape((28, 28))
])
# Diskriminator-Modell
discriminator = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(256, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
# GAN-Modell
gan = tf.keras.Sequential([generator, discriminator])
====Autoencoder====
Autoencoder-Modelle werden für die Dimensionalitätsreduktion, Datenkompression oder die Generierung von ähnlichen Daten verwendet. Sie bestehen aus einem Encoder, der die Eingangsdaten in einen latenten Vektor komprimiert, und einem Decoder, der den latenten Vektor in die ursprünglichen Daten rekonstruiert. TensorFlow ermöglicht die Erstellung von Autoencodern mit verschiedenen Architekturen wie den klassischen Fully Connected Autoencodern oder Convolutional Autoencodern.
import tensorflow as tf
# Fully Connected Autoencoder
input_dim = 784
encoding_dim = 32
input_layer = tf.keras.layers.Input(shape=(input_dim,))
encoder = tf.keras.layers.Dense(encoding_dim, activation='relu')(input_layer)
decoder = tf.keras.layers.Dense(input_dim, activation='sigmoid')(encoder)
autoencoder = tf.keras.Model(inputs=input_layer, outputs=decoder)
# Convolutional Autoencoder
input_shape = (28, 28, 1)
latent_dim = 16
input_layer = tf.keras.layers.Input(shape=input_shape)
encoder = tf.keras.layers.Conv2D(latent_dim, (3, 3), activation='relu', padding='same')(input_layer)
decoder = tf.keras.layers.Conv2DTranspose(1, (3, 3), activation='sigmoid', padding='same')(encoder)
autoencoder = tf.keras.Model(inputs=input_layer, outputs=decoder)
====Siamese====
Siamese Networks sind spezielle Modelle, die verwendet werden, um Ähnlichkeiten oder Vergleiche zwischen Eingangsdaten zu bewerten. Sie werden oft in Anwendungen wie Bildvergleich, Gesichtserkennung oder Textmatching eingesetzt. TensorFlow ermöglicht die Erstellung von Siamese Networks mit geteilten Gewichten, um Paare von Eingangsdaten zu vergleichen und eine Ähnlichkeitsbewertung zu generieren.
import tensorflow as tf
# Siamese Network
input_shape = (64, 64, 3)
embedding_dim = 128
input_a = tf.keras.layers.Input(shape=input_shape)
input_b = tf.keras.layers.Input(shape=input_shape)
base_model = tf.keras.applications.ResNet50(include_top=False, weights='imagenet', pooling='avg')
base_model.trainable = False
embedding_a = base_model(input_a)
embedding_b = base_model(input_b)
distance = tf.keras.layers.DistanceMetric()(embedding_a, embedding_b)
siamese_model = tf.keras.Model(inputs=[input_a, input_b], outputs=distance)
====Reinforcement====
Reinforcement Learning (Verstärkungslernen) verwendet eine Agenten-Umgebung-Interaktion, um ein Ziel zu erreichen. TensorFlow unterstützt die Implementierung von Reinforcement Learning-Algorithmen wie Q-Learning, Deep Q-Networks (DQN) oder Proximal Policy Optimization (PPO). Diese Modelle werden in Aufgaben wie Spielagenten, Robotiksteuerung oder Portfoliooptimierung eingesetzt.
import tensorflow as tf
# Q-Learning
num_actions = 4
state_shape = (84, 84, 4)
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (8, 8), strides=(4, 4), activation='relu', input_shape=state_shape),
tf.keras.layers.Conv2D(64, (4, 4), strides=(2, 2), activation='relu'),
tf.keras.layers.Conv2D(64, (3, 3), strides=(1, 1), activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(num_actions)
])
# Deep Q-Network (DQN)
num_actions = 4
state_shape = (84, 84, 4)
input_layer = tf.keras.layers.Input(shape=state_shape)
conv1 = tf.keras.layers.Conv2D(32, (8, 8), strides=(4, 4), activation='relu')(input_layer)
conv2 = tf.keras.layers.Conv2D(64, (4, 4), strides=(2, 2), activation='relu')(conv1)
conv3 = tf.keras.layers.Conv2D(64, (3, 3), strides=(1, 1), activation='relu')(conv2)
flatten = tf.keras.layers.Flatten()(conv3)
dense1 = tf.keras.layers.Dense(512, activation='relu')(flatten)
output_layer = tf.keras.layers.Dense(num_actions)(dense1)
model = tf.keras.Model(inputs=input_layer, outputs=output_layer)
# Proximal Policy Optimization (PPO)
num_actions = 4
state_shape = (84, 84, 4)
input_layer = tf.keras.layers.Input(shape=state_shape)
conv1 = tf.keras.layers.Conv2D(32, (8, 8), strides=(4, 4), activation='relu')(input_layer)
conv2 = tf.keras.layers.Conv2D(64, (4, 4), strides=(2, 2), activation='relu')(conv1)
conv3 = tf.keras.layers.Conv2D(64, (3, 3), strides=(1, 1), activation='relu')(conv2)
flatten = tf.keras.layers.Flatten()(conv3)
dense1 = tf.keras.layers.Dense(512, activation='relu')(flatten)
action_logits = tf.keras.layers.Dense(num_actions)(dense1)
value = tf.keras.layers.Dense(1)(dense1)
model = tf.keras.Model(inputs=input_layer, outputs=[action_logits, value])
=====Pattern Recognition Example=====
import numpy as np
from tensorflow.keras.models import Sequential, model_from_json, load_model
from tensorflow.keras.layers import LSTM, Dense, SimpleRNN
original_data = np.array([
[1, 0, 1, 1, 1, 0, 1, 1],
[1, 1, 0, 0, 1, 1, 0, 0],
[0, 1, 0, 1, 1, 1, 0, 1],
[1, 1, 1, 0, 0, 0, 1, 0],
[1, 0, 0, 1, 1, 1, 0, 0],
[1, 0, 1, 1, 1, 0, 0, 1],
[0, 0, 1, 1, 0, 1, 0, 0],
[1, 0, 1, 1, 0, 1, 1, 0],
[1, 0, 1, 1, 1, 1, 1, 0],
[1, 0, 1, 0, 1, 1, 1, 0]
])
original_labels = np.array([1, 0, 1, 0, 1, 1, 0, 0, 1, 0])
data_with_labels = np.column_stack((original_data, original_labels))
np.savetxt('training_data.csv', data_with_labels, delimiter=', ', fmt='%d')
loaded_data_with_labels = np.loadtxt('training_data.csv', delimiter=',')
data = loaded_data_with_labels[:, :-1]
labels = loaded_data_with_labels[:, -1]
# fit the input layer
#data = data.reshape(data.shape[0], data.shape[1], 1)
model = Sequential()
model.add(LSTM(16, input_shape=(data.shape[1], 1)))
# model.add(SimpleRNN(16, input_shape=(data.shape[1], 1)))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(data, labels, epochs = 100, batch_size = 1, verbose = True)
model.summary()
# native keras format (includes model and weights)
model.save('my_model.keras')
# separate model and weights in hdf5 format
#model.save('my_model')
#model.save_weights('my_model\\weights.h5')
# only a description of the model in json format and the weights in hdf5 format
#open("my_model.json", "w").write(model.to_json())
#model.save_weights('my_model_weights.h5')
del model
# native keras format (includes model and weights)
model = load_model('my_model.keras')
# separate model and weights in hdf5 format
#model = load_model('my_model')
#model.load_weights('my_model\\weights.h5')
# only a description of the model in json format and the weights in hdf5 format
#model = model_from_json( open("my_model.json", "r").read() )
#model.load_weights('my_model_weights.h5')
seed = np.array([[1, 0, 1, 1, 0, 1, 1, 0]])
seed = seed.reshape(seed.shape[0], seed.shape[1], 1)
prediction = model.predict(seed)
prediction = (prediction >= 0.5).astype(int)
print(prediction)
=====Mnist Image Example=====
Taken from several tutorials
* [[https://machinelearningmastery.com/how-to-develop-a-generative-adversarial-network-for-an-mnist-handwritten-digits-from-scratch-in-keras/]]
* [[https://github.com/kroosen/GAN-in-keras-on-mnist/blob/master/GAN-keras-mnist-DCGAN.ipynb]]
====Train images====
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Reshape, Flatten
from tensorflow.keras.layers import Conv2DTranspose, Conv2D
from tensorflow.keras.datasets import mnist
# Load the MNIST dataset
(x_train, _), (_, _) = mnist.load_data()
# Normalize and reshape data
x_train = (x_train.astype('float32') - 127.5) / 127.5
x_train = np.expand_dims(x_train, axis=-1)
# Build the Generator
generator = Sequential()
generator.add(Dense(128 * 7 * 7, input_shape=(100,), activation='relu'))
generator.add(Reshape((7, 7, 128)))
generator.add(Conv2DTranspose(64, kernel_size=4, strides=2, padding='same', activation='relu'))
generator.add(Conv2DTranspose(1, kernel_size=4, strides=2, padding='same', activation='tanh'))
# Build the Discriminator
discriminator = Sequential()
discriminator.add(Conv2D(64, kernel_size=4, strides=2, padding='same', input_shape=(28, 28, 1), activation='relu'))
discriminator.add(Conv2D(128, kernel_size=4, strides=2, padding='same', activation='relu'))
discriminator.add(Flatten())
discriminator.add(Dense(1, activation='sigmoid'))
# Compile the Discriminator
discriminator.compile(loss='binary_crossentropy', optimizer='adam')
# Build the GAN
gan = Sequential([generator, discriminator])
# Compile the GAN
discriminator.trainable = False # So we only train the generator in the GAN
gan.compile(loss='binary_crossentropy', optimizer='adam')
# Training loop to train GAN
epochs = 100
batch_size = 128
for epoch in range(epochs):
# Train the Discriminator
idx = np.random.randint(0, x_train.shape[0], batch_size)
real_images = x_train[idx]
noise = np.random.normal(0, 1, (batch_size, 100))
generated_images = generator.predict(noise)
real_labels = np.ones((batch_size, 1))
fake_labels = np.zeros((batch_size, 1))
d_loss_real = discriminator.train_on_batch(real_images, real_labels)
d_loss_fake = discriminator.train_on_batch(generated_images, fake_labels)
d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)
# Train the Generator
noise = np.random.normal(0, 1, (batch_size, 100))
valid_labels = np.ones((batch_size, 1))
g_loss = gan.train_on_batch(noise, valid_labels)
# Print progress
print(f"Epoch {epoch}/{epochs} | D Loss: {d_loss} | G Loss: {g_loss}")
generator.save_weights('trained_generator_model.keras')
discriminator.save_weights('trained_discriminator_model.keras')
gan.save_weights('trained_gan_model.keras')
====Generate images====
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Reshape, Flatten
from tensorflow.keras.layers import Conv2DTranspose, Conv2D
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import load_model
# Build the Generator
generator = Sequential()
generator.add(Dense(128 * 7 * 7, input_shape=(100,), activation='relu'))
generator.add(Reshape((7, 7, 128)))
generator.add(Conv2DTranspose(64, kernel_size=4, strides=2, padding='same', activation='relu'))
generator.add(Conv2DTranspose(1, kernel_size=4, strides=2, padding='same', activation='tanh'))
# Load the saved weights
generator.load_weights('trained_generator_model.keras')
# Generate new images
num_images_to_generate = 10
noise = np.random.normal(0, 1, (num_images_to_generate, 100))
generated_images = generator.predict(noise)
# Denormalize the images (if they were normalized during training)
generated_images = 0.5 * generated_images + 0.5
# Display the generated images with labels
fig, axs = plt.subplots(1, num_images_to_generate, figsize=(15, 15))
for i in range(num_images_to_generate):
img = generated_images[i].squeeze()
axs[i].imshow(img, cmap='gray')
axs[i].axis('off')
plt.show()
====Generate and classify images====
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Reshape, Flatten
from tensorflow.keras.layers import Conv2DTranspose, Conv2D
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import load_model
# Build the Generator
generator = Sequential()
generator.add(Dense(128 * 7 * 7, input_shape=(100,), activation='relu'))
generator.add(Reshape((7, 7, 128)))
generator.add(Conv2DTranspose(64, kernel_size=4, strides=2, padding='same', activation='relu'))
generator.add(Conv2DTranspose(1, kernel_size=4, strides=2, padding='same', activation='tanh'))
# Build the Discriminator
discriminator = Sequential()
discriminator.add(Conv2D(64, kernel_size=4, strides=2, padding='same', input_shape=(28, 28, 1), activation='relu'))
discriminator.add(Conv2D(128, kernel_size=4, strides=2, padding='same', activation='relu'))
discriminator.add(Flatten())
discriminator.add(Dense(1, activation='sigmoid'))
# Load the saved weights
generator.load_weights('trained_generator_model.keras')
discriminator.load_weights('trained_discriminator_model.keras')
# Generate new images
num_images_to_generate = 10
noise = np.random.normal(0, 1, (num_images_to_generate, 100))
generated_images = generator.predict(noise)
# Denormalize the images (if they were normalized during training)
generated_images = 0.5 * generated_images + 0.5
import matplotlib.pyplot as plt
# Display the generated images with labels
fig, axs = plt.subplots(1, num_images_to_generate, figsize=(15, 15))
for i in range(num_images_to_generate):
img = generated_images[i].squeeze()
label = np.argmax(discriminator.predict(np.expand_dims(img, axis=0)))
axs[i].imshow(img, cmap='gray')
axs[i].set_title(f"{label}", fontsize=12)
axs[i].axis('off')
plt.show()
=====Text Generation Example=====
# Text generation
import tensorflow as tf
from tensorflow.keras.layers import Embedding, LSTM, Dense
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
# Step 1: Prepare the training data
training_data = []
with open("D:\\gpt\\test.txt", "r", encoding="utf-8") as file:
for line in file:
training_data.append(line.strip())
# Prepare the Tokenizer
tokenizer = Tokenizer()
tokenizer.fit_on_texts(training_data)
total_words = len(tokenizer.word_index) + 1
# Convert text to sequences
input_sequences = []
for line in training_data:
token_list = tokenizer.texts_to_sequences([line])[0]
for i in range(1, len(token_list)):
n_gram_sequence = token_list[:i+1]
input_sequences.append(n_gram_sequence)
# Pad sequences for equal length
max_sequence_len = max([len(x) for x in input_sequences])
input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre')
# Create predictors and labels
predictors, labels = input_sequences[:, :-1], input_sequences[:, -1]
labels = tf.keras.utils.to_categorical(labels, num_classes=total_words)
model = False
# Build the model
def build_model():
model = Sequential()
model.add(Embedding(total_words, 10, input_length=max_sequence_len-1))
model.add(LSTM(150))
model.add(Dense(total_words, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
# Train the model
def train_model(model):
model.fit(predictors, labels, epochs=100, verbose=1)
return model
# Load a pre trained model
def load_model():
model = tf.keras.models.load_model("_my_model")
return model
# Save the model
def save_model(model):
model.save("_my_model")
model = build_model()
#model = load_model()
model = train_model(model)
save_model(model)
model = load_model()
# Generate text using the trained model
seed_text = "How to wash "
next_words = 128
for _ in range(next_words):
token_list = tokenizer.texts_to_sequences([seed_text])[0]
token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')
predicted_probs = model.predict(token_list, verbose=0)[0]
predicted = tf.argmax(predicted_probs, axis=-1)
output_word = ""
for word, index in tokenizer.word_index.items():
if index == predicted:
output_word = word
break
seed_text += " " + output_word
print(seed_text)
=====Text classification example=====
import tensorflow as tf
from tensorflow import keras
import numpy as np
positive_sentences = ["Dieses Buch ist grossartig", "Ich liebe diesen Film", "Das Essen war koestlich", "Kann ich nur empfehlen",
"Wirklich ein Erlebnis", "Gerne kommen wir wieder", "Das war super", "Das ist toll gewesen", "Das war toll", "Das hat richtig Spass gemacht",
"So muss das sein", "Ein wirklich perfekter Abend", "Immer gutes Essen", "Immer gute Musik"]
negative_sentences = ["Der Film war schrecklich", "Das Buch war langweilig", "Also das war wirklich nicht gut", "Das muss echt besser sein",
"Das Essen war schlecht", "Die sehen mich nie wieder", "Das ist ein Witz", "hier komme ich nicht mehr hin", "Das haette ich mir sparen koennen", "So ein Unsinn",
"Besser zu hause bleiben", "Nicht zu empfehlen", "Davon rate ich ab", "Das hat nicht funktioniert", "Das war ein Fehler", "Das ist ein Reinfall"]
# Labels for positive and negative sentences
positive_labels = np.ones(len(positive_sentences))
negative_labels = np.zeros(len(negative_sentences))
# merge data
sentences = positive_sentences + negative_sentences
labels = np.concatenate([positive_labels, negative_labels])
# create tokens and vectorize data
tokenizer = keras.preprocessing.text.Tokenizer()
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_index
sequences = tokenizer.texts_to_sequences(sentences)
padded_sequences = keras.preprocessing.sequence.pad_sequences(sequences)
# create model
model = keras.models.Sequential([
keras.layers.Embedding(len(word_index) + 1, 16, input_length=padded_sequences.shape[1]),
keras.layers.GlobalAveragePooling1D(),
keras.layers.Dense(16, activation='relu'),
keras.layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# train model
model.fit(padded_sequences, labels, epochs=100)
# prediction
def evaluate_sentence(sentence):
sequence = tokenizer.texts_to_sequences([sentence])
padded_sequence = keras.preprocessing.sequence.pad_sequences(sequence, maxlen=padded_sequences.shape[1])
prediction = model.predict(padded_sequence)[0][0]
if prediction >= 0.5:
return "positiv"
else:
return "negativ"
# examples
test_sentence_1 = "Da komme ich nicht mehr hin"
test_sentence_2 = "Da habe ich schon bessere gesehen, das war nichts"
test_sentence_3 = "Mir hat es gefallen"
print(evaluate_sentence(test_sentence_1))
print(evaluate_sentence(test_sentence_2))
print(evaluate_sentence(test_sentence_3))
=====Mini GPT=====
Hier wird das Model überschrieben!
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
def train_model(text):
tokenizer = keras.preprocessing.text.Tokenizer()
tokenizer.fit_on_texts([text])
total_words = len(tokenizer.word_index) + 1
input_sequences = []
for line in text.split("\n"):
token_list = tokenizer.texts_to_sequences([line])[0]
for i in range(1, len(token_list)):
n_gram_sequence = token_list[:i+1]
input_sequences.append(n_gram_sequence)
max_sequence_len = max([len(x) for x in input_sequences])
input_sequences = keras.preprocessing.sequence.pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre')
xs = input_sequences[:, :-1]
labels = input_sequences[:, -1]
ys = tf.keras.utils.to_categorical(labels, num_classes=total_words)
model = keras.models.Sequential()
model.add(layers.Embedding(total_words, 100, input_length=max_sequence_len-1))
model.add(layers.Bidirectional(layers.LSTM(150, return_sequences=True)))
model.add(layers.Dropout(0.2))
model.add(layers.LSTM(100))
model.add(layers.Dense(total_words, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(xs, ys, epochs=20, verbose=1)
return model, tokenizer, max_sequence_len
def generate_text(model, tokenizer, max_sequence_len, seed_text, next_words):
for _ in range(next_words):
token_list = tokenizer.texts_to_sequences([seed_text])[0]
token_list = keras.preprocessing.sequence.pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')
predicted = model.predict(token_list, verbose=0)
predicted_word_index = tf.argmax(predicted, axis=-1).numpy()[0]
output_word = ""
for word, index in tokenizer.word_index.items():
if index == predicted_word_index:
output_word = word
break
seed_text += " " + output_word
return seed_text
def save_model(model, filename):
model.save(filename)
def load_model(filename):
return keras.models.load_model(filename)
def train_with_new_text(model, tokenizer, max_sequence_len, new_text):
new_tokenizer = keras.preprocessing.text.Tokenizer()
new_tokenizer.fit_on_texts([new_text])
new_total_words = len(new_tokenizer.word_index) + 1
new_input_sequences = []
for line in new_text.split("\n"):
new_token_list = new_tokenizer.texts_to_sequences([line])[0]
for i in range(1, len(new_token_list)):
new_n_gram_sequence = new_token_list[:i+1]
new_input_sequences.append(new_n_gram_sequence)
new_max_sequence_len = max_sequence_len
new_input_sequences = keras.preprocessing.sequence.pad_sequences(new_input_sequences, maxlen=new_max_sequence_len, padding='pre')
new_xs = new_input_sequences[:, :-1]
new_labels = new_input_sequences[:, -1]
new_ys = tf.keras.utils.to_categorical(new_labels, num_classes=new_total_words)
new_model = keras.models.Sequential()
new_model.add(layers.Embedding(new_total_words, 100, input_length=max_sequence_len-1))
new_model.add(layers.Bidirectional(layers.LSTM(150, return_sequences=True)))
new_model.add(layers.Dropout(0.2))
new_model.add(layers.LSTM(100))
new_model.add(layers.Dense(new_total_words, activation='softmax'))
new_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
new_model.fit(new_xs, new_ys, epochs=20, verbose=1)
# Beispiel-Aufruf
# Training
text = ""
with open("training_data.txt", "r", encoding="utf-8") as file:
for line in file:
text += line.strip() + "\n"
model, tokenizer, max_sequence_len = train_model(text)
# Generieren
seed_text = "Custom prompt"
next_words = 20
generated_text = generate_text(model, tokenizer, max_sequence_len, seed_text, next_words)
print(generated_text)
# Speichern
save_model(model, "text_generator_model.h5")
# Laden und Trainieren mit neuem Text
new_text = ""
with open("new_training_data.txt", "r", encoding="utf-8") as file:
for line in file:
new_text += line.strip() + "\n"
loaded_model = load_model("text_generator_model.h5")
train_with_new_text(loaded_model, tokenizer, max_sequence_len, new_text)
seed_text = "Another custom prompt"
next_words = 20
generated_text = generate_text(model, tokenizer, max_sequence_len, seed_text, next_words)
print(generated_text)
Fine tuning mit ModelCheckpoint
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import numpy as np
from numpy.testing import assert_allclose
from keras.models import Sequential, load_model
from keras.layers import LSTM, Dropout, Dense
from keras.callbacks import ModelCheckpoint
vec_size = 100
n_units = 10
x_train = np.random.rand(500, 10, vec_size)
y_train = np.random.rand(500, vec_size)
model = Sequential()
model.add(LSTM(n_units, input_shape=(None, vec_size), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(n_units, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(n_units))
model.add(Dropout(0.2))
model.add(Dense(vec_size, activation='linear'))
model.compile(loss='mean_squared_error', optimizer='adam')
# define the checkpoint
filepath = "model.h5"
checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=0, save_best_only=True, mode='min')
callbacks_list = [checkpoint]
# fit the model
model.fit(x_train, y_train, epochs=5, batch_size=50, verbose=0, callbacks=callbacks_list)
# load the model
new_model = load_model(filepath)
model.predict(x_train)
new_model.predict(x_train)
# fit the model
checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=0, save_best_only=True, mode='min')
callbacks_list = [checkpoint]
new_model.fit(x_train, y_train, epochs=5, batch_size=50, verbose=0, callbacks=callbacks_list)
try:
assert_allclose(model.predict(x_train), new_model.predict(x_train), 1e-5)
except Exception as e:
print("Message2: " + str(e))
print("The end")
print(model.predict(x_train))
print(new_model.predict(x_train))
new_model.fit(x_train, y_train, epochs=5, batch_size=50, verbose=0, callbacks=callbacks_list)
try:
assert_allclose(model.predict(x_train), new_model.predict(x_train), 1e-5)
except Exception as e:
print("Message3: " + str(e))
print(new_model.predict(x_train))
=====GPT2=====
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import tensorflow as tf
from transformers import GPT2Tokenizer, TFGPT2LMHeadModel
import sys
model_name = "gpt2"
cache_dir = "gpt2-cache"
tokenizer = GPT2Tokenizer.from_pretrained(model_name, cache_dir=cache_dir)
model = TFGPT2LMHeadModel.from_pretrained(model_name, cache_dir=cache_dir, pad_token_id=tokenizer.eos_token_id)
def generate_text(model, tokenizer, start_text, num_tokens):
input_ids = tokenizer.encode(start_text, return_tensors='tf')
output = model.generate(input_ids, max_length=num_tokens, num_return_sequences=1, pad_token_id=tokenizer.eos_token_id, num_beams = 5,no_repeat_ngram_size = 2,early_stopping = True)
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
return generated_text
start_text = sys.argv[1]
num_tokens = 100 # Anzahl der gewnschten Tokens im generierten Text
generated_text = generate_text(model, tokenizer, start_text, num_tokens)
print(generated_text)
====Fine tuning====
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import pandas as pd
import numpy as np
import re
import os
def read_txt(filepath):
with open(filepath, "r", encoding="utf-8") as file:
text = file.read()
return text
def read_dir(path):
text = ""
for filename in os.listdir(path):
file_path = os.path.join(path, filename)
text += read_txt(file_path)
return text
#train_file = "shakespeare.txt"
#text_data = read_txt(train_file)
#text_data = re.sub(r'\n+', '\n', text_data).strip()
from transformers import TextDataset, DataCollatorForLanguageModeling
from transformers import GPT2Tokenizer, GPT2LMHeadModel
from transformers import Trainer, TrainingArguments
def load_dataset(file_path, tokenizer, block_size=128):
dataset = TextDataset(
tokenizer = tokenizer,
file_path = file_path,
block_size = block_size
)
return dataset
def load_data_collator(tokenizer, mlm=False):
data_collator = DataCollatorForLanguageModeling(
tokenizer = tokenizer,
mlm = mlm
)
return data_collator
def train(train_file_path, model_name, output_dir, overwrite_output_dir, per_device_train_batch_size, num_train_epochs, save_steps, cache_dir):
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
train_dataset = load_dataset(train_file_path, tokenizer)
data_collator = load_data_collator(tokenizer)
tokenizer.save_pretrained(output_dir)
model = GPT2LMHeadModel.from_pretrained(model_name, cache_dir = cache_dir)
model.save_pretrained(output_dir)
training_args = TrainingArguments(
output_dir=output_dir,
overwrite_output_dir=overwrite_output_dir,
per_device_train_batch_size=per_device_train_batch_size,
num_train_epochs=num_train_epochs
)
trainer = Trainer(
model=model,
args=training_args,
data_collator=data_collator,
train_dataset=train_dataset
)
trainer.train()
trainer.save_model()
train_file_path = "shakespeare.txt"
model_name = "gpt2-medium"
output_dir = "gpt-medium-finetuned"
overwrite_output_dir = False
per_device_train_batch_size = 8
num_train_epochs = 10.0
save_steps = 50000
cache_dir = "gpt-medium-cache"
train(
train_file_path=train_file_path,
model_name=model_name,
output_dir=output_dir,
overwrite_output_dir=overwrite_output_dir,
per_device_train_batch_size=per_device_train_batch_size,
num_train_epochs=num_train_epochs,
save_steps=save_steps,
cache_dir=cache_dir
)
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
from transformers import PreTrainedTokenizerFast, GPT2LMHeadModel, GPT2TokenizerFast, GPT2Tokenizer
import sys
def load_model(model_path):
model = GPT2LMHeadModel.from_pretrained(model_path)
return model
def load_tokenizer(tokenizer_path):
tokenizer = GPT2Tokenizer.from_pretrained(tokenizer_path)
return tokenizer
def generate_text(model_path, sequence, max_length):
model = load_model(model_path)
tokenizer = load_tokenizer(model_path)
ids = tokenizer.encode(f'{sequence}', return_tensors='pt')
final_outputs = model.generate(
ids,
do_sample=True,
max_length=max_length,
pad_token_id=model.config.eos_token_id,
top_k=50,
top_p=0.95,
num_beams = 5,
no_repeat_ngram_size = 2,
early_stopping = True
)
print(tokenizer.decode(final_outputs[0], skip_special_tokens=True))
model1_path = "gpt-medium-finetuned"
sequence1 = sys.argv[1]
max_len = int(sys.argv[2])
generate_text(model1_path, sequence1, max_len)
=====Links=====
* [[http://jrmeyer.github.io/machinelearning/2016/02/01/TensorFlow-Tutorial.html|Tensorflow Email Classification]]