作为神经网络的基础,在我看来可以从感知机说起,感知机作为最简单的神经网络之一,他拥有一个输入层,一个隐藏层,一个输出层,最基本的感知机的作用是为了作为一个二类分类的线性分类模型。作为感知机的基本公式,
的取值为-1或者1适用于分类,而w与b分别为权值与偏置。
感知机的作用本质上是通过不断调整权值与偏置,找到一条可以将实例完美分割的线。对于感知机的学习策略:
1.首先设置一个步长与初始的权值与偏置,一般为1,0,0。
2.然后带入实例点,由于实例点的y值为-1或1,所以可以通过来判断,如果可以>0则说明是正确的分类,不满足则需要对w与b进行更新。
3.由于对于来说要得到w与b的表达式,得通过求偏导的方式求出结果,
,
,此处
为步长也可以称为学习率。(这里类似于线性回归的梯度下降,非常雷同)
4.直到全部分类正确后,得到的最终值为结果。
还有关于感知机收敛与对偶问题的证明不在此赘述。
现在通过函数来构建一个感知机:
import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import Perceptron
iris =load_iris()
X =iris.data[:,(2,3)]
y=(iris.target==0).astype(np.int)
per_clf = Perceptron()
per_clf.fit(X,y)
y_pred =per_clf.predict([[2,0.5]])
y_pred
当然,一层感知机是不够的,这里可以建立多层的感知机(MLP),这会导致存在存在多个w与b需要更改,这里引入了反向传播算法即BP算法,在BP算法中运用了链式求导法则,当然这只是一个辅助,在反向传播算法中,首先要进行的是正向传播,只有正向传播,得到中间值,才能继续后续的反向传播,这里假设在输出之间没有激活函数(这样子会更直观)。当正向传播过去之后,会存在中间值,然后输出y后,与真实值进行比较,在损失函数计算之后,得到误差,这时开始反向传播,这个误差可以有上一层的神经元来的权值与其误差的乘积来得到
,这样子以此类推,可以得到所有神经元的误差(除了输入神经元),然后就是对误差进行更新
这里A为正向传播的中间结果,e为输入神经元的一个神经元,
为那个神经元的误差,这样子就可以完成更新,这里的
需要使用链式求导法则。
存在多种MLP(回归与分类),两者最大的区别为激活函数的不同(下一篇会详细讲)。
顺序MLP的建立与神经网络的步骤。
顺序神经网络是通过keras.models.Sequential()来建立,这是顺序连接的单层神经元连接而成。
神经网络建立步骤:
1.建立基本模型。
2.进行模型编译。model.compile()
3.对模型进行训练。model.fit()
4.对模型进行评估。model.evaluate()
代码实例:
import tensorflow as tf
from tensorflow import keras
fashion_mnist =keras.datasets.fashion_mnist
(x_train_full,y_train_full),(x_test,y_test)=fashion_mnist.load_data()
x_val,x_train =x_train_full[:5000]/255.0,x_train_full[5000:]/255.0
y_val,y_train=y_train_full[:5000],y_train_full[5000:]
model=keras.models.Sequential([
keras.layers.Flatten(input_shape=[28,28]),
keras.layers.Dense(300,activation='relu'),
keras.layers.Dense(100,activation='relu'),
keras.layers.Dense(10,activation='softmax')
]
)
model.summary()
##获得权重
hidden1 =model.layers[1]
weights,biases=hidden1.get_weights()
model.compile(loss='sparse_categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
history=model.fit(x_train,y_train,epochs=30,validation_data=(x_val,y_val))
keras.utils.plot_model(model, "my_fashion_mnist_model.png", show_shapes=True)
x_test = x_test / 255.
model.evaluate(x_test,y_test)
5.对模型进行预测