import network as nw import importlib import numpy as np importlib.reload(nw) class MaterialNetwork(nw.Network): def __init__(self): super().__init__() def fit(self, cost_train, y_train, epochs, learning_rate, amount_train): result = [] samples = len(cost_train) # Train epoch times for i in range(epochs): err = 0 # train for all samples for j in range(samples): cost_input = cost_train[j] amount_input = amount_train[j] output = None # predict data at all layer for layer in self.layers: output = layer.forward_propagation(cost_input, amount_input) # output as input of next layer cost_input = output # Find loss for display err += self.loss(y_train[j], output) # Find Error of output dE/dY using derivation of MSE error = self.loss_prime(y_train[j], output) # Update Weight for next data # By find gradient of weight in each layer and update weight = [] for layer in reversed(self.layers): error = layer.backward_propagation(error, learning_rate) weight.append(layer.get_weight()) # Find Average Error per sample err /= samples print("Epoch %d/%d calculate with error = %f" % (i + 1, epochs, err)) result.append({"epoch": i + 1, "error": err}) self.weight_list = np.append(self.weight_list, [weight]) return result def fit_on_sample(self, cost_input, y_train, learning_rate, amount_input): err = 0 output = None # predict data at all layer for layer in self.layers: output = layer.forward_propagation(cost_input, amount_input) # output as input of next layer cost_input = output # Find loss for display err += self.loss(y_train, output) # Find Error of output dE/dY using derivation of MSE error = self.loss_prime(y_train, output) # Update Weight for next data # By find gradient of weight in each layer and update weight = [] for layer in reversed(self.layers): error = layer.backward_propagation(error, learning_rate) weight.append(layer.get_weight()) # print(f'Epoch calculate with error = {err}') self.weight_list = np.append(self.weight_list, [weight]) return (output, err) def get_weights(self): result = [] for layer in self.layers: result.append(layer.get_weight()) return result def predict_sample(self, cost_input, amount_input): output = None # predict data at all layer for layer in self.layers: output = layer.forward_propagation(cost_input, amount_input) # output as input of next layer first_input = output weight = layer.get_weight() self.weight_list = np.append(self.weight_list, [weight]) return output def predict(self, cost_input, amount_input): output = None # predict data at all layer for layer in self.layers: output = layer.predict(cost_input, amount_input) # output as input of next layer first_input = output return output def check_type(self, input_name): if input_name == "material": return True print(f"You go to wrong class this is Material not {input_name}") return False