CoolFace
Modelpublic

priyovamr/Priyo_Neuralnetwork

sourceHugging Facemitupdated 2y agoView on Hugging Face
0likes
Model Card

Priyo_Neuralnetwork

class Priyo_NeuralNetwork:

def _init(self, inputsize, hiddensize, outputsize): # Inisialisasi bobot dan bias secara acak self.weights1 = np.random.randn(inputsize, hiddensize) self.bias1 = np.zeros(hiddensize) self.weights2 = np.random.randn(hiddensize, outputsize) self.bias2 = np.zeros(outputsize)

def sigmoid(self, x): clippedx = np.clip(x, -5, 5) # Clip values between -5 and 5 return 1 / (1 + np.exp(-clippedx))

def forward(self, X): # Perhitungan forward propagation self.z1 = np.dot(X, self.weights1) + self.bias1 self.a1 = self.sigmoid(self.z1) self.z2 = np.dot(self.a1, self.weights2) + self.bias2 self.a2 = self.sigmoid(self.z2) return self.a2

def backward(self, X, y, learning_rate): m = X.shape[0] dZ2 = self.a2 - y dW2 = 1/m np.dot(self.a1.T, dZ2) db2 = 1/m np.sum(dZ2, axis=0) dZ1 = np.dot(dZ2, self.weights2.T) (1 - self.a1) self.a1 dW1 = 1/m np.dot(X.T, dZ1) db1 = 1/m np.sum(dZ1, axis=0)

return dW1, db1, dW2, db2

def train(self, X, y, epochs, learning_rate, beta1=0.9, beta2=0.999, epsilon=1e-8): m = X.shape[0]

# Initialize moments for Adam vdw1, vdb1, vdw2, vdb2 = np.zeroslike(self.weights1), np.zeroslike(self.bias1), np.zeroslike(self.weights2), np.zeroslike(self.bias2) sdw1, sdb1, sdw2, sdb2 = np.zeroslike(self.weights1), np.zeroslike(self.bias1), np.zeroslike(self.weights2), np.zeroslike(self.bias2) t = 0

for epoch in range(epochs): self.forward(X) dW1, db1, dW2, db2 = self.backward(X, y, learning_rate)

# Update weights and biases using Adam t += 1

# Update biased first moment estimate vdw1 = beta1 * vdw1 + (1 - beta1) dW1 v_db1 = beta1 vdb1 + (1 - beta1) * db1 vdw2 = beta1 v_dw2 + (1 - beta1) dW2 vdb2 = beta1 * vdb2 + (1 - beta1) * db2

# Update biased second raw moment estimate sdw1 = beta2 * sdw1 + (1 - beta2) np.square(dW1) s_db1 = beta2 sdb1 + (1 - beta2) * np.square(db1) sdw2 = beta2 s_dw2 + (1 - beta2) np.square(dW2) sdb2 = beta2 * sdb2 + (1 - beta2) * np.square(db2)

# Compute bias-corrected first moment estimate vdw1corrected = vdw1 / (1 - beta1**t) vdb1corrected = vdb1 / (1 - beta1t) v_dw2_corrected = v_dw2 / (1 - beta1t) vdb2corrected = v_db2 / (1 - beta1**t)

# Compute bias-corrected second raw moment estimate sdw1corrected = sdw1 / (1 - beta2**t) sdb1corrected = sdb1 / (1 - beta2t) s_dw2_corrected = s_dw2 / (1 - beta2t) sdb2corrected = s_db2 / (1 - beta2**t)

# Update weights and biases self.weights1 -= learningrate * vdw1corrected / (np.sqrt(sdw1corrected) + epsilon) self.bias1 -= learningrate v_db1_corrected / (np.sqrt(s_db1_corrected) + epsilon) self.weights2 -= learning_rate vdw2corrected / (np.sqrt(sdw2corrected) + epsilon) self.bias2 -= learningrate * vdb2corrected / (np.sqrt(sdb2_corrected) + epsilon)

if (epoch+1) % 100 == 0: print(f'Epoch {epoch+1}/{epochs}, loss: {self.loss(y, self.a2)}')

def loss(self, ytrue, ypred): # Fungsi loss (misalnya binary cross-entropy) return -np.mean(ytrue * np.log(ypred) + (1 - ytrue) * np.log(1 - ypred))

def predict(self, X): # Prediksi menggunakan forward propagation ypred = self.forward(X) # Rounding untuk klasifikasi biner ypred = np.round(ypred) return ypred

def accuracy(self, X, y): # Hitung akurasi ypred = self.predict(X) accuracy = np.mean(ypred == y) return accuracy