100行Python代码,轻松搞定神经网络 !

GCN-图卷积神经网络算法简单实现(含python代码) 阅读详情

用tensorflow,pytorch这类深度学习库来写一个神经网络早就不稀奇了。

可是,你知道怎么用python和numpy来优雅地搭一个神经网络嘛?

现如今,有多种深度学习框架可供选择,他们带有自动微分、基于图的优化计算和硬件加速等各种重要特性。对人们而言,似乎享受这些重要特性带来的便利已经是理所当然的事儿了。但其实,瞧一瞧隐藏在这些特性下的东西,能更好的帮助你理解这些网络究竟是如何工作的。

所以今天,文摘菌就来手把手教大家搭一个神经网络。原料就是简单的python和numpy代码!

Python资源共享群:484031800

文章中的所有代码可以都在这儿获取。

https://colab.research.google.com/github/eisenjulian/slides/blob/master/NN_from_scratch/notebook.ipynb

符号说明

在计算反向传播时, 我们可以选择使用函数符号、变量符号去记录求导过程。它们分别对应了计算图中的边和节点来表示它们。

给定R^n→R和x∈R^n, 那么梯度是由偏导∂f/∂j(x)组成的n维行向量

如果f:R^n→R^m 和x∈R^n,那么 Jacobian矩阵是下列函数组成的一个m×n的矩阵。

 

 

 

 

 

对于给定的函数f和向量a和b如果a=f(b)那么我们用∂a/∂b 表示Jacobian矩阵,当a是实数时则表示梯度

链式法则

给定三个分属于不同向量空间的向量a∈A及c∈C和两个可微函数f:A→B及g:B→C使得f(a)=b和g(b)=c,我们能得到复合函数的Jacobian矩阵是函数f和g的jacobian矩阵的乘积:

 

 

 

 

 

这就是大名鼎鼎的链式法则。提出于上世纪60、70年代的反向传播算法就是应用了链式法则来计算一个实函数相对于其不同参数的梯度的。

要知道我们的最终目标是通过沿着梯度的相反方向来逐步找到函数的最小值 (当然最好是全局最小值), 因为至少在局部来说, 这样做将使得函数值逐步下降。当我们有两个参数需要优化时, 整个过程如图所示:

 

 

 

 

 

反向模式求导

假设函数fi(ai)=ai+1由多于两个函数复合而成,我们可以反复应用公式求导并得到:

 

 

 

 

 

 

可以有很多种方式计算这个乘积,最常见的是从左向右或从右向左。

如果an是一个标量,那么在计算整个梯度的时候我们可以通过先计算∂an/∂an-1并逐步右乘所有的Jacobian矩阵∂ai/∂ai-1来得到。这个操作有时被称作VJP或向量-Jacobian乘积(Vector-Jacobian Product)。

又因为整个过程中我们是从计算∂an/∂an-1开始逐步计算∂an/∂an-2,∂an/∂an-3等梯度到最后,并保存中间值,所以这个过程被称为反向模式求导。最终,我们可以计算出an相对于所有其他变量的梯度。

 

 

 

 

 

相对而言,前向模式的过程正相反。它从计算Jacobian矩阵如∂a2/∂a1开始,并左乘∂a3/∂a2来计算∂a3/∂a1。如果我们继续乘上∂ai/∂ai-1并保存中间值,最终我们可以得到所有变量相对于∂a2/∂a1的梯度。当∂a2/∂a1是标量时,所有乘积都是列向量,这被称为Jacobian向量乘积(或者JVP,Jacobian-Vector Product )。

 

 

 

 

 

你大概已经猜到了,对于反向传播来说,我们更偏向应用反向模式——因为我们想要逐步得到损失函数对于每层参数的梯度。正向模式虽然也可以计算需要的梯度, 但因为重复计算太多而效率很低。

