神经网络基础知识(激活函数、网络实现)

神经网络基础知识(激活函数、网络实现)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pylab as plt

def showStepFunc():
    """
    显示阶跃函数图形
    """
    x = np.arange(-5.0, 5.0, 0.1)
    y = np.array(x > 0, dtype=np.int)
    plt.plot(x, y)
    # 指定Y轴的范围
    plt.ylim(-0.1, 1.1)
    plt.show()

def showSigmoidFunc():
    """
    显示sigmoid函数图形
    """
    x = np.arange(-5.0, 5.0, 0.1)
    y = simoid(x)
    plt.plot(x, y)
    # 指定Y轴的范围
    plt.ylim(-0.1, 1.1)
    plt.show()

def showReLUFunc():
    """
    显示ReLU函数图形
    """
    x = np.arange(-5.0, 5.0, 0.1)
    y = np.maximum(0, x)
    plt.plot(x, y)
    # 指定Y轴的范围
    plt.ylim(-0.1, 1.1)
    plt.show()

def simoid(x):
    """
    sigmoid函数实现
    :param x: 输入值
    :return:
    """
    return 1 / (1 + np.exp(-x))

def softmax(x):
    """
    softmax函数实现
    :param x: 输入值
    :param x:
    """
    # 取最大信号值
    c = np.max(x)
    # 减去C是防止数据溢出,C为常数,可取任意值,不影响函数结果,一般取最大的输入信号值。
    expX = np.exp(x - c)
    sumExpX = np.sum(expX)
    return expX / sumExpX

def initNetwork():
    """
    三层神经网络参数定义
    """
    network = {}
    # 第一层信号权重
    network['w1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
    # 第一层偏置
    network['b1'] = np.array([0.1, 0.2, 0.3])
    # 第二层信号权重
    network['w2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
    # 第二层偏置
    network['b2'] = np.array([0.1, 0.2])
    # 第三层信号权重
    network['w3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
    # 第三层偏置
    network['b3'] = np.array([0.1, 0.2])
    return network

def idenityFunc(x):
    """
    自定义的激活函数
    :param x: 输入信号
    :return:
    """
    return x

def forward(network, x):
    """
    神经网络的前向(输入到输出)处理
    :param netword: 神经网络参数
    :param x: 输入信号
    """
    w1, w2, w3 = network['w1'], network['w2'], network['w3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']
    a1 = np.dot(x, w1) + b1
    # 第一层激活函数计算
    z1 = simoid(a1)
    a2 = np.dot(z1, w2) + b2
    # 第二层激活函数计算
    z2 = simoid(a2)
    a3 = np.dot(z2, w3) + b3
    # 第三层激活函数计算
    y = idenityFunc(a3)
    return y

def doit():
    network = initNetwork()
    x = np.array([1.0, 0.5])
    y = forward(network, x)
    print(y)

doit()