首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MNIST神经网络精度在10%左右

MNIST神经网络精度在10%左右
EN

Stack Overflow用户
提问于 2022-07-12 17:54:11
回答 1查看 152关注 0票数 -1

嗨,我一直在研究一个神经网络来处理MNIST数据集,但是当我运行代码时,精度开始提高,但最终导致了0.098的精度,在计算SoftMax值时,我也遇到了exp中的溢出错误。我尝试过调试我的代码,但我不知道我哪里出错了。如果有人能指出正确的方向,这将是很棒的,如果你找不到一个错误,你能给我任何技巧的提示,尝试调试这一点。提前谢谢。

代码语言:javascript
复制
import numpy as np
import pandas as pd
df = pd.read_csv('../input/digit-recognizer/train.csv')
data = np.array(df.values)
data = data.T
data
Y = data[0,:]
X = data[1:,:]
Y_train = Y[:41000]
X_train = X[:,:41000]
X_train = X_train/255
Y_val = Y[41000:]
X_val = X[:,41000:]
X_val = X_val/255
print(np.max(X_train))
class NeuralNetwork:
    def __init__(self, n_in, n_out):
        self.w1, self.b1 = self.Generate_Weights_Biases(10,784)
        self.w2, self.b2 = self.Generate_Weights_Biases(10,10)
    def Generate_Weights_Biases(self, n_in, n_out):
        weights = 0.01*np.random.randn(n_in, n_out)
        biases = np.zeros((n_in,1))
        return weights, biases
    def forward(self, X):
        self.Z1 = self.w1.dot(X) + self.b1
        self.a1 = self.ReLu(self.Z1)
        self.z2 = self.w2.dot(self.a1) + self.b2
        y_pred = self.Softmax(self.z2)
        return y_pred
    def ReLu(self, Z):
        return np.maximum(Z,0)
    def Softmax(self, Z):
        #exponentials = np.exp(Z)
        #sumexp = np.sum(np.exp(Z), axis=0) 
        #print(Z)
        return np.exp(Z)/np.sum(np.exp(Z))
        
    def ReLu_Derv(self, x):
        return np.greaterthan(x, 0).astype(int)
    def One_hot_encoding(self, Y):
        one_hot = np.zeros((Y.size, 10))
        rows = np.arange(Y.size)
        one_hot[rows, Y] = 1
        one_hot = one_hot.T
        return one_hot
    def Get_predictions(self, y_pred):
        return np.argmax(y_pred, 0)
    def accuracy(self, pred, Y):
        return np.sum(pred == Y)/Y.size
    def BackPropagation(self, X, Y, y_pred, lr=0.01):
        m = Y.size
        one_hot_y = self.One_hot_encoding(Y)
        e2 = y_pred - one_hot_y
        derW2 = (1/m)* e2.dot(self.a1.T)
        derB2 =(1/m) * e2
        #derB2 = derB2.reshape(10,1)
        e1 = self.w2.T.dot(e2) * self.ReLu(self.a1)
        derW1 = (1/m) * e1.dot(X.T)
        derB1 = (1/m) * e1
        #derB1 = derB1.reshape(10,1)
        self.w1 = self.w1 - lr*derW1
        self.b1 = self.b1 - lr*np.sum(derB1, axis=1, keepdims=True)
        self.w2 = self.w2 - lr*derW2
        self.b2 = self.b2 - lr*np.sum(derB2, axis=1, keepdims=True)
    def train(self, X, Y, epochs = 1000):
        for i in range(epochs):
            y_pred = self.forward(X)
            predict = self.Get_predictions(y_pred)
            accuracy = self.accuracy(predict, Y)
            print(accuracy)
            self.BackPropagation(X, Y, y_pred)
        return self.w1, self.b1, self.w2, self.b2
    
NN = NeuralNetwork(X_train, Y_train)
w1,b1,w2,b2 = NN.train(X_train,Y_train)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-12 20:49:34

我发现了以下错误:

  1. 您的softmax实现不工作,因为巨大的数值错误,您得到的指数可能很大的数字,以获得0到1之间的东西。此外,您忘了在分母中指定求和轴。这是一个工作的implementation:

代码语言:javascript
复制
    def Softmax(self, Z):
        e = np.exp(Z - Z.max(axis=0, keepdims=True))
        return e/e.sum(axis=0, keepdims=True)

(在这里和下面,我跳过在这个上下文中不重要的编码风格的注释。就像这样,这应该是类方法或独立函数等等)

  1. 您的ReLu派生实现对我根本不起作用。也许我有一个不同的numpy版本。这个工作:

代码语言:javascript
复制
    def ReLu_Derv(self, x):
        return (x > 0).astype(int)

需要在BackPropagation中实际使用此实现的

代码语言:javascript
复制
        e1 = self.w2.T.dot(e2) * self.ReLu_Derv(self.a1)

通过这些修改,我在使用LR=0.1进行100次迭代后,获得了91.0%的准确率。我使用以下代码从Keras加载了MNIST:

代码语言:javascript
复制
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
X = train_images.reshape(-1, 28*28).T
Y = train_labels
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72956518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档