计算梯度的过程看起来像是有很多高维矩阵相乘, 但实际上,Jacobian矩阵常常是稀疏、块或者对角矩阵,又因为我们只关心将其右乘行向量的结果,所以就不需要耗费太多计算和存储资源。

在本文中, 我们的方法主要用于按顺序逐层搭建的神经网络, 但同样的方法也适用于计算梯度的其他算法或计算图。

关于反向和正向模式的详尽描述可以参考这里☟

http://colah.github.io/posts/2015-08-Backprop/ 

深度神经网络

在典型的监督机器学习算法中, 我们通常用到一个很复杂函数,它的输入是存有标签样本数值特征的张量。此外,还有很多用于描述模型的权重张量。

损失函数是关于样本和权重的标量函数, 它是衡量模型输出与预期标签的差距的指标。我们的目标是找到最合适的权重让损失最小。在深度学习中, 损失函数被表示为一串易于求导的简单函数的复合。所有这些简单函数(除了最后一个函数),都是我们指的层, 而每一层通常有两组参数: 输入 (可以是上一层的输出) 和权重。

而最后一个函数代表了损失度量, 它也有两组参数: 模型输出y和真实标签y^。例如, 如果损失度量l为平方误差, 则∂l/∂y为 2 avg(y-y^)。损失度量的梯度将是应用反向模式求导的起始行向量。

Autograd

自动求导背后的思想已是相当成熟了。它可以在运行时或编译过程中完成,但如何实现会对性能产生巨大影响。我建议你能认真阅读 HIPS autograd的 Python 实现,来真正了解autograd。

核心想法其实始终未变。从我们在学校学习如何求导时, 就应该知道这一点了。如果我们能够追踪最终求出标量输出的计算, 并且我们知道如何对简单操作求导 (例如加法、乘法、幂、指数、对数等等), 我们就可以算出输出的梯度。

假设我们有一个线性的中间层f,由矩阵乘法表示(暂时不考虑偏置):

 

 

 

 

 

为了用梯度下降法调整w值,我们需要计算梯度∂l/∂w。这里我们可以观察到,改变y从而影响l是一个关键。

每一层都必须满足下面这个条件: 如果给出了损失函数相对于这一层输出的梯度, 就可以得到损失函数相对于这一层输入(即上一层的输出)的梯度。

现在应用两次链式法则得到损失函数相对于w的梯度:

 

 

 

 

 

相对于x的是:

 

 

 

 

 

因此, 我们既可以后向传递一个梯度, 使上一层得到更新并更新层间权重, 以优化损失, 这就行啦!

动手实践

先来看看代码, 或者直接试试Colab Notebook

https://colab.research.google.com/github/eisenjulian/slides/blob/master/NN_from_scratch/notebook.ipynb

我们从封装了一个张量及其梯度的类(class)开始。

现在我们可以创建一个layer类,关键的想法是,在前向传播时,我们返回这一层的输出和可以接受输出梯度和输入梯度的函数,并在过程中更新权重梯度。

然后, 训练过程将有三个步骤, 计算前向传递, 然后后向传递, 最后更新权重。这里关键的一点是把更新权重放在最后, 因为权重可以在多个层中重用,我们更希望在需要的时候再更新它。

  •  
class Layer:
  def __init__(self):
    self.parameters = []
  def forward(self, X):
    """
    Override me! A simple no-op layer, it passes forward the inputs
    """
    return X, lambda D: D
  def build_param(self, tensor):
    """
    Creates a parameter from a tensor, and saves a reference for the update step
    """
    param = Parameter(tensor)
    self.parameters.append(param)
    return param
  def update(self, optimizer):
    for param in self.parameters: optimizer.update(param)

 

标准的做法是将更新参数的工作交给优化器, 优化器在每一批(batch)后都会接收参数的实例。最简单和最广为人知的优化方法是mini-batch随机梯度下降。

  •  
