做期货关注网站,做网站赚不了钱,网站美工的重要性,效果图在哪个网站可以找比较好目录 1、M-P神经元2、感知机3、Delta法则4、前馈型神经网络#xff08;Feedforward Neural Networks#xff09;5、鸢尾花数据集——单层前馈型神经网络#xff1a;6、多层神经网络#xff1a;增加隐含层7、实现异或运算#xff08;01、10为1,00、11为0#xff09;8、线性… 目录 1、M-P神经元2、感知机3、Delta法则4、前馈型神经网络Feedforward Neural Networks5、鸢尾花数据集——单层前馈型神经网络6、多层神经网络增加隐含层7、实现异或运算01、10为1,00、11为08、线性不可分问题9、万能近似定理10、超参数与验证集11、误差反向传播算法Backpropagation, BP 1、M-P神经元
M-P神经元1943McCullochPitts x1,x2,x3…模拟神经元的树突接受信号wi表示权重对输入xi加权求和后与θ比较得到z再传入阶跃函数得到输出y。但是不具备学习能力。
2、感知机 模型和上图一样输入层xi不需要计算只有输出层发生计算层数只有一层。 具备学习能力有多个解受权值初始值和错误样本顺序影响。 线性二分类器对非线性问题无法收敛。 单个感知机实现二分类问题多个感知机就是多个输出能实现多分类问题就是前面所说的softmax回归
3、Delta法则
就是前面的逻辑回归用step()函数或sigmoid()函数逻辑回归可以看做是单层神经网络
4、前馈型神经网络Feedforward Neural Networks
每层只与前一层神经元相连同一层之间没有连接各层间没有反馈不存在跨层连接 全连接网络Full Connnected Network前一层左边的节点都与后一层右边的节点连接且后一层的节点都接受来自前一层的所有输入。
5、鸢尾花数据集——单层前馈型神经网络
设计 结构单层前馈型神经网络 激活函数softmax函数 损失函数交叉熵损失函数 实现如下图输入是训练集的120条数据含4条属性/数据输出是3个标签独热编码表示为1*3向量将之前的模型参数WYWX)的第一行参数分离出来即YWXB以便实现多层神经网络时更加方便直观。使用独热编码见上一篇笔记 softmax函数tf.nn.softmax(tf.matmul(X_train,W)b)自然顺序码转化为独热编码需要先转换为浮点数tf.one_hot(tf.constant(y_test,dtypetf.int32),3)交叉熵损失函数tf.keras.losses.categorical_crossentropy(y_true,y_pred) y_true独热编码的标签值 y_predsoftmax函数的输出值 输出是一个一维张量其中的每个元素是每个样品的交叉熵损失因此需要用求平均值函数设置运行时分配显存如果出现错误Blast GEMMlaunch failed:) gpustf.config.experimental.list_physical_devices(GPU)
for gpu in gpus:tf.config.experimental.set_memory_growth(gpu,True)返回张量最大值的索引tf.argmax(input_tensor,axis0)见TensorFlow笔记3
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
#读取文件详见Python笔记10
train_pathtf.keras.utils.get_file(iris.csv, originNone) #获取文件的绝对路径
df_irispd.read_csv(train_path,header0) #结果是panda的二维数据表
irisnp.array(df_iris) #将二维数据表类型转化为二维数组类型shape(150,6)与视频中不一样索引号为0的是序号
xiris[:,1:5] #索引号1~4列属性花瓣长度和宽度,x.shape(150, 2)
yiris[:,5] #train_y.shape(150,)x_svvnp.concatenate((np.stack(x[ysetosa]), #选取2种花以及其前2种属性np.stack(x[yversicolor]),np.stack(x[yvirginica])),axis0)
y_svvnp.concatenate((np.zeros(np.where(ysetosa)[0].size), #元组只有一个元素数组np.ones(np.where(yversicolor)[0].size),2*np.ones(np.where(yvirginica)[0].size),),axis0)np.random.seed(612)
iris_randnp.concatenate((x_svv,np.expand_dims(y_svv,axis1)),axis1)
np.random.shuffle(iris_rand) #打乱数组并选前面120条数据为训练集后面30条做测试集
x_traintf.constant(iris_rand[:120,0:4],dtypetf.float32) #转化为float32张量
y_traintf.constant(iris_rand[:120,4],dtypetf.int64) #转化为int32张量
x_testtf.constant(iris_rand[120:,0:4],dtypenp.float32)
y_testtf.constant(iris_rand[120:,4],dtypetf.int64)X_trainx_train-tf.reduce_mean(x_train,axis0) #中心化, x_train.dtypedtype(O)是object
X_testx_test-tf.reduce_mean(x_test,axis0)
Y_traintf.one_hot(y_train,3) #转化为独热编码Y_train.shapeTensorShape([120, 3])
Y_testtf.one_hot(y_test,3)learn_rate0.5 #超参数——学习率
iter50 #迭代次数
display_step10 #设置每迭代10次输出结果方便查看
np.random.seed(612)
Wtf.Variable(np.random.randn(4,3),dtypetf.float32) #W列向量4行3列
Btf.Variable(np.zeros([3]),dtypetf.float32) #B列向量长度为3的一维张量cce_train[] #保存交叉熵损失
cce_test[]
acc_train[] #保存准确率
acc_test[]#训练模型
for i in range(0,iter1):with tf.GradientTape() as tape:#softmax函数,PRED_train是120*3的张量每行3个元素表属于某个样品的预测概率PRED_traintf.nn.softmax(tf.matmul(X_train,W)B) #shapeTensorShape([120, 3])Loss_traintf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_trueY_train, y_predPRED_train))PRED_testtf.nn.softmax(tf.matmul(X_test,W)B)Loss_testtf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_trueY_test, y_predPRED_test))#准确率,求PRED_train的每一行3个元素的max即属于对应标签的概率最大再与真实值y_train比较求得准确率Accuracy_traintf.reduce_mean(tf.cast(tf.equal(tf.argmax(PRED_train,axis1),y_train),tf.float32))Accuracy_testtf.reduce_mean(tf.cast(tf.equal(tf.argmax(PRED_test,axis1),y_test),tf.float32)) cce_train.append(Loss_train)cce_test.append(Loss_test)acc_train.append(Accuracy_train)acc_test.append(Accuracy_test)gradstape.gradient(Loss_train,[W,B])W.assign_sub(learn_rate*grads[0]) #dL_dWB.assign_sub(learn_rate*grads[1]) #dL_dBif i%display_step0:print(i:%i,\tTrainAcc:%f,TrainLoss:%f\tTestAcc:%f,TestLoss:%f %(i,Accuracy_train,Loss_train,Accuracy_test,Loss_test))#可视化,图1准确率图2损失函数
plt.figure(figsize(10,3))
plt.subplot(121)
plt.plot(cce_train,colorblue,labeltrain)
plt.plot(cce_test,colorred,labeltest)
plt.xlabel(Iteration)
plt.ylabel(Loss)
plt.subplot(122)
plt.plot(acc_train,colorblue,labeltrain)
plt.plot(acc_test,colorred,labeltest)
plt.xlabel(Iteration)
plt.ylabel(Accuracy)
plt.tight_layout() #自动调整子图
plt.show()输出训练集和测试集损失都在下降可以继续训练
i:0, TrainAcc:0.291667,TrainLoss:2.102095 TestAcc:0.366667,TestLoss:1.757901
i:10, TrainAcc:0.891667,TrainLoss:0.338472 TestAcc:0.933333,TestLoss:0.447548
i:20, TrainAcc:0.933333,TrainLoss:0.271075 TestAcc:0.900000,TestLoss:0.405325
i:30, TrainAcc:0.958333,TrainLoss:0.234893 TestAcc:0.833333,TestLoss:0.384106
i:40, TrainAcc:0.958333,TrainLoss:0.210969 TestAcc:0.766667,TestLoss:0.370561
i:50, TrainAcc:0.966667,TrainLoss:0.193312 TestAcc:0.766667,TestLoss:0.3608286、多层神经网络增加隐含层 7、实现异或运算01、10为1,00、11为0
采用2个感知机一个感知机相当于一根直线下图第1个感知机实现与运算11–1其他–0第2个感知机实现或非运算见下图红色横线处 再进行叠加对h1、h2进行或非运算得到异或运算的模型每个神经元即感知机有3个参数 也可以使用以下运算先进行或运算OR、或非运算NAND再进行与运算AND)
8、线性不可分问题
可以转化为多个线性问题每个线性问题用一个感知机一个神经元下图第3图的橙色圈表示一条直线再用一个神经元将其组合起来下图第3图绿色圈 下图中1个四边形1个六变形。需要用2个隐含层下图红色框用4个神经元黄色圈区分4边形用6个神经元橙色圈区分6边形再将2个图形组合起来绿色圈
9、万能近似定理
在前馈型神经网络中只要有一个隐含层并且这个隐含层中有足够多的神经元就可以逼近任意一个连续的函数或空间分布
多隐含层神经网络能够表示非连续的函数或空间区域、减少泛化误差、减少每层神经元的数量
10、超参数与验证集
例如有2个超参数a、ba∈{1,2,3}b∈{4,5,6,7}那么就有3*4种组合。使用同一个训练集训练每一种组合得到各种组合的模型使用同一个验证集测试其误差防止模型的过拟合去除误差较大的模型确定模型超参数再在测试集评估模型的泛化能力。
11、误差反向传播算法Backpropagation, BP
误差反向传播算法Backpropagation, BP利用链式法则反向传播损失函数的梯度信息计算出损失函数对网络中所有模型参数的梯度它计算的只是梯度其本身不是学习算法将梯度传递给其他算法如梯度下降法来学习更新模型的参数
举个栗子下面神经网络输入值x1时真实值y0.84个模型参数wh、bh、w0、b0重复下面4个步骤 step1设置模型参数初始值wh0.2, bh0.1, w00.3, b00.2 step2正向计算预测值即是计算预测值y0 y h 1 1 e − ( 0.2 ∗ 1 0.1 ) 0.57 y_h\dfrac{1}{1e^{-(0.2*10.1)}}0.57 yh1e−(0.2∗10.1)10.57 y 0 1 1 e − ( 0.3 ∗ 0.57 0.2 ) 0.59 y_0\dfrac{1}{1e^{-(0.3*0.570.2)}}0.59 y01e−(0.3∗0.570.2)10.59 step3计算误差Loss0.5*(y-y0)²0.02205 step4误差反向传播 可以用TensorFlow自带求导自动求偏导也可手动求下面手动对w求偏导数的过程用求导的链式求导即可图中有问题的dLoss/dw0少了一个负号 同理更新参数b0和上面对w0求偏导比较只有dz0/db0不同 同理更新隐含层模型参数wh、bh 如果隐含层有多个神经元那么误差反向传播则按照权值wi按比例反向传播 如果输出层有多个神经元和上面同理