【问题标题】:Strange result Neural network Python奇怪的结果 神经网络 Python
【发布时间】:2019-05-13 21:34:27
【问题描述】:

我在这里关注了一篇文章:TowardsDataScience

我写了关于网络的数学方程式,一切都说得通。

然而,写完代码后,结果很奇怪,好像总是在预测同一个类...

我花了很多时间,改变了很多东西,但我仍然无法理解我做错了什么。

代码如下:

# coding: utf-8

from mnist import MNIST
import numpy as np
import math
import os
import pdb


DATASETS_PREFIX    = '../Datasets/MNIST'
mndata             = MNIST(DATASETS_PREFIX)
TRAINING_IMAGES, TRAINING_LABELS  = mndata.load_training()
TESTING_IMAGES , TESTING_LABELS   = mndata.load_testing()

### UTILS

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def d_sigmoid(x):
    return x.T * (1 - x)
    #return np.dot(x.T, 1.0 - x)

def softmax(x):
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum()

def d_softmax(x):
    #This function has not yet been tested.
    return x.T * (1 - x)

def tanh(x):
    return np.tanh(x)

def d_tanh(x):
    return 1 - x.T * x

def normalize(image):
    return image / (255.0 * 0.99 + 0.01)

### !UTILS

class NeuralNetwork(object):
    """
    This is a 3-layer neural network (1 hidden layer).
    @_input   : input layer
    @_weights1: weights between input layer and hidden layer  (matrix shape (input.shape[1], 4))
    @_weights2: weights between hidden layer and output layer (matrix shape (4, 1))
    @_y       : output
    @_output  : computed output
    @_alpha   : learning rate
    """
    def __init__(self, xshape, yshape):
        self._neurones_nb = 20
        self._input       = None
        self._weights1    = np.random.randn(xshape, self._neurones_nb)
        self._weights2    = np.random.randn(self._neurones_nb, yshape)
        self._y           = np.mat(np.zeros(yshape))
        self._output      = np.mat(np.zeros(yshape))
        self._alpha1      = 0.1
        self._alpha2      = 0.1
        self._function    = sigmoid
        self._derivative  = d_sigmoid
        self._epoch       = 1

    def Train(self, xs, ys):
        for j in range(self._epoch):
            for i in range(len(xs)):
                self._input = normalize(np.mat(xs[i]))
                self._y[0, ys[i]] = 1
                self.feedforward()
                self.backpropagation()
                self._y[0, ys[i]] = 0

    def Predict(self, image):
        self._input = normalize(image)
        out = self.feedforward()
        return out

    def feedforward(self):
        self._layer1 = self._function(np.dot(self._input, self._weights1))
        self._output = self._function(np.dot(self._layer1, self._weights2))
        return self._output

    def backpropagation(self):
        d_weights2 = np.dot(
            self._layer1.T,
            2 * (self._y - self._output) * self._derivative(self._output)
        )
        d_weights1 = np.dot(
            self._input.T,
            np.dot(
                2 * (self._y - self._output) * self._derivative(self._output),
                self._weights2.T
            ) * self._derivative(self._layer1)
        )
        self._weights1 += self._alpha1 * d_weights1
        self._weights2 += self._alpha2 * d_weights2

if __name__ == '__main__':
    neural_network = NeuralNetwork(len(TRAINING_IMAGES[0]), 10)
    print('* training neural network')
    neural_network.Train(TRAINING_IMAGES, TRAINING_LABELS)
    print('* testing neural network')
    count = 0
    for i in range(len(TESTING_IMAGES)):
        image       = np.mat(TESTING_IMAGES[i])
        expected    = TESTING_LABELS[i]
        prediction  = neural_network.Predict(image)
        if i % 100 == 0: print(expected, prediction)
    #print(f'* results: {count} / {len(TESTING_IMAGES)}')

感谢您的帮助,非常感谢。

朱利安

【问题讨论】:

  • 我也尝试了不同的归一化函数(图像/255),结果相同。
  • 多少个纪元?隐藏层数是多少?每层的神经元数量?
  • 这一切都在我认为的代码中。 1 epoch 1 个隐藏层 20 个隐藏层神经元 784 个输入层 (MNIST) 神经元 10 个输出层神经元

标签: python numpy machine-learning neural-network backpropagation


【解决方案1】:

好吧,我在实施中没有看到任何错误,因此考虑到您的网络,这可以通过做两件事来改进:

  • 一个纪元是不够的。好像不是全部!您需要多次传递您的数据(最少是 10 次,平均可能是 100 次左右,这可能会达到 5000 或更多)

  • 你的网络是一个浅层网络,例如真的很简单。要检测困难的事物(如图像),您可以实现 CNN(卷积神经网络)或首先尝试加深网络并使其复杂化

=> 尝试添加层(3、4、5 等),然后根据输入的大小将神经元添加到每个层(50、60 等)。您仍然可以达到 800、900 或更多。

【讨论】:

  • 感谢您的回答。按照您的建议,我正在实施更多层,我会看看它提供了什么。但我觉得即使是一个简单的感知器也应该给出一些有趣的,也许不是惊人的表现,但仍然是一些东西。我的意思是,即使是贝叶斯算法也可以正确分类 MNIST,我不应该去深度学习技术做它。你明白我的意思了吗?
  • 我明白你的意思。你如何监控你的结果?例如。你的指标是什么?比如你的准确度分数、混淆矩阵等?
  • 准确率得分是。我还显示每个班级的分数。奇怪的是,它对每张图片都给出了大致相同的分数。
  • 你的意思是 0 级 70%,1 级 71% 等等...?我看不出有什么奇怪的。您的总体准确度是多少?
  • 我刚刚注意到的另一个奇怪的事情是你应该使用 softmax(用于多类)而不是 sigmoid(仅用于两个类)
猜你喜欢
  • 2014-01-27
  • 2016-08-24
  • 2012-10-13
  • 2018-05-24
  • 2018-01-05
  • 2017-02-21
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多