自己动手写深度学习框架(神经网络的引入)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

最早读神经网络的时候,就觉得这个单词有点夸大其词了。直觉上来说,这里的神经网络,更多的是区别于感知机本身。感知机多使用线性函数进行处理,而神经网络多采用阶跃、sigmoid或者是relu这样的函数来处理。只是后来因为处理图像,引入了cnn;又因为处理声音,引入了rnn。所以,如果从延续性来说,神经网络可以看成是感知机的一个衍生和拓展。

1、新的激励函数

前面说过,感知机主要是线性函数,即

y = k1 * x1 + k2 * x2 + ...

而神经网络则采用了非线性函数。比如阶跃函数,

y = (x > 0) ? 1:0

再比如sigmoid函数,

y = 1 / (1 + np.exp(-x))

还比如relu函数

y = max(0, x)

这里面每一个函数都不是很复杂,大家都可以用matplotlib画一下,应该有不少收获。

2、矩阵运算

在神经网络当中,矩阵的运算是少不了的。特别是矩阵的乘法,基本是我们经常会遇到的运算。这里面numpy也提供了对应的操作接口,可以直接拿过来使用。当然大家如果是用c++开发,而不是采用python,那么可以直接使用eigen库来处理,效果也是一样的。

复制代码
import numpy as np

print('Data of A is as follows,')
A=np.array([1,2,3])
print(A.shape)
print(A)

print ('Data of B is as follows,')
B=np.array([[1,2], [3,4], [5,6]])
print(B.shape)
print(B)

print ('Matrix multiply1 is as follows,')
A=np.array([[1,2],[3,4]])
B=np.array([[5,6],[7,8]])
C=np.dot(A,B)
print(C)

print ('Matrix multiply2 is as follows,')
A=np.array([[1,2,3],[4,5,6]])
B=np.array([[1,2],[3,4],[5,6]])
C=np.dot(A,B)
print(C)

3、基本网络的构成

所谓的神经网络,就是输入和输出端之间,不是一个方程可以解决的。这当中,方程套了方程,也就是说,输入和输出之间套了很多的子方程。如果换成神经网络的语言,就是在输入层、输出层之间有很多的隐藏层,即隐藏层1、隐藏层2、隐藏层n等等。我们通过矩阵和sigmoid函数,就可以把这些层都串起来了,这样就构成了一个基础的神经网络。如果写成python代码,就是这样的形式,后一个网络层的输入,就是前一个网络层的输出,

复制代码
'''
full network
'''

def init_network():
    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 forward(network, 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 = sigmoid(a1)
    a2 = np.dot(z1, W2)+b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3)+b3
    y = identify_function(a3)
    return y

print('network result is as follows,')
network=init_network()
x=np.array([1.0, 0.5])
y=forward(network, x)
print(y)

对应的神经网络形式,其实就是这样的,

4、调整最后的输出层

输出的结果,我们一般都习惯用softmax转一下再进行处理。首先,对入参做一个exp处理。接着,计算每一个入参对数据之和的百分比,最后输出整个百分比即可。这样看上去也没有什么问题。但一旦数据很大的话,exp得到的结果就更大,所以一般会做一个减法,再重复上面的运算。

复制代码
def softmax(a):
    c=np.max(a)
    exp_a = np.exp(a-c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a/sum_exp_a
    return y
相关推荐
AI医影跨模态组学14 分钟前
EBioMedicine美国佐治亚理工学院与埃默里大学:基于深度学习的放射组学与病理学多模态融合预测HPV相关口咽鳞状细胞癌预后
人工智能·深度学习·论文·医学·医学影像·影像组学
Agent手记18 分钟前
异常考勤智能预警与处理与流程优化方案 | 基于企业级Agent的超自动化实战教程
运维·人工智能·ai·自动化
2601_9577875829 分钟前
矩阵运营的技术底座:为什么“一体化系统“正在取代“工具拼装“
人工智能·矩阵·矩阵运营
冬奇Lab1 小时前
Agent 系列(一):Agent 是什么——不只是「会调工具的 LLM」
人工智能·llm·agent
冬奇Lab1 小时前
RAG 系列(二十四):代码 RAG——让 AI 理解你的代码库
人工智能·llm
南屹川1 小时前
【算法】动态规划实战:从入门到精通
人工智能
人工智能培训1 小时前
大模型与传统小模型、传统NLP模型的核心差异解析
人工智能·深度学习·神经网络·机器学习·生成对抗网络
沪漂阿龙1 小时前
面试题详解:智能客服 Agent 系统全栈拆解——Rasa Pro、对话管理、意图识别、GraphRAG、Qwen 与 RAG 优化实战
人工智能·架构
薛定猫AI2 小时前
【深度解析】Gemini Omni 多模态生成与 Agent 化创作工作流:从视频编辑到 UI 生成的技术演进
人工智能·ui·音视频