class SGDOptimizer():
  def __init__(self, lr=0.1):
    self.lr = lr
  def update(self, param):
    param.tensor -= self.lr * param.gradient
    param.gradient.fill(0)

 

在此框架下, 并使用前面计算的结果后, 线性层如下所示:

  •  
class Linear(Layer):
  def __init__(self, inputs, outputs):
    super().__init__()
    tensor = np.random.randn(inputs, outputs) * np.sqrt(1 / inputs)
    self.weights = self.build_param(tensor)
    self.bias = self.build_param(np.zeros(outputs))
  def forward(self, X):
    def backward(D):
      self.weights.gradient += X.T @ D
      self.bias.gradient += D.sum(axis=0)
      return D @ self.weights.tensor.T
    return X @ self.weights.tensor +  self.bias.tensor, backward

 

接下来看看另一个常用的层,激活层。它们属于点式(pointwise)非线性函数。点式函数的 Jacobian矩阵是对角矩阵, 这意味着当乘以梯度时, 它是逐点相乘的。

  •  
class ReLu(Layer):
  def forward(self, X):
    mask = X > 0
    return X * mask, lambda D: D * mask

 

计算Sigmoid函数的梯度略微有一点难度,而它也是逐点计算的:

  •  
class Sigmoid(Layer):
  def forward(self, X):
    S = 1 / (1 + np.exp(-X))
    def backward(D):
      return D * S * (1 - S)
    return S, backward

 

当我们按序构建很多层后,可以遍历它们并先后得到每一层的输出,我们可以把backward函数存在一个列表内,并在计算反向传播时使用,这样就可以直接得到相对于输入层的损失梯度。就是这么神奇:

  •  
class Sequential(Layer):
  def __init__(self, *layers):
    super().__init__()
    self.layers = layers
    for layer in layers:
      self.parameters.extend(layer.parameters)
  def forward(self, X):
    backprops = []
    Y = X
    for layer in self.layers:
      Y, backprop = layer.forward(Y)
      backprops.append(backprop)
    def backward(D):
      for backprop in reversed(backprops):
        D = backprop(D)
      return D
    return Y, backward

 

正如我们前面提到的,我们将需要定义批样本的损失函数和梯度。一个典型的例子是MSE,它被常用在回归问题里,我们可以这样实现它:

  •  
def mse_loss(Yp, Yt):
  diff = Yp - Yt
  return np.square(diff).mean(), 2 * diff / len(diff)

 

就差一点了!现在,我们定义了两种层,以及合并它们的方法,下面如何训练呢?我们可以使用类似于scikit-learn或者Keras中的API。

  •  
class Learner():
  def __init__(self, model, loss, optimizer):
    self.model = model
    self.loss = loss
    self.optimizer = optimizer
  def fit_batch(self, X, Y):
    Y_, backward = self.model.forward(X)
    L, D = self.loss(Y_, Y)
    backward(D)
    self.model.update(self.optimizer)
    return L
  def fit(self, X, Y, epochs, bs):
    losses = []
    for epoch in range(epochs):
      p = np.random.permutation(len(X))
      X, Y = X[p], Y[p]
      loss = 0.0
      for i in range(0, len(X), bs):
        loss += self.fit_batch(X[i:i + bs], Y[i:i + bs])
      losses.append(loss)
    return losses

 

这就行了!如果你跟随着我的思路,你可能就会发现其实有几行代码是可以被省掉的。

这代码能用不?

现在可以用一些数据测试下我们的代码了。

  •  
X = np.random.randn(100, 10)
w = np.random.randn(10, 1)
b = np.random.randn(1)
Y = X @ W + B
model = Linear(10, 1)
learner = Learner(model, mse_loss, SGDOptimizer(lr=0.05))
learner.fit(X, Y, epochs=10, bs=10)

 

 

 

 

 

我一共训练了10轮。

我们还能检查学到的权重和真实的权重是否一致。

  •  
