神经网络对比

简介: 1. 只能分两类 层数固定不变层数可以变化 ''' 11行神经网络① 固定三层,两类 ''' # 只适合 0, 1 两类。若不是,要先转化 import numpy as np X = np.

 

1. 只能分两类

层数固定不变 层数可以变化
''' 
11行神经网络①  
固定三层,两类
'''
# 只适合 0, 1 两类。若不是,要先转化
import numpy as np

X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
y = np.array([0,1,1,0]).reshape(-1,1) # 此处reshape是为了便于算法简洁实现

wi = 2*np.random.randn(3,5) - 1
wh = 2*np.random.randn(5,1) - 1

for j in range(10000):
    li = X
    lh = 1/(1+np.exp(-(np.dot(li,wi))))
    lo = 1/(1+np.exp(-(np.dot(lh,wh))))
    
    lo_delta = (y - lo)*(lo*(1-lo))
    lh_delta = np.dot(lo_delta, wh.T) * (lh * (1-lh))
    
    wh += np.dot(lh.T, lo_delta)
    wi += np.dot(li.T, lh_delta)
    
print('训练结果:', lo)
'''
11行神经网络① 
层数可变,两类
'''
# 只适合 0, 1 两类。若不是,要先转化
import numpy as np

X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
y = np.array([0,1,1,0]).reshape(-1,1) # 此处reshape是为了便于算法简洁实现

neurals = [3,15,1]
w
= [np.random.randn(i,j) for i,j in zip(neurals[:-1], neurals[1:])] + [None] l = [None] * len(neurals) l_delta = [None] * len(neurals) for j in range(1000): l[0] = X for i in range(1, len(neurals)): l[i] = 1 / (1 + np.exp(-(np.dot(l[i-1], w[i-1])))) l_delta[-1] = (y - l[-1]) * (l[-1] * (1 - l[-1])) for i in range(len(neurals)-2, 0, -1): l_delta[i] = np.dot(l_delta[i+1], w[i].T) * (l[i] * (1 - l[i])) for i in range(len(neurals)-2, -1, -1): w[i] += np.dot(l[i].T, l_delta[i+1]) print('训练结果:', l[-1])

 

 

2.可以分多类

层数固定不变 层数可以变化
'''
11行神经网络① 
固定三层,多类
'''
import numpy as np

X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
#y = np.array([0,1,1,0]) # 可以两类
y = np.array([0,1,2,3])  # 可以多类

wi = np.random.randn(3,5)
wh = np.random.randn(5,4) #
bh = np.random.randn(1,5)
bo = np.random.randn(1,4) #

epsilon = 0.01    # 学习速率
lamda = 0.01      # 正则化强度

for j in range(1000):
    li = X
    lh = np.tanh(np.dot(li, wi) + bh)     # tanh 函数
    lo = np.exp(np.dot(lh, wh) + bo)
    probs = lo / np.sum(lo, axis=1, keepdims=True)

    # 后向传播
    lo_delta = np.copy(probs)
    lo_delta[range(X.shape[0]), y] -= 1
    lh_delta = np.dot(lo_delta, wh.T) * (1 - np.power(lh, 2)) 

    # 更新权值、偏置
    wh -= epsilon * (np.dot(lh.T, lo_delta) + lamda * wh)
    wi -= epsilon * (np.dot(li.T, lh_delta) + lamda * wi)
    
    bo -= epsilon * np.sum(lo_delta, axis=0, keepdims=True)
    bh -= epsilon * np.sum(lh_delta, axis=0)
    
print('训练结果:', np.argmax(probs, axis=1))

 

'''
11行神经网络① 
层数可变,多类
'''
import numpy as np

X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
#y = np.array([0,1,1,0]) # 可以两类
y = np.array([0,1,2,3])  # 可以多类

neurals = [3, 10, 8, 4]
w
= [np.random.randn(i,j) for i,j in zip(neurals[:-1], neurals[1:])] + [None] b = [None] + [np.random.randn(1,j) for j in neurals[1:]] l = [None] * len(neurals) l_delta = [None] * len(neurals) epsilon = 0.01 # 学习速率 lamda = 0.01 # 正则化强度 for j in range(1000): # 前向传播 l[0] = X for i in range(1, len(neurals)-1): l[i] = np.tanh(np.dot(l[i-1], w[i-1]) + b[i]) # tanh 函数 l[-1] = np.exp(np.dot(l[-2], w[-2]) + b[-1]) probs = l[-1] / np.sum(l[-1], axis=1, keepdims=True) # 后向传播 l_delta[-1] = np.copy(probs) l_delta[-1][range(X.shape[0]), y] -= 1 for i in range(len(neurals)-2, 0, -1): l_delta[i] = np.dot(l_delta[i+1], w[i].T) * (1 - np.power(l[i], 2)) # tanh 函数的导数 # 更新权值、偏置 b[-1] -= epsilon * np.sum(l_delta[-1], axis=0, keepdims=True) for i in range(len(neurals)-2, -1, -1): w[i] -= epsilon * (np.dot(l[i].T, l_delta[i+1]) + lamda * w[i]) if i == 0: break b[i] -= epsilon * np.sum(l_delta[i], axis=0) # 打印损失 if j % 100 == 0: loss = np.sum(-np.log(probs[range(X.shape[0]), y])) loss += lamda/2 * np.sum([np.sum(np.square(wi)) for wi in w[:-1]]) # 可选 loss *= 1/X.shape[0] # 可选 print('loss:', loss) print('训练结果:', np.argmax(probs, axis=1))

 

 

