Bp神经网络实践

高级人工智能案例——实践

指导老师:陈爱斌教授

1.数据读取与处理

# 存放数据
dataset = []
# 存放标签
labels = []
#读取数据和标签
with open('Iris归一化.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        dataset.append(row[0:4])
        labels.append(row[4:7])
#测试是否读取成功
cc = list(zip(dataset, labels))
# 打乱数据集
random.shuffle(cc)
dataset[:], labels[:] = zip(*cc)

print(len(dataset))
print(len(labels))
print(dataset[len(dataset)-1])
print(labels[len(labels)-1])

# 标签转换
labelset = []
for i in labels:
    t = []
    for j in i:
        j = float(j)
        t.append(j)
    labelset.append(t)
print(labelset)

2.激活函数的定义

本次实践使用了两种激活函数,其图像分别如下:
在这里插入图片描述
另外,了解一下这几个
在这里插入图片描述

因此,本实验函数定义如下:

def sigmoid(z):
	return 1 / (1 + np.exp(-z))

def relu(x):
    return np.where(x<0, 0, x)

3.参数初始化

#x为输入矩阵的列数维度,y为输入右乘的列数维度,即隐藏层节点个数,z为输出层节点个数
def parameter_initialization(x, y, z):
    # 隐藏层偏差
    value1 = np.random.randn(1, y) * 0.01

    # 输出层偏差
    value2 = np.random.randn(1, z) * 0.01

    # 输入层与隐层的连接权重
    weight1 = np.random.randn(x, y) * 0.01

    # 隐层与输出层的连接权重
    weight2 = np.random.randn(y, z) * 0.01

    return weight1, weight2, value1, value2

4.模型训练函数

def trainning(dataset, labelset, weight1, weight2, value1, value2):
    # x为学习率
    x = 0.01
    for i in range(len(dataset)):
        # 输入数据
        inputset = np.mat(dataset[i]).astype(np.float64)
        # 数据标签
        outputset = np.mat(labelset[i]).astype(np.float64)

        # 隐层输入
        input1 = np.dot(inputset, weight1).astype(np.float64)
        # 隐层输出
        output2 = relu(input1 - value1).astype(np.float64)
        # 输出层输入
        input2 = np.dot(output2, weight2).astype(np.float64)
        # 输出层输出
        output3 = sigmoid(input2 - value2).astype(np.float64)

        #反向传播更新参数
        # 更新公式由矩阵运算表示
        #sigmoid在y=output3处的导数
        a = np.multiply(output3, 1 - output3)
        #a=output3
        #outputset - output3标签和结果的损失
        #loss*sigmoid在output3处的导数,即是隐藏层2的梯度
        g = np.multiply(a, outputset - output3)
        #隐藏层2的梯度×隐藏层2,继续向前传播
        b = np.dot(g, np.transpose(weight2))
        #sigmoid导数
        c = np.multiply(output2, 1 - output2)
        #c=output2
        # 上一层传过来的梯度*sigmoid在output2处的导数,即是隐藏层1的梯度
        e = np.multiply(b, c)

        #计算梯度
        value1_change = -x * e
        value2_change = -x * g
        weight1_change = x * np.dot(np.transpose(inputset), e)
        weight2_change = x * np.dot(np.transpose(output2), g)

        # 更新参数
        value1 += value1_change
        value2 += value2_change
        weight1 += weight1_change
        weight2 += weight2_change
       
        #print("loss",outputset - output3)
    return weight1, weight2, value1, value2

5.模型测试函数

def testing(dataset, labelset, weight1, weight2, value1, value2):
    # 记录预测正确的个数
    rightcount = 0
    for i in range(len(dataset)):
        # 计算每一个样例通过该神经网路后的预测值
        inputset = np.mat(dataset[i]).astype(np.float64)
        output2 = relu(np.dot(inputset, weight1) - value1)
        output3 = sigmoid(np.dot(output2, weight2) - value2)

        # 求最大值的索引
        output3 = output3[0].tolist()
        predict = output3.index(max(output3))

        label = labelset[i].index(max(labelset[i]))

        if(label==predict):
            rightcount=rightcount+1
        # 输出预测结果
        print("预测结果", output3, "标签", labelset[i])
        print("预测为", predict, "实际为", label)
        #print("预测为%d   实际为%d" % (output3, labelset))
    # 返回正确率
    return rightcount / len(dataset)

6.训练测试及输出

c = 120
    traindata = []
    trainlabel = []
    testdata = []
    testlabel = []
    acc = []
    for i in range(0, len(labelset)):
        if i < c:
            traindata.append(dataset[i])
            trainlabel.append(labelset[i])
        else:
            testdata.append(dataset[i])
            testlabel.append(labelset[i])
    print("训练集:", len(traindata))
    print("验证集:", len(testdata))
    # 初始化参数
    weight1, weight2, value1, value2 = parameter_initialization(len(traindata[0]), len(traindata[0]), 3)
    # 训练
    for i in range(3000):
        print("当前训练epoch", i)
        (weight1, weight2, value1, value2) = trainning(traindata, trainlabel, weight1, weight2, value1, value2)
        # 验证
        rate = testing(testdata, testlabel, weight1, weight2, value1, value2)
        acc.append(rate)
    print("正确率为%f" % rate)
    x = np.arange(0, 3000, 30)
    plt.plot(x, np.array(acc)[x])
    plt.grid(True)
    plt.xlabel("epochs")
    plt.ylabel("acc")
    plt.show()

7. 实验结果

   每次实验跑3000 epochs,每个epoch训练120条数据,测试30条数据

1) 隐藏层输出ReLU+输出层输出SeLU
准确率准确率图

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: BP神经网络是一种常见的人工神经网络,使用反向传播算法进行训练和预测。它具有很强的适应性和普适性,被广泛应用于分类、回归、聚类等各种任务中。 MATLAB是一种常用的科学计算软件,其具有强大的数学、统计和机器学习工具箱。通过MATLAB可以方便地实现BP神经网络的模型构建、训练、预测和评估。 BP神经网络MATLAB PDF是一种教程资料,旨在帮助用户快速掌握使用MATLAB实现BP神经网络的技能。它包含了BP神经网络的理论原理、MATLAB函数的使用方法、案例分析等内容,具有较高的实用性和可操作性。 通过学习BP神经网络MATLAB PDF,用户可以了解BP神经网络的基本概念和结构,掌握MATLAB实现BP神经网络的流程和技巧,以及了解BP神经网络在各种任务中的应用情况。这对于研究人员、工程师和学生等,都具有重要的意义。 总之,BP神经网络MATLAB PDF是BP神经网络和MATLAB相结合的教程资料,通过学习和实践,可以帮助用户快速掌握BP神经网络的理论和应用,实现各种机器学习任务。 ### 回答2: BP神经网络是一种人工神经网络模型,通过反向传播算法来训练网络并进行分类或者回归预测。Matlab是一种数据分析和处理的工具,也是初学者和研究者常用的编程语言之一。 BP神经网络与Matlab的结合,可以帮助用户更加高效地进行建模和数据处理。例如,使用Matlab可以方便地对数据进行预处理、可视化和分析,然后将处理好的数据输入到BP神经网络中进行训练。同时,Matlab也提供了丰富的函数库和工具,可以简化BP神经网络的搭建和训练过程。 PDF是一种跨平台的文档格式,可以方便地在不同操作系统和设备上进行查看和共享。许多基于Matlab的BP神经网络教程和资料都提供了PDF格式的文档,可以供用户下载和学习。 综上所述,BP神经网络Matlab PDF为学习和实践BP神经网络提供了很大的帮助。通过使用Matlab和PDF文档,用户可以更加高效地进行建模和数据处理,并且能够在不同的设备和环境下进行学习和交流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值