# import tensorflow as tfimport numpy as np#import random#import matplotlib.pyplot as pltimport pickleimport structimport os#random.seed(0)def rand(i, j): # random arrayoutput = 0.1 * np.random.randn(i, j) + 0.05#output = (np.random.randint(0,4,(i,j)) - 2) * 0.1 return outputdef unpickle(file):with open(file, 'rb') as fo:dict = pickle.load(fo, encoding='bytes')data = dict[b'data']labels = dict[b'labels']data = data.reshape(10000, 3, 32, 32)labels = np.array(labels)return data, labelsdef RELU(x):return 1 * (x > 0) * x#return 1.0 / (1.0 + np.exp(-x))def RELU_deriv(x):return 1 * (x > 0)#s = RELU(x)#ds = s * (1 - s)#return dsdef softmax(X):return np.exp(X) / np.sum(np.exp(X))def normal(X):var = X.var()mean = np.mean(X)X = (X - mean)/varreturn Xclass NN:def __init__(self, layers, input_size=3072, output_size=10):self.input_size = input_size #input sizeself.output_size = output_size # class numberlayers.insert(0, input_size)layers.append(output_size)yers = layers # all layersself.num_layers = len(layers) # layer numberself.weights = [np.array([])for i in range (0,self.num_layers - 1)]self.z = [np.array([])for i in range (0,self.num_layers)] # output of each layerself.a = [np.array([])for i in range (0,self.num_layers)] # activated output of each layeself.bias = [np.array([]) for i in range(0, self.num_layers - 1)] self.delta = [np.array([]) for i in range(0, self.num_layers - 1)]for i in range(0, self.num_layers - 1):self.weights[i] = rand(yers[i], yers[i + 1])#print(self.weights[i].T.shape)for i in range(0, self.num_layers - 1):self.bias[i] = rand(layers[i + 1], 1)#print(self.bias[i].shape)self.delta[i] = np.zeros((layers[i + 1], 1))def predict(self, inputs):inputs = inputs.reshape(self.input_size, 1)self.a[0] = inputsfor i in range(0, self.num_layers - 1):self.z[i+1] = np.dot(self.weights[i].T, self.a[i]) + self.bias[i]self.a[i+1] = RELU(self.z[i+1]) #1 * h[i+1]# print('weights:', myNN.weights)# print('bias:', myNN.bias)# print('a:', myNN.a)# print('z', myNN.z)return self.a[self.num_layers - 1]def BP(self, inputs_data, inputs_label, rate):outputs = softmax(self.predict(inputs_data))outputs_true = np.zeros((self.output_size, 1))outputs_true[inputs_label][0] = 1#print(inputs_label)outputs_true.reshape(self.output_size, 1)loss = 0for i in range(0, self.output_size):loss -= outputs_true[i][0] * np.log10(outputs[i][0])error = (outputs - outputs_true)#print('error:',error)#print(error)self.delta[self.num_layers-2] = error * RELU_deriv(self.z[self.num_layers - 1])#print((self.z[self.num_layers - 1]))i = self.num_layers - 3while( i>=0 ):self.delta[i] = np.dot(self.weights[i+1], self.delta[i+1]) * RELU_deriv(self.z[i+1])i -= 1# for i in range (0, self.num_layers-1):# print('i::::',self.delta[i])for i in range(0, self.num_layers - 1):#print((np.dot(self.a[i], self.delta[i].T)).shape)self.weights[i] -= (rate * (np.dot(self.a[i], self.delta[i].T)))for i in range(0, self.num_layers - 1):#print(self.delta[i].shape)self.bias[i] -= (rate * self.delta[i])return lossdef save_model(self):output_hal = open("model.pkl", 'wb')str = pickle.dumps(self)output_hal.write(str)output_hal.close()def load_model(self):with open("model.pkl", 'rb') as file:model = pickle.loads(file.read())self.weights = model.weightsself.bias = model.biasreturn selfdef train(myNN):data = []labels = []for b in range(1, 6):f = ('cifar-10-batches-py/data_batch_%d' % (b,))X, Y = unpickle(f)data.append(normal(X))labels.append(Y)#myNN.load_model()loss_save = []for i in range(0,2):print('epoch:', i)loss = 0for i in range(0, 5):for j in range(0, len(data[i])):loss = myNN.BP(data[i][j], labels[i][j], 0.05)if j % 100 == 0:print(loss)myNN.save_model()# loss_save.append(loss)output_loss = open("loss.pkl", 'wb')str = pickle.dumps(loss_save)output_loss.write(str)output_loss.close()def test(myNN):f = ('cifar-10-batches-py/test_batch')data, labels = unpickle(f)data = normal(data)# myNN = NN([800, 400, 100])# myNN.load_model()correct = 0for i in range(0, len(data)):output = myNN.predict(data[i])# print(output,labels[i])max_p = 0ans = 0for j in range(0, myNN.output_size):if output[j][0] > max_p:max_p = output[j][0]ans = j# print(ans,max_p)if ans == labels[i]:correct += 1print(correct / len(data))def load_mnist(path, kind='train'):"""Load MNIST data from `path`"""labels_path = os.path.join(path, '%s-labels.idx1-ubyte' % kind)images_path = os.path.join(path, '%s-images.idx3-ubyte' % kind)with open(labels_path, 'rb') as lbpath:magic, n = struct.unpack('>II', lbpath.read(8))labels = np.fromfile(lbpath, dtype=np.uint8)with open(images_path, 'rb') as imgpath:magic, num, rows, cols = struct.unpack('>IIII', imgpath.read(16))images = np.fromfile(imgpath, dtype=np.uint8).astype(np.float).reshape(len(labels), 784)return normal(images), labelsdef train_1(myNN):data, labels = load_mnist('MNIST_data')loss_save = []for i in range(0, 5):print('epoch:',i)for j in range(0,len(data)):loss = myNN.BP(data[j], labels[j], 0.1)loss_save.append(loss)if j % 100 == 0:print(loss)output_loss = open("loss.pkl", 'wb')str = pickle.dumps(loss_save)output_loss.write(str)output_loss.close()myNN.save_model()def test_1(myNN):data, labels = load_mnist('MNIST_data', 't10k') correct = 0for i in range(0, len(data)):output = myNN.predict(data[i])#print(output,labels[i])max_p = 0ans = 0for j in range(0, myNN.output_size):if output[j][0] > max_p:max_p = output[j][0]ans = j#print(ans,max_p)if ans == labels[i]:correct += 1print(correct / len(data))#myNN = NN([800, 400, 100])# myNN = NN([3], 3, 2)# myNN.BP(np.array([2.0, 5.0, 6.0]), 1, 0.5) # print('--------------')# print('weights:', myNN.weights)# print('bias:', myNN.bias)# print('a:', myNN.a)# print('z', myNN.z)# train(myNN)# test(myNN)myNN = NN([300], 784)train_1(myNN)test_1(myNN)# data, labels = load_mnist('MNIST_data', 't10k') # plt.plot(data[2].reshape(28, 28))# fig = plt.figure()## plt.imshow(data[2].reshape(28, 28))# print(labels[2])# fig.show()#print(dlabels.shape)。