backpropagation算法代码实现

前言

研究生生涯正式开始了,看了吴恩达的AI课程,然后通过廖雪峰学习了一些python的知识,然后看了一些关于BP博文,然后手推了一遍反向传播算法,还要完成一些导师布置过来的任务,收获还是不错的,然后推荐给ML入门者一些好的网站去学习。

福利链接

廖雪峰python3网站学习地址:链接地址
吴恩达AI课程:链接地址
我见过最好的BP算法的证明:链接地址,可以把相关的文章都看一遍。

正文

今天主要跑了一下bp算法的代码,也就是第三个分享的连接下给的代码,因为给出的代码是python2.7的代码,但是现在大家基本都是用python3跑程序,但是源码直接拿来用python3跑会报错,这里我把我把我遇到的一些问题跟大家分享一下,然后我把代码挂上来。

问题1:from numpy import * 和import numpy as np有什么区别。

两种方式都是引入numpy库中的所有函数、函数、对象、变量等,两者的区别在于调用其中内容时不同.
以掉用numpy中的random模块为例,第一种方式要用numpy.random,第二种方式只用random即可。
但是请特别注意:pep标准推荐使用第一种方式,请在日常使用中尽量使用第一种方法,就比如numpy中random 标准库中也有random,但是两者的功能是不同的,使用第二种方式容易造成混淆

问题二:python2和python3 map函数的区别

python2中map函数中输入一个list做处理返回的也是一个list,但是python3中输入一个list返回的是map object,因此如果想得到一个list,需要在map函数外加list()
举个例子:

def f(x):
    return x*x

L = [1, 2, 3, 4, 5]

print(map(f, L))

该代码在python3上报错:<map object at 0x0000022B9E6BADA0>
修改的代码为:

def f(x):
    return x*x

L = [1, 2, 3, 4, 5]

print(list(map(f, L)))

此时可以得出正确结果:[1, 4, 9, 16, 25]

代码

# -*- coding: UTF-8 -*-

import random
from numpy import *
from functools import reduce

#这里exp函数来自numpy
def sigmoid(inX):
    return 1.0 / (1 + exp(-inX))


class Node(object):
    def __init__(self, layer_index, node_index):
        self.layer_index = layer_index
        self.node_index = node_index
        self.downstream = []
        self.upstream = []
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的神经网络反向传播算法(BP)的代码实现: ``` import numpy as np class NeuralNetwork: def __init__(self, layers, learning_rate=0.1): self.layers = layers self.learning_rate = learning_rate self.weights = [np.random.randn(layers[i], layers[i+1]) for i in range(len(layers)-1)] self.biases = [np.zeros((1, layers[i+1])) for i in range(len(layers)-1)] def sigmoid(self, z): return 1 / (1 + np.exp(-z)) def sigmoid_prime(self, z): return self.sigmoid(z) * (1 - self.sigmoid(z)) def feedforward(self, a): for w, b in zip(self.weights, self.biases): a = self.sigmoid(np.dot(a, w) + b) return a def backpropagation(self, x, y): activations = [x] zs = [] for w, b in zip(self.weights, self.biases): z = np.dot(activations[-1], w) + b zs.append(z) activations.append(self.sigmoid(z)) delta = self.cost_derivative(activations[-1], y) * self.sigmoid_prime(zs[-1]) nabla_b = [delta] nabla_w = [np.dot(activations[-2].T, delta)] for i in range(2, len(self.layers)): z = zs[-i] sp = self.sigmoid_prime(z) delta = np.dot(delta, self.weights[-i+1].T) * sp nabla_b.append(delta) nabla_w.append(np.dot(activations[-i-1].T, delta)) return nabla_b, nabla_w def update_weights(self, mini_batch): nabla_b = [np.zeros(b.shape) for b in self.biases] nabla_w = [np.zeros(w.shape) for w in self.weights] for x, y in mini_batch: delta_nabla_b, delta_nabla_w = self.backpropagation(x, y) nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)] nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)] self.biases = [b-(self.learning_rate/len(mini_batch))*nb for b, nb in zip(self.biases, nabla_b)] self.weights = [w-(self.learning_rate/len(mini_batch))*nw for w, nw in zip(self.weights, nabla_w)] def train(self, training_data, epochs, batch_size): for epoch in range(epochs): np.random.shuffle(training_data) mini_batches = [training_data[k:k+batch_size] for k in range(0, len(training_data), batch_size)] for mini_batch in mini_batches: self.update_weights(mini_batch) def cost_derivative(self, output_activations, y): return (output_activations - y) ``` 该代码实现了一个简单的全连接神经网络,并使用了反向传播算法来训练网络。在初始化时,我们指定了神经网络的层数和学习率。在训练时,我们将训练数据分成多个小批次,每个小批次包含若干个训练样本,然后对每个小批次分别进行反向传播,并更新神经网络的权重和偏置项。最终,我们可以使用 `feedforward` 方法来得到神经网络的输出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值