ANN神经网络——Sigmoid 激活函数编程练习 (Python实现)



# ----------
#
# There are two functions  to finish:
# First, in activate(), write the sigmoid activation function.
# Second, in update(), write the gradient descent update rule. Updates should be
#   performed online, revising the weights after each data point.
#
# ----------

import numpy as np

class Sigmoid:
    """
    This class models an artificial neuron with sigmoid activation function.
    """

    def __init__(self, weights = np.array([1])):
        """
        Initialize weights based on input arguments. Note that no type-checking
        is being performed here for simplicity of code.
        """
        self.weights = weights

        # NOTE: You do not need to worry about these two attribues for this
        # programming quiz, but these will be useful for if you want to create
        # a network out of these sigmoid units!
        self.last_input = 0 # strength of last input
        self.delta      = 0 # error signal

    def activate(self, values):
        """
        Takes in @param values, a list of numbers equal to length of weights.
        @return the output of a sigmoid unit with given inputs based on unit
        weights.
        """

        # YOUR CODE HERE

        # First calculate the strength of the input signal.
        strength = np.dot(values, self.weights)
        self.last_input = strength

        # TODO: Modify strength using the sigmoid activation function and
        # return as output signal.
        # HINT: You may want to create a helper function to compute the
        #   logistic function since you will need it for the update function.

        result = self.logistic(strength)
        return result

    def logistic(self,strength):
        return 1/(1+np.exp(-strength))

    def update(self, values, train, eta=.1):
        """
        Takes in a 2D array @param values consisting of a LIST of inputs and a
        1D array @param train, consisting of a corresponding list of expected
        outputs. Updates internal weights according to gradient descent using
        these values and an optional learning rate, @param eta.
        """

        # TODO: for each data point...
        for X, y_true in zip(values, train):
            # obtain the output signal for that point
            y_pred = self.activate(X)

            # YOUR CODE HERE

            # TODO: compute derivative of logistic function at input strength
            # Recall: d/dx logistic(x) = logistic(x)*(1-logistic(x))
            dx = self.logistic(self.last_input)*(1 - self.logistic(self.last_input) )
            print ("dx{}:".format(dx))
            print ('\n')
            # TODO: update self.weights based on learning rate, signal accuracy,
            # function slope (derivative) and input value
            delta_w = eta * (y_true - y_pred) * dx * X
            print ("delta_w:{} weight before {}".format(delta_w, self.weights))

            self.weights += delta_w
            print ("delta_w:{} weight after {}".format(delta_w, self.weights))
            print ('\n')

def test():
    """
    A few tests to make sure that the perceptron class performs as expected.
    Nothing should show up in the output if all the assertions pass.
    """
    def sum_almost_equal(array1, array2, tol = 1e-5):
        return sum(abs(array1 - array2)) < tol

    u1 = Sigmoid(weights=[3,-2,1])
    assert abs(u1.activate(np.array([1,2,3])) - 0.880797) < 1e-5

    u1.update(np.array([[1,2,3]]),np.array([0]))
    assert sum_almost_equal(u1.weights, np.array([2.990752, -2.018496, 0.972257]))

    u2 = Sigmoid(weights=[0,3,-1])
    u2.update(np.array([[-3,-1,2],[2,1,2]]),np.array([1,0]))
    assert sum_almost_equal(u2.weights, np.array([-0.030739, 2.984961, -1.027437]))

if __name__ == "__main__":
    test()

OUTPUT


Running test()...
dx0.104993585404:

delta_w:[-0.0092478  -0.01849561 -0.02774341] weight before [3, -2, 1]
delta_w:[-0.0092478  -0.01849561 -0.02774341] weight after [ 2.9907522  -2.01849561  0.97225659]

dx0.00664805667079:

delta_w:[-0.00198107 -0.00066036  0.00132071] weight before [0, 3, -1]
delta_w:[-0.00198107 -0.00066036  0.00132071] weight after [ -1.98106867e-03   2.99933964e+00  -9.98679288e-01]

dx0.196791859198:

delta_w:[-0.02875794 -0.01437897 -0.02875794] weight before [ -1.98106867e-03   2.99933964e+00  -9.98679288e-01]
delta_w:[-0.02875794 -0.01437897 -0.02875794] weight after [-0.03073901  2.98496067 -1.02743723]

All done!

原文地址:https://www.cnblogs.com/Neo007/p/8309393.html

时间: 2024-11-23 00:35:54

ANN神经网络——Sigmoid 激活函数编程练习 (Python实现)的相关文章

目前所有的ANN神经网络算法大全

