机器学习03:人工神经网络

人工神经元

人工神经元的结构

人工神经元模型如下:

神经元模型

一个人工神经元由两部分组成:

  • 前半部分对前方所有神经元的输出进行线性加权求和.
  • 后半部分是一个激活函数,这个激活函数通常是非线性的.

一个完整的神经元相当于一个非线性回归环节.

激活函数的选择

激活函数为什么是非线性的

神经网络是由多层神经元组成的.若激活函数是线性的,则该层神经元仅仅是对上一层的输出做了一个线性加权,可以与下一层神经元的线性加权环节相合并,没有实际意义.

常见的激活函数

常见的激活函数有三种:

  1. Sigmond函数: 将 ( − ∞ , + ∞ ) (-\infty, +\infty) (,+)映射到 ( 0 , 1 ) (0, 1) (0,1)之间.

    • 优点: 易于求导

    • 缺点:

      1. ∞ \infty 处导数值趋近于0,易产生梯度消失(gradient vanishing)问题.

      2. 输出不是原点对称(zero-centered)的,输出永远大于0,这会导致振荡收敛,收敛速度较慢.

        Sigmond函数的输出恒大于0,这会导致震荡

      3. 幂运算耗时,实际上我们这里需要的只是一个阈值(threshold),并不需要复杂的幂运算.

  2. tanh函数: 将 ( − ∞ , + ∞ ) (-\infty, +\infty) (,+)映射到 ( − 1 , 1 ) (-1, 1) (1,1)之间.

    它的输出是原点对称的,解决了振荡收敛的问题;但仍未解决梯度消失以及复杂幂运算的问题.

  3. Relu函数: 在 ( − ∞ , 0 ) (-\infty, 0) (,0)之间函数值为0,在 ( 0 , + ∞ ) (0, +\infty) (0,+)为输入值.

    在正区间解决了梯度消失的问题;同时其计算也相当简单,只要进行一个简单的判断.

常见激活函数及其导数

神经网络

人工神经网络分为三个部分: 输入层(input layer),隐藏层(hidden layer),输出层(output layer).

人工神经网络的结构

隐藏层的作用

隐藏层可以对数据进行推理演绎,将输入层的特征抽象到另一个空间.可以对原始数据进行升维或降维.

使用代码训练神经网络

Sklearn库的sklearn.neural_network模块提供了一个人工神经网络的简单实现.其MLPClassifier类为神经网络分类器,MLPRegressor为神经网络回归器.下面演示其简单使用.

from sklearn.neural_network import MLPRegressor
import pandas

# 读取数据并分为训练数据和测试数据
concrete_data = pandas.read_csv('./concrete.csv')
train_data = concrete_data.loc[0:927]
test_data = concrete_data.loc[928:1029]
train_X = train_data[['cement', 'slag', 'ash', 'water', 'superplastic', 'coarseagg', 'fineagg', 'age']]
train_Y = train_data['strength']
test_X = test_data[['cement', 'slag', 'ash', 'water', 'superplastic', 'coarseagg', 'fineagg', 'age']]
test_Y = test_data['strength']

# 创建神经网络分类器并进行拟合
# 其hidden_layer_sizes参数表示隐藏层的形状,元组中每一个数字代表一个隐藏层的神经元数
clf = MLPRegressor(solver='sgd', alpha=1e-5, activation='logistic',
                    hidden_layer_sizes=(5, 2), max_iter=2000, tol=1e-4)
clf.fit(train_X, train_Y)

# 输出神经网络的形状
print([coef.shape for coef in clf.coefs_])
print([coef for coef in clf.coefs_])

predicted_value = clf.predict(test_X)

上面程序的输出如下:

# 输出神经网络的形状
[(8, 5), (5, 2), (2, 1)]

# 输出神经网络的参数
# 输入层到第一隐藏层的参数
array([[ 0.03656307,  0.21450494, -0.01190188,  0.38241027,  0.17812552],
       [-0.17398515,  0.18235492, -0.1642647 , -0.2432147 , -0.21413478],
       [ 0.17538532, -0.22586185, -0.2528862 ,  0.15323971,  0.32104582],
       [-0.18579287,  0.30107637, -0.10311124,  0.32848603, -0.20293293],
       [ 0.19456542, -0.03718471,  0.18091665, -0.128537  ,  0.11027603],
       [-0.2848081 ,  0.01154393, -0.07177461,  0.33554702,  0.07990813],
       [ 0.22875706,  0.14532693,  0.02153075, -0.20555497,  0.21749038],
       [-0.31004214,  0.28754916, -0.02676772,  0.37536369, -0.05403968]]), 
# 第一隐藏层到第二隐藏层的参数
array([[-0.17190271,  0.43500973],
       [ 1.3087405 ,  1.91464934],
       [ 0.52443292, -0.50701212],
       [ 1.2645472 ,  1.25159916],
       [ 1.71981097,  1.1135027 ]]), 
# 第二隐藏层到输出层的参数
array([[ 9.60390747], [12.45077171]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值