27

少し前に、私は機械学習の冒険を始めました (私の研究の最後の 2 年間)。私は多くの本を読み、ニューラル ネットワークを除く機械学習アルゴリズムを使って多くのコードを書きましたが、これは私の範囲外でした。私はこのトピックに非常に興味がありますが、大きな問題があります: 私が読んだすべての本には、2 つの主要な問題があります。

  1. 数式のトーンが含まれています。講義の後、私はそれらに非常に精通しており、手で、紙の上で計算を行うことができます.
  2. いくつかの複雑なコンテキスト (インターネット ショップの販売率の調査など) に埋め込まれた大きな例が含まれており、ニューラル ネットワークの実装に入るには、コンテキストを再現するために多くのコードを記述する必要があります。欠けているもの - 多くの文脈や方程式を使わないシンプルで直接的な実装。

多層認識 (ニューラル ネットワーク) の単純な実装をどこで見つけることができるか教えてください。理論的な知識は必要ありませんし、コンテキストに埋め込まれた例も必要ありません。時間と労力を節約するために、いくつかのスクリプト言語を好みます。これまでの作業の 99% は Python で行われていました。

以下は、私が以前に読んだ本のリストです (そして、私が欲しいものを見つけられませんでした):

  1. 実際の機械学習
  2. 集合知のプログラミング
  3. 機械学習: アルゴリズムの視点
  4. Java でのニューラル ネットワークの紹介
  5. C# でのニューラル ネットワークの概要
4

5 に答える 5

33

簡単な実装

のクラスを使用した読み取り可能な実装を次に示しPythonます。この実装では、効率と分かりやすさを犠牲にしています。

    import math
    import random

    BIAS = -1

    """
    To view the structure of the Neural Network, type
    print network_name
    """

    class Neuron:
        def __init__(self, n_inputs ):
            self.n_inputs = n_inputs
            self.set_weights( [random.uniform(0,1) for x in range(0,n_inputs+1)] ) # +1 for bias weight

        def sum(self, inputs ):
            # Does not include the bias
            return sum(val*self.weights[i] for i,val in enumerate(inputs))

        def set_weights(self, weights ):
            self.weights = weights

        def __str__(self):
            return 'Weights: %s, Bias: %s' % ( str(self.weights[:-1]),str(self.weights[-1]) )

    class NeuronLayer:
        def __init__(self, n_neurons, n_inputs):
            self.n_neurons = n_neurons
            self.neurons = [Neuron( n_inputs ) for _ in range(0,self.n_neurons)]

        def __str__(self):
            return 'Layer:\n\t'+'\n\t'.join([str(neuron) for neuron in self.neurons])+''

    class NeuralNetwork:
        def __init__(self, n_inputs, n_outputs, n_neurons_to_hl, n_hidden_layers):
            self.n_inputs = n_inputs
            self.n_outputs = n_outputs
            self.n_hidden_layers = n_hidden_layers
            self.n_neurons_to_hl = n_neurons_to_hl
    
            # Do not touch
            self._create_network()
            self._n_weights = None
            # end

        def _create_network(self):
            if self.n_hidden_layers>0:
                # create the first layer
                self.layers = [NeuronLayer( self.n_neurons_to_hl,self.n_inputs )]
        
                # create hidden layers
                self.layers += [NeuronLayer( self.n_neurons_to_hl,self.n_neurons_to_hl ) for _ in range(0,self.n_hidden_layers)]
        
                # hidden-to-output layer
                self.layers += [NeuronLayer( self.n_outputs,self.n_neurons_to_hl )]
            else:
                # If we don't require hidden layers
                self.layers = [NeuronLayer( self.n_outputs,self.n_inputs )]

        def get_weights(self):
            weights = []
    
            for layer in self.layers:
                for neuron in layer.neurons:
                    weights += neuron.weights
    
            return weights

        @property
        def n_weights(self):
            if not self._n_weights:
                self._n_weights = 0
                for layer in self.layers:
                    for neuron in layer.neurons:
                        self._n_weights += neuron.n_inputs+1 # +1 for bias weight
            return self._n_weights

        def set_weights(self, weights ):
            assert len(weights)==self.n_weights, "Incorrect amount of weights."
    
            stop = 0
            for layer in self.layers:
                for neuron in layer.neurons:
                    start, stop = stop, stop+(neuron.n_inputs+1)
                    neuron.set_weights( weights[start:stop] )
            return self

        def update(self, inputs ):
            assert len(inputs)==self.n_inputs, "Incorrect amount of inputs."
    
            for layer in self.layers:
                outputs = []
                for neuron in layer.neurons:
                    tot = neuron.sum(inputs) + neuron.weights[-1]*BIAS
                    outputs.append( self.sigmoid(tot) )
                inputs = outputs   
            return outputs

        def sigmoid(self, activation,response=1 ):
            # the activation function
            try:
                return 1/(1+math.e**(-activation/response))
            except OverflowError:
                return float("inf")

        def __str__(self):
            return '\n'.join([str(i+1)+' '+str(layer) for i,layer in enumerate(self.layers)])

