def __loadMNISTdatabase(self): if not self.__mnistTrainingLoaded: self.UIelements.writeToLog( 'Loading MNIST training database to memory...') self.UIelements.updateProgressBar(1) mnistDatabase = mnist.database() trainingImages, trainingLabels = mnistDatabase.getData( range(60000), 'training') self.trainer.setTrainingSet(trainingImages, trainingLabels) validationImages, validationLabels = mnistDatabase.getData( range(10000), 'test') self.trainer.setValidationSet(validationImages, validationLabels) self.__mnistTrainingLoaded = True self.UIelements.writeToLog('done.\n\n') self.UIelements.updateProgressBar(100) time.sleep(0.2) self.trainingProgressBar['value'] = 0 else: self.UIelements.writeToLog( 'MNIST training database already loaded into memory.\n\n')
def __evaluateNetwork(self): if self.trainer.getNetwork().getStructure() == []: self.__writeToLog( 'ERROR: No network to evaluate, intialise or load from file.\n' ) return self.__writeToLog('Verifying network structure...') if self.verboseLog.get(): self.__writeToLog( '\nNetwork structure: ' + str(self.trainer.getNetwork().getStructure())[1:-1] + '\n') if self.trainer.getNetwork().getStructure( )[0] != 784 or self.trainer.getNetwork().getStructure()[-1] != 10: self.__writeToLog( 'ERROR: Network must have input size of 784 and output size of 10.\n' ) return if self.verboseLog.get(): self.__writeToLog('Verifying network structure...') self.__writeToLog('done.\n\n') if not self.__mnistTestData: self.__writeToLog('Loading MNIST testing database to memory...') self.__mnistTestData = mnist.database(True) self.__writeToLog('done.\n\n') else: self.__writeToLog( 'MNIST testing database already loaded into memory.\n\n') self.__confusionMatrix = np.zeros((10, 10)) self.__writeToLog( 'Evaluating neural network against MNIST testing database...') network = self.trainer.getNetwork() for i in range(10000): if i % 100 == 0: self.__updateEvaluateProgressBar(i / 100) if i % 300 == 0: self.__drawConfusionMatrix(False) testImage, actualLabel = self.__mnistTestData.getData(i, 'test') network.setNeuronActivation(0, range(784), testImage.reshape(784)) network.evaluate() networkPrediction = np.argmax( network.getNeuronActivation(-1, range(10))) self.__confusionMatrix[actualLabel][networkPrediction] += 1 totalCorrectPredictions = 0 for i in range(10): totalCorrectPredictions += self.__confusionMatrix[i][i] networkAccuracy = totalCorrectPredictions / 10000 self.__writeToLog('done.\n\n') self.__updateEvaluateProgressBar(0) self.performanceLabelContent.set( 'Overall network accuracy: {:.2%}'.format(networkAccuracy)) self.__drawConfusionMatrix()
def loadMNIST(self): self.mnistData = mnist.database() self.__mnistLoaded = True
# -*- coding: utf-8 -*- import tkinter as tk from tkinter import filedialog from tkinter import messagebox import math import mnist import neuralnetwork as nn from struct import unpack import numpy as np mnistTestData = mnist.database(loadTestOnly=True) class testingGUI: def __init__(self, master): self.master = master master.title('MNIST Neural Network Test Interface') # drawing canvas area pxSize = 15 self.pixelSize = pxSize self.drawingCanvas = tk.Canvas(width=pxSize * 28, height=pxSize * 28, bg='#000044') self.drawingCanvas.grid(row=0, column=0) self.drawingCanvas.bind('<B1-Motion>', self.__paintOnCanvas) self.drawingCanvas.bind('<Button-1>', self.__paintOnCanvas) self.__addDrawingBackground() self.processDrawingButton = tk.Button(text='Process Digit',