http://blog.sina.com.cn/s/blog_98238f850102w7ik.html 目前所有的ANN神经网络算法大全 (2016-01-20 10:34:17) 转载▼ 标签: it   概述 1 BP神经网络 1.1 主要功能 1.2 优点及其局限性 2 RBF(径向基)神经网络 2.1 主要功能 2.2 优点及其局限性 3 感知器神经网络 3.1 主要功能 3.2 优点及其局限性 4 线性神经网络 4.1 主要功能 4.2优点及其局限性 5自组织神经网络 5.1 自组织

OpenCV——ANN神经网络

ANN-- Artificial Neural Networks 人工神经网络 //定义人工神经网络 CvANN_MLP bp; // Set up BPNetwork's parameters CvANN_MLP_TrainParams params; params.train_method=CvANN_MLP_TrainParams::BACKPROP; params.bp_dw_scale=0.1; params.bp_moment_scale=0.1; //params.train_me

神经网络的相关知识(1.python 实现MLp)

转载于:http://blog.csdn.net/miangangzhen/article/details/51281989 #!usr/bin/env python3 # -*- coding:utf-8 -*- import numpy as np import math # definition of sigmoid funtion # numpy.exp work for arrays. def sigmoid(x): return 1 / (1 + np.exp(-x)) # defi

神经网络学习笔记

神经网络 sigmoid函数 sigmoid函数是一种常见的挤压函数,其将较大范围的输入挤压到(0,1)区间内,其函数的表达式与形状如下图所示: 该函数常被用于分类模型,因为其具有很好的一个特性f′(x)=f(x)(1?f(x)).这个函数也会被用于下面的神经网络模型中做激活函数. M-P神经元模型 生物的神经网络系统中,最简单最基本的结构是神经元.每个神经元都是接受其他多个神经元传入的信号,然后将这些信号汇总成总信号,对比总信号与阈值,如果超过阈值,则产生兴奋信号并输出出去,如果低于阈值,则处

高清图解:神经网络、机器学习、数据科学一网打尽

|导|读| BY:AI-Beetle 完全图解人工智能.NLP.机器学习.深度学习.大数据!这份备忘单涵盖了上述领域几乎全部的知识点,并使用信息图.脑图等多种可视化方式呈现,设计精美,实用性强.今天,我们要为大家推荐一个超实用.颜值超高的神经网络+机器学习+数据科学和Python的完全图解,文末附有高清PDF版链接,支持下载.打印,推荐大家可以做成鼠标垫.桌布,或者印成手册等随手携带,随时翻看.这是一份非常详实的备忘单,涉及具体内容包括:1.2神经网络3.神经网络基础知识4.神经网络图谱5.机器

Python每日一个小程序

前几天上网,收集了20多道Python练习题.这些练习题还是很有价值的,正好最近忙着复习准备校招,可以用来练手.我会把每道题都写一篇博客详细阐述解题思路和源代码,在每道题目后面附上博客地址.希望大家对我的代码能给予指正,我们共同努力,共同进步.后序有好的题目或者解题思路,我还会在这篇博客后面追加. 第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果 解答:[Python学习笔记]-APP图标显示未读消息数目   http

基于人工神经网络的数字字符识别系统demo(一):字符去噪、分割

最近尝试利用神经网络做数字字符识别,大概做了一下.整体很简陋,就是先对测试图片做下预处理,然后通过重采样提取特征,最后通过神经网络进行训练和识别.感兴趣的可以点击这里 了解一下,欢迎多多指教. 这里我大概介绍一下怎样将一副包含多个字符的图片进行去噪处理进而分割出单个字符,关于opencv中怎样使用ANN详见Opencv中ANN神经网络使用示例. 原始图: 效果图: 下面介绍一下处理步骤, 1.载入图像并作灰度化 2.二值化并作反色处理 3.提取外轮廓 4.根据轮廓大小去除噪声 5.再次查找轮廓并

windows10 conda python多版本切换

之前为了学习安装了python2.7是通过anaconda2安装的 现在想换用Python3  所以寻找版本并存 可以来回切换的方法 打开命令提示符,记住是命令提示符 不是win10自带的windows powershell 等会会说他俩的区别 输入以下指令(我选择的是python3.6版本): conda create --name py36 python=3.6 安装完以后 屏幕会提示你activate py36字样 在anaconda/envs/目录下会出现一个以py36为名字的文件夹 这

70个Python练手项目

前言: 不管学习那门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从中选择自己想做的项目进行参考学习练手,你也可以从中寻找灵感去做自己的项目. 70个Python项目列表: 1.[Python 图片转字符画]2.[200行Python代码实现2048]3.[Python3 实现火车票查询工具]4.[高德API+Python解决租房问题 ]5.[Python3 色情图