深度学习入门简单实现一个神经网络

实现一个三层神经网络

引言

今天我们实现一个简单的神经网络

俩个输入神经元 隐藏层两个神经元 一个输出神经元

激活函数我们使用sigmoid

优化方法使用梯度下降

我们前期准备是需要把这些神经元的关系理清楚

x1:第一个输入

x2:第二个输入

w11_1:第一层的第一个神经元在第一个输入上的权重

w12_1:第一层的第二个神经元在第一个输入上的权重

b1_1:第一层第一个神经元的偏置项(截距)

z1_1:第一层第一个神经元的线性函数

a1_1:第一层第一个神经元的激活函数

w21_1:第一层的第一个神经元在第一个输入上的权重

w22_1:第一层的第一个神经元在第一个输入上的权重

b2_1:第一层第二个神经元的偏置项(截距)

z1_1:第一层第二个神经元的线性函数

a1_1:第一层第二个神经元的激活函数

w11_2:第二层的第一个神经元在第一个输入上的权重

w21_2:第二层的第二个神经元在第一个输入上的权重

b1_2:第二层第一个神经元的偏置项(截距)

z1_1:第二层第一个神经元的线性函数

a1_1:第二层第一个神经元的激活函数

e:损失函数

测试数据

dataset 可以使用西瓜书89页的西瓜数据集3.0α

代码

python 复制代码
import numpy as np
import sympy
import dataset
from matplotlib import pyplot as plt


def sigmod(b):
    return 1 / (1 + np.exp(-b))


xs, ys = dataset.get_beans(100)  # 获取数据
plt.title("Size-Toxicity Funciton", fontsize=12)  # 设置图片的标题
plt.xlabel("Bean Size")  # 设置行标签
plt.ylabel("Toxicity")  # 设置列标签

plt.scatter(xs, ys)  # 画散点图

"""
命名规则
下划线后面的数字表示被输入的神经元所在的层数
字母后面的数字表示第一个数字表示第几个输入
第二个数字表示被输入的神经元在他所在层数的位置
"""
# 第一层
# 第一个神经元
w11_1 = np.random.rand()
b1_1 = np.random.rand()
# 第二个神经元
w12_1 = np.random.rand()
b2_1 = np.random.rand()
# 第二层
w11_2 = np.random.rand()
w21_2 = np.random.rand()
b1_2 = np.random.rand()


# 前向传播 代价函数 y0 = 1/(1+e^(-(wx+b)))
def forward_propgation(xs):
    z1_1 = w11_1 * xs + b1_1
    a1_1 = sigmod(z1_1) # 第一层第一个神经元的代价函数值

    z2_1 = w12_1 * xs + b2_1
    a2_1 = sigmod(z2_1)  # 第一层第二个神经元的代价函数值

    z1_2 = w11_2 * a1_1 + w21_2 * a2_1 + b1_2
    a1_2 = sigmod(z1_2)   # 第二层第一个神经元的代价函数值
    return a1_2, z1_2, a2_1, z2_1, a1_1, z1_1



a1_2, z1_2, a2_1, z2_1, a1_1, z1_1 = forward_propgation(xs)
# plt.plot(xs, a1_2)
# plt.show()

