【原创】机器学习从零开始系列连载(7)——人工神经网络-Neural Network
- 2020 年 3 月 4 日
- 筆記
神经网络在维基百科上的定义是:
NN is a network inspired by biological neural networks (the central nervous systems of animals, in particular the brain) which are used to estimate or approximate functions that can depend on a large number of inputs that are generally unknown.(from wikipedia)

神经元
神经元是神经网络和SVM这类模型的基础模型和来源,它是一个具有如下结构的线性模型:

其输出模式为:

示意图如下:

神经网络的常用结构
神经网络由一系列神经元组成,典型的神经网络结构如下:

其中最左边是输入层,包含若干输入神经元,最右边是输出层,包含若干输出神经元,介于输入层和输出层的所有层都叫隐藏层,由于神经元的作用,任何权重的微小变化都会导致输出的微小变化,即这种变化是平滑的。
神经元的各种组合方式得到性质不一的神经网络结构 :

前馈神经网络

反向传播神经网络

循环神经网络

卷积神经网络

自编码器

Google DeepMind 记忆神经网络(用于AlphaGo)
一个简单的神经网络例子
假设随机变量 , 使用3层神经网络拟合该分布:
import numpy as np import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import random import math import keras from keras.models import Sequential from keras.layers.core import Dense,Dropout,Activation def gd(x,m,s): left=1/(math.sqrt(2*math.pi)*s) right=math.exp(-math.pow(x-m,2)/(2*math.pow(s,2))) return left*right def pt(x, y1, y2): if len(x) != len(y1) or len(x) != len(y2): print 'input error.' return plt.figure(num=1, figsize=(20, 6)) plt.title('NN fitting Gaussian distribution', size=14) plt.xlabel('x', size=14) plt.ylabel('y', size=14) plt.plot(x, y1, color='b', linestyle='--', label='Gaussian distribution') plt.plot(x, y2, color='r', linestyle='-', label='NN fitting') plt.legend(loc='upper left') plt.savefig('ann.png', format='png') def ann(train_d, train_l, prd_d): if len(train_d) == 0 or len(train_d) != len(train_l): print 'training data error.' return model = Sequential() model.add(Dense(30, input_dim=1)) model.add(Activation('relu')) model.add(Dense(30)) model.add(Activation('relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='mse', optimizer='rmsprop', metrics=['accuracy']) model.fit(train_d,train_l,batch_size=250, nb_epoch=50, validation_split=0.2) p = model.predict(prd_d,batch_size=250) return p if __name__ == '__main__': x = np.linspace(-5, 5, 10000) idx = random.sample(x, 900) train_d = [] train_l = [] for i in idx: train_d.append(x[i]) train_l.append(gd(x[i],0,1)) y1 = [] y2 = [] for i in x: y1.append(gd(i,0,1)) y2 = ann(np.array(train_d).reshape(len(train_d), 1), np.array(train_l), np.array(x).reshape(len(x), 1)) pt(x, y1, y2.tolist())