目录
相关文章
|
机器学习/深度学习 网络架构
神经网络4
与单层神经网络不同。理论证明,两层神经网络可以无限逼近任意连续函数。 这是什么意思呢?也就是说,面对复杂的非线性分类任务,两层(带一个隐藏层)神经网络可以分类的很好。 下面就是一个例子(此两图来自colah的博客),红色的线与蓝色的线代表数据。而红色区域和蓝色区域代表由神经网络划开的区域,两者的分界线就是决策分界。 可以看到,这个两层神经网络的决策分界是非常平滑的曲线,而且分类的很好。有趣的是,前面已经学到过,单层网络只能做线性分类任务。而两层神经网络中的后一层也是线性分类层,应该只能做线性分类任务。为什么两个线性分类任务结合就可以做非线性分类任务? 我们可以把输出层的决策分界单独拿出来看一下
77 0
|
3月前
|
机器学习/深度学习 自动驾驶 搜索推荐
深度学习之探索神经网络、感知器与损失函数
在当今的数字化时代,深度学习作为一种强大的机器学习技术,正在迅速改变着我们的生活方式。无论是智能推荐系统、自动驾驶车辆还是语音识别应用,深度学习都在背后默默地发挥作用。
58 1
|
6月前
|
机器学习/深度学习 存储 算法
简单的神经网络
softmax激活函数将多个未归一化的值转换为概率分布,常用于多分类问题。交叉熵损失函数,特别是与softmax结合时,是评估分类模型性能的关键,尤其适用于多分类任务。它衡量模型预测概率与实际标签之间的差异。在PyTorch中,`nn.CrossEntropyLoss`函数结合了LogSoftmax和负对数似然损失,用于计算损失并进行反向传播。通过`loss.backward()`,模型参数的梯度被计算出来,然后用优化器如`SGD`更新这些参数以减小损失。
|
6月前
|
机器学习/深度学习
什么是神经网络?
神经网络是一种深度学习方法,源自人类大脑生物神经网络的概念。它由大量相互连接的人工神经元(也称为节点或单元)组成,每个神经元接收输入,进行简单处理后生成输出,并将结果传递给下一层的神经元。
108 2
|
6月前
|
机器学习/深度学习 算法 数据可视化
感知机和神经网络
**神经网络**是模仿生物神经元结构的数学模型,用于处理复杂关系和模式识别。它由输入层、隐藏层(可能多层)和输出层组成,其中隐藏层负责信息处理。随着层数增加(深度学习),网络能处理更多信息。基本模型包括感知机,仅输入和输出层,用于线性划分;而**BP神经网络**有多个隐藏层,通过反向传播和梯度下降优化参数,避免局部最小值。训练过程中,神经元通过激励函数响应并调整权重,以提高预测准确性。
|
6月前
|
机器学习/深度学习 算法 PyTorch
神经网络反向传播算法
神经网络中的反向传播算法是用于训练的关键步骤,通过计算损失函数梯度更新权重。它始于前向传播,即输入数据通过网络得出预测输出,接着计算预测与实际值的误差。反向传播利用链式法则从输出层开始逐层计算误差,更新每一层的权重和偏置。例如,一个包含隐藏层的网络,初始权重随机设定,通过反向传播计算损失函数梯度,如sigmoid激活函数的网络,调整权重以减小预测误差。在Python的PyTorch框架中,可以使用`nn.Linear`定义层,`optimizer`进行参数优化,通过`backward()`计算梯度,`step()`更新参数。
|
6月前
|
机器学习/深度学习 算法 语音技术
神经网络
【6月更文挑战第14天】神经网络。
51 3
|
机器学习/深度学习 算法 PyTorch
神经网络知识蒸馏
翻译:《Distilling the knowledge in a neural network》
105 0
|
机器学习/深度学习 算法 自动驾驶
神经网络5
4.训练 下面简单介绍一下两层神经网络的训练。 在Rosenblat提出的感知器模型中,模型中的参数可以被训练,但是使用的方法较为简单,并没有使用目前机器学习中通用的方法,这导致其扩展性与适用性非常有限。从两层神经网络开始,神经网络的研究人员开始使用机器学习相关的技术进行神经网络的训练。例如用大量的数据(1000-10000左右),使用算法进行优化等等,从而使得模型训练可以获得性能与数据利用上的双重优势。 机器学习模型训练的目的,就是使得参数尽可能的与真实的模型逼近。具体做法是这样的。首先给所有参数赋上随机值。我们使用这些随机生成的参数值,来预测训练数据中的样本。样本的预测目标为yp,真实目标
86 0
|
机器学习/深度学习 自然语言处理 算法
简单了解神经网络
神经网络是一种强大的机器学习算法,具有很广泛的应用,可以用于图像识别、语音识别、自然语言处理、推荐系统等多个领域。
103 0

相关实验场景

更多