Compare commits

..

No commits in common. "main" and "main" have entirely different histories.
main ... main

1 changed files with 27 additions and 23 deletions

View File

@ -6,37 +6,43 @@ import matplotlib.pyplot as plt
def load_data(): def load_data():
df_orig_train = pd.read_csv('uebungen/aufgabe3/mnist.csv') df_orig_train = pd.read_csv('uebungen/aufgabe3/mnist.csv')
df_digits = df_orig_train.drop('label', axis=1) df_digits = df_orig_train.drop('label', axis=1)
return df_digits.to_numpy() return df_digits.to_numpy()
mnist = load_data() mnist = load_data()
def sigmoid(x): def sigmoid(x):
return 1.0 / (1.0 + np.exp(-x)) # Sigmoidfunktion return 1.0 / (1.0 + np.exp(-x)) # Sigmoidfunktion
class RBM: class RBM:
def __init__(self, visible_size: int, hidden_size: int, learnrate: float = 0.1): def __init__(self, visible_size: int, hidden_size: int, learnrate: float = 0.1, epochs: int = 20):
"""__init__ Initialisiere der RBM. """__init__ Initialisiere der RBM.
Args: Args:
visible_size (int): anzahl neuronen sichtbare schicht visible_size (int): anzahl neuronen sichtbare schicht
hidden_size (int): anzahl neuronen sichtbare schicht hidden_size (int): anzahl neuronen sichtbare schicht
learnrate (float, optional): learnrate eta in [0;1]. Default als 0.1. learnrate (float, optional): learnrate eta in [0;1]. Default als 0.1.
epochs (int, optional): training epochs. Defaults als 20.
""" """
self.learnrate = learnrate self.learnrate = learnrate
self.visible_size = visible_size self.visible_size = visible_size
self.hidden_size = hidden_size self.hidden_size = hidden_size
self.epochs = epochs
# Initialisieren lernbarer Attribute # Initialisieren lernbarer Attribute
self.weights = np.random.normal(0, 0.01, (self.visible_size, self.hidden_size)) self.weights = np.random.randn(self.visible_size, self.hidden_size)
self.visible_bias = np.zeros(self.visible_size) self.visible_bias = np.zeros(self.visible_size) * 0.1
self.hidden_bias = np.zeros(self.hidden_size) self.hidden_bias = np.zeros(self.hidden_size) * 0.1
def activate(self, v0): def activate(self, v0):
return sigmoid(np.dot(v0, self.weights) + self.hidden_bias) return sigmoid(np.matmul(v0.T, self.weights) + self.hidden_bias)
def reactivate(self, h0): def reactivate(self, h0):
return sigmoid(np.dot(self.weights, h0) + self.visible_bias) return sigmoid(np.matmul(self.weights, h0.T) + self.visible_bias)
def contrastive_divergence(self, v0, h0, v1, h1): def contrastive_divergence(self, v0, h0, v1, h1):
# Gradient # Gradient
@ -51,17 +57,18 @@ class RBM:
self.hidden_bias += self.learnrate * (h0 - h1) self.hidden_bias += self.learnrate * (h0 - h1)
def train(self, v0): def train(self, v0):
# versteckte schichten aktivieren for _ in range(self.epochs):
h0 = self.activate(v0) # versteckte schichten aktivieren
h0 = self.activate(v0)
# Reaktivieren sichtbarer Schichten # Reaktivieren sichtbarer Schichten
v1 = self.reactivate(h0) v1 = self.reactivate(h0)
# Aktivieren nächster versteckter Schicht # Aktivieren nächster versteckter Schicht
h1 = self.activate(v1) h1 = self.activate(v1)
# Gewichte anpassen # Gewichte anpassen
self.contrastive_divergence(v0, h0, v1, h1) self.contrastive_divergence(v0, h0, v1, h1)
def run(self, v0): def run(self, v0):
# Aktivieren der Schichten # Aktivieren der Schichten
@ -70,16 +77,13 @@ class RBM:
return h0, v1 return h0, v1
training_epochs = 20
rbm = RBM(28 ** 2, 100, 0.02)
for epoch in range(training_epochs): rbm = RBM(28 ** 2, 100, 0.2, epochs=2)
np.random.shuffle(mnist)
for i in range(100, 600): # 500 mnist zahlen zwischen 100 und 600 for i in range(100, 600):
number = mnist[i] / 255 # Normalisieren der mnist daten und trainieren
rbm.train(number) number = mnist[i] / 255
if (epoch + 1) % 5 == 0: rbm.train(number)
print(f"Epoch {epoch+1}/{training_epochs} completed.")
# Ergebnisse plotten # Ergebnisse plotten
rows, columns = (9, 9) rows, columns = (9, 9)