より効率的な実装 (学習あり)

学習 (バックプロパゲーション) を使用したニューラル ネットワークのより効率的な例を探している場合は、こちらのニューラル ネットワーク Github リポジトリを参照してください

于 2013-06-11T16:42:20.287 に答える
7

うーん、これはトリッキーです。私は以前に同じ問題を抱えていましたが、数学がたくさん含まれている良い説明とすぐに使える実装の間に何も見つかりませんでした。

PyBrainのようなすぐに使用できる実装の問題は、詳細が隠されていることです。そのため、ANNの実装方法の学習に関心のある人は、何か他のものを必要としています。このようなソリューションのコードを読むことも、パフォーマンスを向上させるためにヒューリスティックを使用することが多く、初心者がコードを理解するのが難しくなるため、難しい場合があります。

ただし、使用できるリソースがいくつかあります。

http://msdn.microsoft.com/en-us/magazine/jj658979.aspx

http://itee.uq.edu.au/~cogs2010/cmc/chapters/BackProp/

http://www.codeproject.com/Articles/19323/Image-Recognition-with-Neural-Networks

http://freedelta.free.fr/r/php-code-samples/artificial-intelligence-neural-network-backpropagation/

于 2013-03-15T14:36:51.187 に答える
6

numpy を使用してフィードフォワード ニューラル ネットワークを実装する方法の例を次に示します。最初に numpy をインポートし、入力とターゲットの次元を指定します。

import numpy as np

input_dim = 1000
target_dim = 10

ここで、ネットワーク構造を構築します。Bishop の優れた「パターン認識と機械学習」で示唆されているように、numpy 行列の最後の行をバイアス ウェイトと見なし、アクティベーションの最後の列をバイアス ニューロンと見なすことができます。その場合、最初/最後の重み行列の入力/出力次元は 1 大きくする必要があります。

dimensions = [input_dim+1, 500, 500, target_dim+1]

weight_matrices = []
for i in range(len(dimensions)-1):
  weight_matrix = np.ones((dimensions[i], dimensions[i]))
  weight_matrices.append(weight_matrix)

入力が 2 次元の numpy マトリックスに格納され、各行が 1 つのサンプルに対応し、列がサンプルの属性に対応する場合、次のようにネットワークを介して伝播できます: (ロジスティック シグモイド関数を活性化関数として仮定)

def activate_network(inputs):
  activations = [] # we store the activations for each layer here
  a = np.ones((inputs.shape[0], inputs.shape[1]+1)) #add the bias to the inputs
  a[:,:-1] = inputs

  for w in weight_matrices:
    x = a.dot(w) # sum of weighted inputs
    a = 1. / (1. - np.exp(-x)) # apply logistic sigmoid activation
    a[:,-1] = 1. # bias for the next layer.
    activations.append(a)

  return activations

の最後の要素はactivationsネットワークの出力になりますが、注意してください。バイアス用の追加の列を省略する必要があるため、出力はactivations[-1][:,:-1].

ネットワークをトレーニングするには、バックプロパゲーションを実装する必要があります。これには、数行の追加コードが必要です。activations基本的に、最後の要素から最初の要素までループする必要があります。各逆伝播ステップの前に、各レイヤーのエラー信号のバイアス列を必ずゼロに設定してください。

于 2013-03-23T20:36:50.030 に答える
5

これは、ネイティブ python のbackpropアルゴリズムです。

于 2013-04-09T10:04:26.577 に答える