• 神经网络学习笔记(1)


    神经网络一开始的是由一个二元分类器组成的,用于执行逻辑计算的ANN,后面出现了感知器,感知器不急具有阈值逻辑单元,同时拥有线性逻辑单元,在感知器中使用的都是跳跃函数,数据基本上是分成二元,或者三元,感知器一般由输入层与输出层组成,感知器一般采用类似于梯度下降的方式进行计算,通过多次迭代,计算分类错误的样本对参数w与b的改变,如果最后所有实例分类正确,则得出正确的分类线。

    现在利用sklearn.linear_model.Perception来建立单层的阈值逻辑单元(TLU)

    1. from sklearn.linear_model import Perceptron
    2. import numpy as np
    3. from sklearn.datasets import load_iris
    4. iris = load_iris()
    5. x=iris.data[:,(2,3)]
    6. y=(iris.target ==0)
    7. per_clf =Perceptron()
    8. per_clf.fit(x,y)
    9. y_pred = per_clf.predict([[2,0.5]])
    10. y_pred

    当单层感知器具有局限时,可以尝试使用多个感知器进行堆叠来消除某些局限。

    多层感知器(MLP)是由一个输入层,一个或多个隐藏层(TLU)和一个输出层组成,要训练多层感知器的话需要使用反向传播算法来训练,反向传播的关键是使用了链式计算,可以将求微分的方式进行改变。先将小批量数据送入模型训练,记住每一个中间数据,,然后只用一个损失函数计算误差,计算每一个连接对错误的贡献,然后应用链式法则进行计算,直至输入层,最后执行梯度下降步骤。

    MLP中的阶跃函数称之为逻辑函数,有sigmoid,tanh(双曲正切函数),relu(线性整流单位函数)。MLP分为回归MLP与分类MLP,在回归MLP中如果有一个特征,则有一个神经元,而在分类MLP中,每一个类需要一个输出神经元,而且需要使用softmax函数,让输出层总和=1.

    使用顺序API构建图像分类器

    1. import tensorflow as tf
    2. from tensorflow import keras
    3. fashion_mnist =keras.datasets.fashion_mnist
    4. (x_train_full,y_train_full),(x_test,y_test) =fashion_mnist.load_data()
    5. x_val,x_train =x_train_full[:5000]/255.0,x_train_full[5000:]/255.0
    6. y_val,y_train =y_train_full[:5000],y_train_full[5000:]

    这里/255是为了降低像素强度,让其处于0~1之间

    1. class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat",
    2. "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]

    建立模型

    1. model =keras.models.Sequential()##适用于顺序连接单层堆栈
    2. model.add(keras.layers.Flatten(input_shape=[28,28]))##作为神经网络的第一层,input_shape为输入实例的形状
    3. model.add(keras.layers.Dense(300,activation='relu'))##这代表了有300个神经元的隐藏层,,使用的是‘relu’为激活函数,其中还包含了一个偏置项
    4. model.add(keras.layers.Dense(100,activation='relu'))
    5. model.add(keras.layers.Dense(10,activation='softmax'))##添加了10个神经元的输出层,使用‘softmax’函数

    同时也可以使用keras中model.Sequential的构建模型

    1. ##也可以想这样构建
    2. model = keras.models.Sequential([
    3. keras.layers.Flatten(input_shape=[28, 28]),
    4. keras.layers.Dense(300, activation="relu"),
    5. keras.layers.Dense(100, activation="relu"),
    6. keras.layers.Dense(10, activation="softmax")
    7. ])

    可以通过summary函数输出模型的构成

    param为参数个数,同时可以通过model.layers获取模型层列表。

    model.layers

     

    可以通过get_weights与set_weighs获得权重与偏置项参数。

    1. weights,biase =model.layers[1].get_weights()
    2. weights##权重
    3. biase##偏执项

     在建立模型后,必须进行模型的编译,需要填入损失函数,优化器与评价方法。

    1. ##进行模型编译
    2. model.compile(loss='sparse_categorical_crossentropy',
    3. optimizer='sgd',
    4. metrics=['accuracy'])
    5. ##loss为损失函数,optimizer为优化器,metrics为指标
    6. ##sparse_categorical_crossentropy是将数据进行独热编码后计算其交叉熵
    7. ##sgd为梯度下降,acuracy为正确率

    history是对模型进行训练以及评估

    1. history =model.fit(x_train,y_train,epochs=30,
    2. validation_data =(x_val,y_val))

    evalute是对模型进行评估,计算泛化误差

    model.evaluate(x_test,y_test)##进行评估泛化误差
    1. x_new =x_test[:3]
    2. y_proba =model.predict(x_new)
    3. y_proba.round(2)
    4. #y_pred = model.predict_classes(X_new) # deprecated
    5. import numpy as np
    6. y_pred = np.argmax(model.predict(x_new), axis=-1)
    7. y_pred
    8. np.array(class_names)[y_pred]

    使用顺序API建立回归MLP

    1. from sklearn.datasets import fetch_california_housing
    2. from sklearn.model_selection import train_test_split
    3. from sklearn.preprocessing import StandardScaler
    4. import tensorflow as tf
    5. from tensorflow import keras
    6. data =fetch_california_housing()
    7. x_train_full,x_test,y_train_full,y_test =train_test_split(data.data,data.target)
    8. x_train,x_val,y_train,y_val =train_test_split(x_train_full,y_train_full)
    9. scaler =StandardScaler()
    10. x_train=scaler.fit_transform(x_train)
    11. x_test=scaler.fit_transform(x_test)
    12. x_val=scaler.fit_transform(x_val)
    13. model =keras.models.Sequential([
    14. keras.layers.Dense(30,activation='relu',input_shape=x_train.shape[1:]),
    15. keras.layers.Dense(1)
    16. ])
    17. model.compile(loss='mean_squared_error',optimizer='sgd')##模型编译
    18. history =model.fit(x_train,y_train,epochs=20,validation_data=(x_val,y_val))##设置了20轮进行计算
    19. mse_test = model.evaluate(x_test,y_test)##进行泛化评估
    20. x_new = x_test[:3]
    21. y_pred =model.predict(x_new)

    使用函数式API构建复杂模型

    复杂模型可能存在多个输入与输出,且隐藏层可能只去一个神经元。

    1. input_ =keras.layers.Input(shape=x_train.shape[1:])
    2. hidden1 =keras.layers.Dense(30,activation='relu')(input_)
    3. hidden2 = keras.layers.Dense(30,activation='relu')(hidden1)
    4. concat =keras.layers.Concatenate()([input_,hidden2])
    5. output_ =keras.layers.Dense(1)(concat)
    6. model =keras.Model(inputs=[input_],outputs=[output_])

    在建立了一个隐藏层之后将其作为函数,将其下面的层的结果传递给它。

    1. input_a = keras.layers.Input(shape=[5],name='wide_input')
    2. input_b =keras.layers.Input(shape=[6],name='deep_input')
    3. hidden1 = keras.layers.Dense(30,activation='relu')(input_b)
    4. hidden2 =keras.layers.Dense(30,activation='relu')(hidden1)
    5. concat =keras.layers.Concatenate()([input_a,hidden2])
    6. output =keras.layers.Dense(1,name='output')(concat)
    7. model =keras.Model(inputs=[input_a,input_b],outputs=[output])
    1. model.compile(loss='mse',optimizer=keras.optimizers.SGD(lr=1e-3))
    2. x_train_a,x_train_b=x_train[:,:5],x_train[:,2:]
    3. x_val_a,x_val_b =x_val[:,:5],x_val[:,2:]
    4. x_test_a,x_test_b =x_test[:,:5],x_test[:,2:]
    5. x_new_a,x_new_b =x_test_a[:3],x_test_b[:3]
    6. history =model.fit((x_train_a,x_train_b),y_train,epochs=20,validation_data=((x_val_a,x_val_b),y_val))
    7. mse_test = model.evaluate((x_test_a,x_test_b),y_test)
    8. y_pred =model.predict((x_new_a,x_new_b))
    9. y_pred

    由于存在多个输入,所以在训练与预测时需要输入多个数据,同理,输出层也是

    1. output = keras.layers.Dense(1,name='output')(concat)
    2. aux_output =keras.layers.Dense(1,name='aux_output')(hidden2)
    3. model =keras.Model(inputs=[input_a,input_b],outputs = [output,aux_output])
    4. model.compile(loss=['mse','mse'],loss_weights=[0.9,0.1],optimizer='sgd')
    5. history =model.fit([x_train_a,x_train_b],[y_train,y_train],epochs=20,
    6. validation_data=([x_val_a,x_val_b],[y_val,y_val]))
    7. total_loss,main_loss,aux_loss=model.evaluate([x_test_a,x_test_b],[y_test,y_test])
    8. y_pred_main,y_pred_aux =model.predict([x_new_a,x_new_b])
    9. y_pred_main,y_pred_aux

  • 相关阅读:
    你了解的SpringCloud核心组件有哪些?他们各有什么作用?
    c++ 数组传递
    考了6次终于屠鸭成功!重获新生!
    Nacos注册中心
    建模杂谈系列173 密级与交付
    项目导入Flowable依赖会导致mybatis依赖报错
    【Github】 Github修改仓库的基本信息
    代码随想录44——动态规划:完全背包理论基础、518零钱兑换II、377组合总和IV
    Greenplum分布键查询
    uni-app详解
  • 原文地址:https://blog.csdn.net/lovexyyforever/article/details/126151470