第一次见人工神经网络,是在我的本科毕设,下图为当时用Python画的图,画图的代码已经弄丢了~~,那个时候对AI有些云里雾里,虽然现在做开发依旧对它感到云里雾里,但是我已经丝毫不畏惧它了。😎
CH1.一个感知器
关于它的结构,想说的话都在图上
一个感知器不具有非线性能力,要达到非线性能力,需要将感知器并联
两个感知器的输出被当作训练用的特征进入下一个神经元,依此嵌套多级感知器,就可以实现非线性变换,由此发现一个哲理,非线性是由很多线性组合而成的。
CH2.多层感知器
结构:
输入层:与输入特征直接相连,先将全部输入特征先进行归一化
输出层:如果处理的是分类问题,必须是One-Hot形式
隐藏层:完成输入层与输出层之间的非线性变化,其中f(激活函数)的选取特别重要(Sigmoid,R elu,tanh,softplus).
CH3.神经网络的优化算法一:反向传播算法(BP):
BP的四个步骤:
1.前向计算:给一些参数赋随机值
2.计算误差
3.反向单层调整:只调整离输出层最近的那一层,根据误差进行参数调整,原理还是梯度下降
4.反向传播:往反方向再走一层,按步骤三继续调整参数,依此迭代
调参结束的标志:误差收敛到一定范围或者达到迭代次数👻💯
CH4.神经网络的优化算法二,随机梯度下降(SGD)
因为神经网络的参数贼多,所以用梯度下降会很复杂,所以选择随机梯度下降算法
CH5.神经网络需要注意的地方
示例代码:
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.optimizers import SGD
#先建一个保存神经网络的容器
mdl = Sequential()
#输入:input_dim,要和输入数据的维度保持一致
#输出:50,表示下一层神经元的个数
mdl.add(Dense(50, input_dim=len(feature_train[0]))) #输入层
mdl.add(Activation("sigmoid"))
#由于最后的输出层只有两个值,对应的One-Hot编码是两位,所以隐藏层的输出是2
mdl.add(Dense(2)) #隐藏层
#softmax:保持输出值的归一化
mdl.add(Activation("softmax"))
#lr:优化器的学习率
sgd = SGD(lr=0.01)
#编译模型,定义损失函数
mdl.compile(loss="mean_squared_error", optimizer="sgd")
#将Y的0,1值转换成One-Hot编码:01和10
mdl.fit(X_train, np.array([[0, 1] if i == 1 else [1, 0] for i in Y_train]), nb_epoch=1000, batch_size=8999)
#预测过程
xy_lst = [(X_train, Y_train), (X_validation, Y_validation), (X_test, Y_test)]
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc, roc_auc_score
f = plt.figure()
for i in range(len(xy_lst)):
X_part = xy_lst[i][0]
Y_part = xy_lst[i][1]
Y_pred = mdl.predict(X_part)
print(Y_pred)
Y_pred = np.array(Y_pred[:, 1]).reshape((1, -1))[0]
# print(i)
# print("NN", "-ACC:", accuracy_score(Y_part, Y_pred))
# print("NN", "-REC:", recall_score(Y_part, Y_pred))
# print("NN", "-F1:", f1_score(Y_part, Y_pred))
f.add_subplot(1, 3, i + 1)
fpr, tpr, threshold = roc_curve(Y_part, Y_pred)
plt.plot(fpr, tpr)
print("NN", "AUC", auc(fpr, tpr))
print("NN", "AUC_Score", roc_auc_score(Y_part, Y_pred))
plt.show()
return
#优化器还有Adam,比SGD更优越
反向传播算法推荐的包:PyBrain
想了解BP神经网络,以及深入了解人工神经网络的推荐这位大佬的博客