neural-network神经网络入门


备注

技术领域中的神经网络可用于统计回归,数据分类,产品推荐,计算机视觉,自然语言理解和综合,语音到文本,文本到语音以及许多其他复杂任务。神经网络用于机器学习和深度学习,它们与人工智能有关。

神经网络通过示例学习,意味着训练数据输入,数据输出,以后能够在给定类似于训练的输入的情况下预测输出。

存在许多用于编程,训练和使用人工神经网络的框架。以下是一些最着名的机器学习框架:

  • Tensorflow
  • 咖啡
  • Keras
  • Theano
  • 火炬
  • DL4J

Java Encog引擎

Encog是一个易于使用的Java神经网络引擎

public static double XOR_INPUT[][] = { { 0.0, 0.0 }, { 1.0, 0.0 },
        { 0.0, 1.0 }, { 1.0, 1.0 } };

public static double XOR_IDEAL[][] = { { 0.0 }, { 1.0 }, { 1.0 }, { 0.0 } };

public static void main(final String args[]) {
    
    // create a neural network, without using a factory
    BasicNetwork network = new BasicNetwork();
    network.addLayer(new BasicLayer(null,true,2));
    network.addLayer(new BasicLayer(new ActivationSigmoid(),true,3));
    network.addLayer(new BasicLayer(new ActivationSigmoid(),false,1));
    network.getStructure().finalizeStructure();
    network.reset();

    // create training data
    MLDataSet trainingSet = new BasicMLDataSet(XOR_INPUT, XOR_IDEAL);
    
    // train the neural network
    final ResilientPropagation train = new ResilientPropagation(network, trainingSet);

    int epoch = 1;

    do {
        train.iteration();
        System.out.println("Epoch #" + epoch + " Error:" + train.getError());
        epoch++;
    } while(train.getError() > 0.01);
    train.finishTraining();

    // test the neural network
    System.out.println("Neural Network Results:");
    for(MLDataPair pair: trainingSet ) {
        final MLData output = network.compute(pair.getInput());
        System.out.println(pair.getInput().getData(0) + "," + pair.getInput().getData(1)
                + ", actual=" + output.getData(0) + ",ideal=" + pair.getIdeal().getData(0));
    }
    
    Encog.getInstance().shutdown();
}
 

这是神经网络的“Hello World”等价物。

Python Neuron类

import numpy as np #There is a lot of math in neurons, so use numpy to speed things up in python; in other languages, use an efficient array type for that language
import random      #Initial neuron weights should be random

class Neuron:

def __init__(self, nbr_inputs, weight_array = None):
    if (weight_array != None): #you might already have a trained neuron, and wish to recreate it by passing in a weight array h ere
        self.weight_array = weight_array
    else:                      #...but more often, you generate random, small numbers for the input weights.  DO NOT USE ALL ZEROES, or you increase the odds of getting stuck when learning
        self.weight_array = np.zeros(nbr_inputs+1)
        for el in range(nbr_inputs+1): #+1 to account for bias weight
            self.weight_array[el] = random.uniform((-2.4/nbr_inputs),(2.4/nbr_inputs))
    self.nbr_inputs = nbr_inputs

def neuron_output(self,input_array):
    input_array_with_bias = np.insert(input_array,0,-1)
    weighted_sum = np.dot(input_array_with_bias,self.weight_array)
    #Here we are using a hyperbolic tangent output; there are several output functions which could be used, with different max and min values and shapes
    self.output = 1.716 * np.tanh(0.67*weighted_sum)
    return self.output
 

神经网络的典型工作流程

无论使用何种库,训练和使用神经网络的典型工作流程如下:

培训数据

  1. 获取训练数据: X 变量是输入, Y 变量是输出。最简单的方法是学习一个逻辑门,其中X 是一个矢量或两个数字, Y 是一个数字的矢量。通常,输入和输出值是浮点数,因此如果是单词,则可以将每个单词与不同的神经元相关联。您也可以直接使用字符,然后使用较少的神经元而不是保留整个字典。

建筑

  1. 定义神经网络的架构:这是通过指定神经元如何链接在一起以及使用哪种算法训练和改变神经元之间的连接来完成的。例如,处理文本是使用递归神经网络完成的,该神经网络在每个时间步长接收新输入,并且神经元在时间上参考其早期值以进行有效的计算。通常,使用神经元层,它们通常从输入到输出一个堆叠在另一个上。神经元从一个层连接到另一个层的方式变化很大。一些计算机视觉架构使用深度神经网络(堆叠了许多专用层)。

评估

  1. 接下来,通常对尚未直接训练的数据评估神经网络。这包括将数据的X 部分呈现给神经网络,然后将其预测的Y 与真实Y 进行比较。存在许多度量来评估所执行学习的质量。

起色

  1. 通常再次使用神经网络的架构来改善其性能。神经网络必须不是太聪明而不是太愚蠢,因为两种情况都会产生问题。在第一种情况下,神经网络可能对于数据来说太大,完全记住它,并且它可能无法概括为新的看不见的例子。在第二种情况下,如果神经网络太笨(小),它也将无法学习。

真实世界的使用

  1. 在新数据上使用它来预测输出。实际上,神经网络非常有用,自动文本翻译或对文本问题的响应都是很好的例子。在这个阶段用于改进神经网络的技术之一是在线学习,这意味着如果网络能够对他的输出得到建设性的反馈,那么仍然可以继续学习过程。例如,谷歌翻译可能会询问用户对翻译的反馈。