手记

Bonjour~人工神经网络

第一次见人工神经网络,是在我的本科毕设,下图为当时用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更优越
0人推荐
随时随地看视频
慕课网APP