搭建一个简单的神经网络

 
更多文章欢迎来我的小博客
课程链接:【Siraj】 深度学习引论#2 如何做一个神经网络

1 Intro to Deep Learning

本周总结:

  • 神经网络是一种在数据中识别模式的算法

  • 反向传播是一种在更新权重的训练过程中采用的一种技术,这个过程使用的是梯度下降法。

  • 深度学习 = 多层神经网络 + 大数据 + 大量的计算

实例

课程实例中构建了一个最简单的单层神经网络,并且只含一个神经元。和吴恩达的第二周机器学习课程神经网络基础基本是相同的,有时间回头在做详细的对比。其中也应用神经网络做了一个简单的预测,样本集应该是随便给的把,看起来没什么规律,主要是揭示神经网络构建和应用的基本流程。

from numpy import exp, array, random, dot


class NeuralNetwork():
    def __init__(self):
        # 设置随机数种子,使每次运行生成的随机数相同
        # 便于调试
        random.seed(1)

        # 我们对单个神经元进行建模,其中有3个输入连接和1个输出连接
        # 我们把随机的权值分配给一个3x1矩阵,值在-1到1之间,均值为0。
        self.synaptic_weights = 2 * random.random((3, 1)) - 1

    # Sigmoid函数, 图像为S型曲线.
    # 我们把输入的加权和通过这个函数标准化在0和1之间。
    def __sigmoid(self, x):
        return 1 / (1 + exp(-x))

    # Sigmoid函数的导函数.
    # 即使Sigmoid函数的梯度
    # 它同样可以理解为当前的权重的可信度大小
    # 梯度决定了我们对调整权重的大小,并且指明了调整的方向
    def __sigmoid_derivative(self, x):
        return x * (1 - x)

    # 我们通过不断的试验和试错的过程来训练神经网络
    # 每一次都对权重进行调整
    def train(self, training_set_inputs, training_set_outputs, number_of_training_iterations):
        for iteration in range(number_of_training_iterations):
            # 把训练集传入神经网络.
            output = self.think(training_set_inputs)

            # 计算损失值(期望输出与实际输出之间的差。
            error = training_set_outputs - output

            # 损失值乘上sigmid曲线的梯度,结果点乘输入矩阵的转置
            # 这意味着越不可信的权重值,我们会做更多的调整
            # 如果为零的话,则误区调制
            adjustment = dot(training_set_inputs.T, error * self.__sigmoid_derivative(output))

            # 调制权值
            self.synaptic_weights += adjustment

    # 神经网络的“思考”过程
    def think(self, inputs):
        # 把输入数据传入神经网络
        return self.__sigmoid(dot(inputs, self.synaptic_weights))


if __name__ == "__main__":

    # 初始化一个单神经元的神经网络
    neural_network = NeuralNetwork()

    # 输出随机初始的参数作为参照
    print("Random starting synaptic weights: ")
    print(neural_network.synaptic_weights)

    # 训练集共有四个样本,每个样本包括三个输入一个输入
    training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
    training_set_outputs = array([[0, 1, 1, 0]]).T

    # 用训练集对神经网络进行训练
    # 迭代10000次,每次迭代对权重进行微调.
    neural_network.train(
  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值