Spaces:
Sleeping
Sleeping
import gradio as gr | |
import numpy as np | |
import networkx as nx | |
import matplotlib.pyplot as plt | |
import pandas as pd | |
from sklearn.metrics import log_loss | |
from io import BytesIO | |
from PIL import Image | |
def sigmoid(z): | |
return 1.0/(1.0+ np.exp(-z)) | |
def sigmoid_prime(z): | |
return sigmoid(z)*(1.0-sigmoid(z)) | |
def cross_entropy(weights,bias,X_train,y_train): | |
return log_loss(y_train,[feedforward(X_train[k],bias,weights).reshape(-1,) for k in range(len(X_train))],labels=[1.0,0.0]) | |
def feedforward(x,bias,weights): | |
for b,w in zip(bias,weights): | |
x=sigmoid(np.dot(w,x)+b) | |
return x | |
def update_mini_batch(weights,bias,X_mini,y_mini,eta): | |
derivative_b=[np.zeros(b.shape) for b in bias] | |
derivative_w=[np.zeros(w.shape) for w in weights] | |
for i in range(len(y_mini)): | |
x_mi=X_mini[i] | |
y_mi=y_mini[i] | |
derivative_b_sample, derivative_w_sample=backprop(weights,bias,x_mi,y_mi) | |
for j in range(len(derivative_b)): | |
derivative_b[j]+=derivative_b_sample[j] | |
derivative_w[j]+=derivative_w_sample[j] | |
for i in range(len(weights)): | |
weights[i]-=(eta/len(y_mini))*derivative_w[i] | |
bias[i]-=(eta/len(y_mini))*derivative_b[i] | |
return (weights,bias) | |
input_neurons = 10 | |
hidden_neurons = 2 | |
output_neurons = 1 | |
weights_input_hidden = np.array([[ -7.22321659, -11.15471068, -30.00484398, 13.08466657, | |
-15.0766471 , 14.81645208, -13.11446119, 29.95009006, | |
10.9668077 , 7.11140227], | |
[ 7.48857155, 11.20225432, 30.07325613, -13.1441687 , | |
15.08768163, -15.10126949, 13.11893102, -30.1417512 , | |
-11.18918466, -7.44585737]]).T | |
biases_hidden = np.array([[1.62426502], | |
[1.63230885]]).reshape(-1) | |
weights_hidden_output = np.array([[23.73266741, 23.84381938]]).T | |
bias_output = np.array([[-35.80629779]]).reshape(-1) | |
def visualize_neural(a): | |
input_values = [int(i) for i in list(a)] | |
hidden_layer_input = np.dot(input_values, weights_input_hidden) + biases_hidden | |
hidden_layer_output = np.array([round(i,3) for i in sigmoid(hidden_layer_input)]) | |
output_layer_input = np.dot(hidden_layer_output, weights_hidden_output) + bias_output | |
output = sigmoid(output_layer_input) | |
G = nx.DiGraph() | |
for i in range(input_neurons): | |
G.add_node(f'{i}={input_values[i]}', pos=(0, i)) | |
for i in range(hidden_neurons): | |
G.add_node(f'{i},f({np.round(hidden_layer_input[i],3)})={np.round(hidden_layer_output[i],3)}', pos=(1, 0.5*(input_neurons-1-hidden_neurons)+i)) | |
for i in range(output_neurons): | |
G.add_node(f'Output {i+1}={output}', pos=(2, 4)) | |
for i in range(input_neurons): | |
for j in range(hidden_neurons): | |
weight = weights_input_hidden[i][j] | |
G.add_edge(f'{i}={input_values[i]}', f'{j},f({np.round(hidden_layer_input[j],3)})={np.round(hidden_layer_output[j],3)}', weight=f"W[{j,i}]={weight}") | |
for i in range(hidden_neurons): | |
for j in range(output_neurons): | |
weight = weights_hidden_output[i][j] | |
G.add_edge(f'{i},f({np.round(hidden_layer_input[i],3)})={np.round(hidden_layer_output[i],3)}', f'Output {j+1}={output}', weight=weight) | |
pos = nx.get_node_attributes(G, 'pos') | |
plt.figure(figsize=(10, 5),dpi=200) | |
nx.draw(G, pos, with_labels=True, node_size=1e+3, node_color='lightblue', font_size=3, font_weight='bold') | |
labels = nx.get_edge_attributes(G, 'weight') | |
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels,font_size=3,label_pos=0.8) | |
plt.title('Neural Network Graph') | |
buffer = BytesIO() | |
plt.savefig(buffer, format='png') # Save the plot to the buffer in PNG format | |
buffer.seek(0) | |
image = Image.open(buffer) | |
plt.close() # Close the plot to prevent displaying it | |
# Convert the PIL image to a numpy array | |
image_array = np.array(image) | |
if output<0.5: | |
return image_array,"Non palindrom" | |
else: | |
return image_array,"palindrom" | |
title="Implementation of Backpropagation and Training a Palindrome Network" | |
demo = gr.Interface(fn=visualize_neural, inputs=gr.Textbox(label="input a binary string of length 10"), outputs=[gr.Image(label="Neural network visualization"),gr.Textbox(label="output")],title=title) | |
demo.launch(share=True) |