print(np.linalg.norm(m.weights.tensor - W), (m.bias.tensor - B)[0])
> 1.848553648022619e-05 5.69305886743976e-06

 

好了,就这么简单。让我们再试试非线性数据集,例如y=x1x2,并且再加上一个Sigmoid非线性层和另一个线性层让我们的模型更复杂些。像下面这样:

  •  
X = np.random.randn(1000, 2)
Y = X[:, 0] * X[:, 1]
losses1 = Learner(
    Sequential(Linear(2, 1)),
    mse_loss,
    SGDOptimizer(lr=0.01)
).fit(X, Y, epochs=50, bs=50)
losses2 = Learner(
    Sequential(
        Linear(2, 10),
        Sigmoid(),
        Linear(10, 1)
    ),
    mse_loss,
    SGDOptimizer(lr=0.3)
).fit(X, Y, epochs=50, bs=50)
plt.plot(losses1)
plt.plot(losses2)
plt.legend(['1 Layer', '2 Layers'])
plt.show()

 

 

 

 

 

 

比较单一层vs两层模型在使用sigmoid激活函数的情况下的训练损失。

最后

希望通过搭建这个简单的神经网络,你已经掌握了用python和numpy实现神经网络的基本思路。

在这篇文章中,我们只定义了三种类型的层和一个损失函数, 所以还有很多事情可做,但基本原理都相似。感兴趣的同学可以试着实现更复杂的神经网络哦!

10分钟教你用python 30行代码搞定简单手写识别! 欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 手写笔记还是电子笔记好呢? 毕业季刚结束,眼瞅着2018级小萌新马上就要来了,老腊肉小编为了咱学弟学妹们的学习,绞尽脑汁准备编一套大学秘籍,这不刚开了个头就遇上了个难题——做笔记到底是手写笔记好呢还是电子笔记好呢? 聪明的小伙伴们或许就该怼小编了,不是有电子手写笔记吗!哼,机智如我怎么可能没想过这个呢! 大家用电子笔记除了省纸张外,往往... 阅读详情

相关推荐

100皇后问题的遗传算法实战:200行Python跑通GA全闭环

遗传算法(GA)是一种模拟自然选择与进化的全局优化方法,其核心在于编码、适应度评估、选择、交叉与变异五大机制。在组合优化场景中,GA凭借不依赖梯度、能跳出局部最优的特性,被广泛应用于N皇后、旅行商(TSP)、超参数调优等难题。本文聚焦GA的工程落地本质——以100皇后问题为载体,详解如何将抽象原理转化为可调试、可复现、可扩展的Python实现:从染色体排列编码设计、轻量级冲突感知适应度函数(含0.001防除零鲁棒处理),到仅用精英选择+变异的极简进化流程,再到命令行参数驱动的种群规模/迭代代数权衡实践。所有

dflkg8956的专栏 527

推荐 :手把手教你用Python创建简单的神经网络

了解神经网络工作方式的最佳途径莫过于亲自创建一个神经网络,本文将演示如何做到这一点。 神经网络(NN)又称人工神经网络(ANN),是机器学习领域中基于生物神经网络概念的学习算法的一个子集。 拥有五年以上经验的德国机器学习专家Andrey Bulezyuk声称:“神经网络正在彻底改变机器学习,因为它们能够在广泛的学科和行业中为抽象对象高效建模。” 人工神经...

weixin_34202952的博客 531

告别拥堵焦虑:用MetaSTC框架轻松搞定城市交通流量预测(附Python代码实战)

本文介绍了MetaSTC框架在城市交通流量预测中的应用,该框架结合聚类和元学习技术,显著提升预测准确率并缩短训练时间。通过Python代码实战和避坑要点,帮助开发者快速掌握这一高效工具,解决传统模型的资源消耗大、预测误差高等问题。

weixin_29047919的博客 164

一个简单神经网络的代码实现