# 随机梯度下降
for j in range(5000):
    for i in range(100):
        x = xs[i]
        y = ys[i]
        # 先来一次前向传播
        a1_2, z1_2, a2_1, z2_1, a1_1, z1_1 = forward_propgation(x)
        # 开始反向传播
        # 误差代价函数e
        """
            z1_1 = w11_1 * xs + b1_1
            a1_1 = sigmod(z1_1) # 第一层第一个神经元的代价函数值

            z2_1 = w12_1 * xs + b2_1
            a2_1 = sigmod(z2_1)  # 第一层第二个神经元的代价函数值

            z1_2 = w11_2 * a1_1 + w21_2 * a2_1
            a1_2 = sigmod(z1_2)   # 第二层第一个神经元的代价函数值
        """
        e = (y - a1_2) ** 2  # 误差e = (y - 最后一个神经元得出的值)^2
        deda1_2 = -2*(y - a1_2)  # 对a1_2 第二层的第一个神经元的函数求导
        da1_2dz1_2 = a1_2 * (1 - a1_2)  # da1_2对dz1_2求导数
        dz1_2dw11_2 = a1_1  # dz1_2对w11_2求导数
        dz1_2dw21_2 = a2_1  # dz1_2对dw21_2求导
        dedw11_2 = deda1_2 * da1_2dz1_2 * dz1_2dw11_2  # de对dw11_2求偏导
        dedw21_2 = deda1_2 * da1_2dz1_2 * dz1_2dw21_2  # de对dw21_2求偏导
        dz1_2db1_2 = 1  # z1_2对db1_2求偏导
        dedb1_2 = deda1_2 * da1_2dz1_2 * dz1_2db1_2  # de对db1_2求偏导

        dz1_2da1_1 = w11_2  # dz1_2对da1_1求偏导
        da1_1dz1_1 = a1_1 * (1 - a1_1)  # da1_1对dz1_1 求偏导
        dz1_1dw11_1 = x  # dz1_1对dw11_1求偏导
        dedw11_1 = deda1_2 * da1_2dz1_2 * dz1_2da1_1 * da1_1dz1_1 * dz1_1dw11_1  # e对w11_1求导
        dz1_1db1_1 = 1  # z1_1对b1_1求导
        dedb1_1 = deda1_2 * da1_2dz1_2 * dz1_2da1_1 * da1_1dz1_1 * dz1_1db1_1  # e对b1_1求导

        dz1_2da2_1 = w21_2  # z1_2 对a2_1 求导
        da2_1dz2_1 = a2_1 * (1 - a2_1)  # a2_1 对z2_1求导
        dz2_1dw12_1 = x  # z2_1对w12_1
        dedw12_1 = deda1_2 * da1_2dz1_2 * dz1_2da1_1 * da2_1dz2_1 * dz2_1dw12_1  # e对w12_1求导
        dz2_1db2_1 = 1  # z2_1 对 b2_1求导
        dedb2_1 = deda1_2 * da1_2dz1_2 * dz1_2da1_1 * da2_1dz2_1 * dz2_1db2_1  # e 对 b2_1求导

        alpha = 0.03
        w11_2 = w11_2 - alpha * dedw11_2  # 调整w11_2
        w21_2 = w21_2 - alpha * dedw21_2  # 调整21_2
        b1_2 = b1_2 - alpha * dedb1_2  # 调整b1_2

        w12_1 = w12_1 - alpha * dedw12_1  # 调整w12_1
        b2_1 = b2_1 - alpha * dedb2_1  # 调整 b2_1

        w11_1 = w11_1 - alpha * dedw11_1  # 调整 w11_1
        b1_1 = b1_1 - alpha * dedb1_1  # 调整b1_1
    if j % 100 == 0:
        plt.clf()  # 清空窗口
        plt.scatter(xs, ys)
        a1_2, z1_2, a2_1, z2_1, a1_1, z1_1 = forward_propgation(xs)
        plt.plot(xs, a1_2)
        plt.pause(0.01)  # 暂停0.01秒
相关推荐
2601_94995063几秒前
没有现成习题,试试AI再写出题
人工智能·小程序·刷题·练习·小程序推荐
干饭选手又困了�6864 分钟前
AI 商品主图生成实操:从白底图到多规格物料交付全流程
人工智能
liukuang1108 分钟前
2026中报对决:安踏借船出海,李宁自己造船
大数据·人工智能
minhuan13 分钟前
拆解A2A大模型核心能力:详解场景化应用,构建智能交互、业务自动化完整应用方案25.8
人工智能·a2a·a2a应用实践·a2a智能体构建·a2a多智能体协同
sukioe17 分钟前
城智连响:基于 LangGraph 与四库分层架构的城市公共设施智能报修与派单系统
人工智能·python·ai·架构·langchain
Hello-FPGA19 分钟前
量子计算滨松c15550-22up单光子相机与PCIe1004采集卡
人工智能·计算机视觉·fpga开发
DeepIntelli21 分钟前
企业独立站内容怎么改,才更容易被大模型引用:从语义化 HTML 到可抽取结构的工程化调整
人工智能·chatgpt
A.说学逗唱的Coke23 分钟前
【人工智能专题】Redis 杀进 AI 数据层:向量搜索、语义缓存与 Agent 记忆工程从入门到踩坑
人工智能·redis·缓存
luckystar513~24 分钟前
AI漫剧满天飞:创作工具全景指南
人工智能
十三画者27 分钟前
【文献分享】ExoFILT:基于深度学习的外泌事件单颗粒追踪数据分类器
人工智能·深度学习·机器学习·数据挖掘·数据分析