用算法来预测下表的结果: Input Output 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 上表就相当于是训练数据,Output相当于标签(Label)。 import numpy as np def nonlin(x, deriv=False): if True == deriv: return x*(1-x) return 1 / (1 + np.exp(-x)) train_data = np.array([[

神童i的博客 2323

Python实战案例汇总,带你轻松从入门到实战

python从入门到实战,带你轻轻松松学会python

信息安全领域优质创作者|操作系统领域专家 1万+

社区网络图

画每个人的的社会关系图。。。。。。。。。。。。。。。

简单神经网络代码实现

【代码】简单神经网络代码实现

qq_42798343的博客 858

网闸的基本配置

本文详细介绍了网闸的基本配置流程,包括物理连接与初始化、网络基础配置、核心数据交换策略配置、安全增强配置、管理与运维以及测试验证等关键步骤。网闸通过在物理隔离环境下建立"数据摆渡通道",实现特定业务数据的安全交换。配置时应遵循最小化、单向化、内容控制和审计原则,确保只开放必要通道,优先采用单向传输,进行内容安全检查并记录操作日志。不同厂商网闸的配置界面可能不同,但核心逻辑是相通的。

qq_39980997的博客 1843

Python手撸机器学习系列(十五):简单神经网络

神经网络 1.简单算法推导 搭建一个将二维平面坐标点分开的简单神经网络,输入维度为2*1(特征为2),神经网络结构如下图: 则网络第一层Layer_1的输出为: L1=f(w1x1+w3x2+b1)L2=f(w2x1+w4x2+b2) L_1 = f(w_1x_1+w_3x_2+b_1) \\ L2 = f(w_2x_1+w_4x_2+b_2) L1​=f(w1​x1​+w3​x2​+b1​)L2=f(w2​x1​+w4​x2​+b2​) 其中f(⋅)f(·)f(⋅)表示sigmoidsigmoidsig

qq_43601378的博客 3124

EDA公司(一):Synopsys-- 主要 EDA 工具及其简介

Synopsys 是一家领先的电子设计自动化(EDA)软件公司,提供了一系列全面的产品和服务,旨在支持从概念设计到大规模生产的各个阶段。Synopsys 的 EDA 工具覆盖了芯片设计的各个方面,包括但不限于逻辑综合、静态时序分析、功能验证、物理实现、形式验证、测试插入、电源分析、信号完整性分析等。

MHD0815的博客 3313

AI量化交易工作台Vibe-Trading:用自然语言驱动策略回测与多智能体研究

量化交易通过数学模型和计算机程序执行投资决策,其核心在于将市场规律转化为可验证的策略。传统量化开发涉及数据获取、策略编写、回测验证等复杂工程,对非编程背景的从业者构成较高门槛。随着大语言模型技术的发展,自然语言交互正成为降低技术使用难度的关键。Vibe-Trading项目正是这一趋势的实践,它将金融工程任务封装为可调用的工具与技能,允许用户通过自然语言指令直接驱动策略回测、因子研究和投资组合分析。其技术价值在于构建了一个模块化的AI Agent框架,通过ReAct推理框架协调多个专项技能,并创新性地引入多智

weixin_28695161的博客 1568

python 神经网络_100行Python代码,轻松搞定神经网络 !

用tensorflow,pytorch这类深度学习库来写一个神经网络早就不稀奇了。可是,你知道怎么用python和numpy来优雅地搭一个神经网络嘛?现如今,有多种深度学习框架可供选择,他们带有自动微分、基于图的优化计算和硬件加速等各种重要特性。对人们而言,似乎享受这些重要特性带来的便利已经是理所当然的事儿了。但其实,瞧一瞧隐藏在这些特性下的东西,能更好的帮助你理解这些网络究竟是如何工作的。所以今...

weixin_39716043的博客 273

​网格划分理论:CFD理论67 网格划分-三大理论问题_哔哩哔哩_bilibili传统解释非结构化网格是不对的——计算传热学大叔专题讨论2--CFD网格类型_哔哩哔哩_bilibili

传统解释非结构化网格是不对的——计算传热学大叔。fluent计算理论和离散方法原理视频推荐。

qq_15963745的博客 183

100行Python代码,轻松搞定神经网络

用tensorflow,pytorch这类深度学习库来写一个神经网络早就不稀奇了。 可是,你知道怎么用python和numpy来优雅地搭一个神经网络嘛? 现如今,有多种深度学习框架可供选择,他们带有自动微分、基于图的优化计算和硬件加速等各种重要特性。对人们而言,似乎享受这些重要特性带来的便利已经是理所当然的事儿了。但其实,瞧一瞧隐藏在这些特性下的东西,能更好的帮助你...

weixin_45084321的博客 524

音乐生成 - 使用LSTM或Transformer模型进行音乐生成,如MIDI音乐生成。

在本篇博客中,我们将介绍如何使用LSTM和Transformer模型生成MIDI音乐。我们将首先概述音乐生成的一般流程,然后深入了解LSTM和Transformer模型的特点和实现。最后,我们将通过Python代码演示如何使用这两种模型生成MIDI音乐。

斌擎科技 1722

深度剖析XY2-100与SL2-100协议:解锁激光打标核心技术密码

XY2-100和SL2-100是激光打标领域的两种核心控制协议。XY2-100协议采用串行通信,指令集简单,适合常规打标任务,具有成本优势;SL2-100协议支持更高速率(1Mbps以上),具备曲线插补等高级指令,在精密加工领域表现突出。两者的主要差异体现在数据传输(帧结构、速率)、指令集(功能、数量)、参数调节(范围、精度)和错误处理机制等方面。实际应用中,XY2-100适合简单图形的大批量生产,SL2-100更胜任复杂曲面的高精度加工。选择时需综合考虑打标需求、设备兼容性和成本因素,未来两种协议将持续优

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 959

python代码示例100行-100行Python代码,轻松搞定神经网络

大数据文摘出品来源:eisenjulian编译:周家乐、钱天培用tensorflow,pytorch这类深度学习库来写一个神经网络早就不稀奇了。可是,你知道怎么用python和numpy来优雅地搭一个神经网络嘛?现如今,有多种深度学习框架可供选择,他们带有自动微分、基于图的优化计算和硬件加速等各种重要特性。对人们而言,似乎享受这些重要特性带来的便利已经是理所当然的事儿了。但其实,瞧一瞧隐藏在这些特...

weixin_37988176的博客 1264

飞牛fnNAS搭建Web网页版OFFICE(WPS)软件

本文介绍了如何在飞牛NAS上通过Docker容器部署WPS Office办公软件。主要内容包括:启用Docker服务、准备项目文件夹结构、使用Compose方式构建容器、解决端口冲突问题、配置中文输入法和字体库,以及通过ZeroTier实现远程访问。文章详细说明了每个步骤的操作方法,包括容器启动、输入法设置、字体添加和文件存储位置配置。最后还介绍了使用ZeroTier内网穿透技术实现远程访问NAS上WPS服务的方法,让用户可以在不同设备上随时编辑NAS中的文件。整个部署过程完整清晰,为NAS用户提供了便捷的

dgnankai的专栏 1705

python矩阵求导代码_只需100行Python代码,手把手教你轻松搞定神经网络

原标题:只需100行Python代码,手把手教你轻松搞定神经网络 导读:今天,就来手把手教大家搭一个神经网络。原料就是简单的python和numpy代码用tensorflow,pytorch这类深度学习库来写一个神经网络早就不稀奇了。可是,你知道怎么用python和numpy来优雅地搭一个神经网络嘛?现如今,有多种深度学习框架可供选择,他们带有自动微分、基于图的优化计算和硬件加速等各种重要特性。对...

weixin_39830323的博客 841

华为OD机试双机位C卷-水库溃坝填补(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【水库溃坝填补】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。水库溃坝填补。

qq_45776114的博客 2110

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

bp神经网络预测python代码_100行Python代码,轻松搞定神经网络

大数据文摘出品来源:eisenjulian编译:周家乐、钱天培用tensorflow,pytorch这类深度学习库来写一个神经网络早就不稀奇了。可是,你知道怎么用python和numpy来优雅地搭一个神经网络嘛?现如今,有多种深度学习框架可供选择,他们带有自动微分、基于图的优化计算和硬件加速等各种重要特性。对人们而言,似乎享受这些重要特性带来的便利已经是理所当然的事儿了。但其实,瞧一瞧隐藏在这些特...

weixin_39568232的博客 896

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python 神经网络_100行Python代码,轻松搞定神经网络

大数据文摘出品来源:eisenjulian编译:周家乐、钱天培用tensorflow,pytorch这类深度学习库来写一个神经网络早就不稀奇了。可是,你知道怎么用python和numpy来优雅地搭一个神经网络嘛?现如今,有多种深度学习框架可供选择,他们带有自动微分、基于图的优化计算和硬件加速等各种重要特性。对人们而言,似乎享受这些重要特性带来的便利已经是理所当然的事儿了。但其实,瞧一瞧隐...

weixin_39804335的博客 112

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python小游戏代码200行左右加入神经网络代码_100行Python代码,轻松搞定神经网络...

大数据文摘出品来源:eisenjulian编译:周家乐、钱天培用tensorflow,pytorch这类深度学习库来写一个神经网络早就不稀奇了。可是,你知道怎么用python和numpy来优雅地搭一个神经网络嘛?现如今,有多种深度学习框架可供选择,他们带有自动微分、基于图的优化计算和硬件加速等各种重要特性。对人们而言,似乎享受这些重要特性带来的便利已经是理所当然的事儿了。但其实,瞧一瞧隐藏在这些特...

weixin_39986171的博客 190

你知道如何用python和numpy来优雅地搭一个神经网络吗?100行代码告诉你

来源商业新知网,原标题:100行Python代码,轻松搞定神经网络 用tensorflow,pytorch这类深度学习库来写一个神经网络早就不稀奇了。 可是,你知道怎么用python和numpy来优雅地搭一个神经网络嘛? 现如今,有多种深度学习框架可供选择,他们带有自动微分、基于图的优化计算和硬件加速等各种重要特性。对人们而言,似乎享受这些重要特性带来的便利已经是理所当然的事...

135

acc定义代码 神经网络_19行关键代码,带你轻松入门PaddlePaddle单机训练

刚接触深度学习框架的同学可能会说新入手一个框架是不是会很难?NO,NO,NOPaddlePaddle的宗旨就是“easy to use!”PaddlePaddle是百度自研的集深度学习框架、工具组件和服务平台为一体的技术领先、功能完备的开源深度学习平台,有全面的官方支持的工业级应用模型,涵盖自然语言处理、计算机视觉、推荐引擎等多个领域,并开放多个领先的预训练中文模型。下面,就让作者带你打...

weixin_35662171的博客 405

一周掌握Python,AI编程工具助你轻松起飞!

最新接入DeepSeek-V3模型,点击下载最新版本InsCode AI IDE 一周掌握Python,AI编程工具助你轻松起飞! 在大学的Python课程中,许多初学者可能会面临这样的困境:复杂的语法、晦涩的概念以及繁琐的调试过程让人望而却步。然而,随着AI技术的飞速发展,学习编程的方式正在发生革命性的变化。今天,我们将向大家介绍一种全新的学习方式——借助智能化的AI编程工具,让你在短短一周内掌...

StarfallOwl89的博客 769
上一篇: 为什么Python 3.6以后字典有序并且效率更高?
下一篇: Python中正则表达式的巧妙使用 !
普通网友
博客等级 码龄7年 438粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值