Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >基于DiffEqFlux的神经ODE反向传播过程中的标量运算

基于DiffEqFlux的神经ODE反向传播过程中的标量运算
EN

Stack Overflow用户
提问于 2019-12-27 10:45:14
回答 1查看 219关注 0票数 2

我正在使用Julia中的DiffEqFlux包来实现一个神经ODE。我在让它在GPU上工作时遇到了问题。

最简单的例子如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using DifferentialEquations
using Flux, DiffEqFlux
using CuArrays
CuArrays.allowscalar(false)

x = Float32[2.; 0.]|>gpu
tspan = Float32.((0.0f0,25.0f0))
dudt = Chain(Dense(2,50,tanh),Dense(50,2))|>gpu

loss() = sum(neural_ode(dudt,x,tspan,Tsit5(),save_everystep=false,save_start=false))

@show(loss())
Flux.back!(loss())

和stacktrace:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
loss() = -24.529072f0 (tracked)
ERROR: LoadError: scalar getindex is disallowed
Stacktrace:
 [1] error(::String) at ./error.jl:33
 [2] assertscalar(::String) at /home/vshanka2/.julia/packages/GPUArrays/1wgPO/src/indexing.jl:14
 [3] getindex at /home/vshanka2/.julia/packages/GPUArrays/1wgPO/src/indexing.jl:54 [inlined]
 [4] getindex at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.1/LinearAlgebra/src/adjtrans.jl:129 [inlined]
 [5] _unsafe_getindex_rs at ./reshapedarray.jl:245 [inlined]
 [6] _unsafe_getindex at ./reshapedarray.jl:242 [inlined]
 [7] getindex at ./reshapedarray.jl:231 [inlined]
 [8] macro expansion at ./multidimensional.jl:671 [inlined]
 [9] macro expansion at ./cartesian.jl:64 [inlined]
 [10] macro expansion at ./multidimensional.jl:666 [inlined]
 [11] _unsafe_getindex! at ./multidimensional.jl:662 [inlined]
 [12] _unsafe_getindex(::IndexLinear, ::Base.ReshapedArray{Float32,1,LinearAlgebra.Adjoint{Float32,CuArray{Float32,1,Nothing}},Tuple{}}, ::UnitRange{Int64}) at ./multidimensional.jl:656
 [13] _getindex at ./multidimensional.jl:642 [inlined]
 [14] getindex(::Base.ReshapedArray{Float32,1,LinearAlgebra.Adjoint{Float32,CuArray{Float32,1,Nothing}},Tuple{}}, ::UnitRange{Int64}) at ./abstractarray.jl:927
 [15] (::getfield(Tracker, Symbol("##429#432")){Base.ReshapedArray{Float32,1,LinearAlgebra.Adjoint{Float32,CuArray{Float32,1,Nothing}},Tuple{}}})(::TrackedArray{,CuArray{Float32,1,CuArray{Float32,2,Nothing}}}) at /home/vshanka2/.julia/packages/Tracker/cpxco/src/lib/array.jl:196
 [16] iterate at ./generator.jl:47 [inlined]
 [17] collect(::Base.Generator{Tuple{TrackedArray{,CuArray{Float32,1,CuArray{Float32,2,Nothing}}},TrackedArray{,CuArray{Float32,1,Nothing}},TrackedArray{,CuArray{Float32,1,CuArray{Float32,2,Nothing}}},TrackedArray{,CuArray{Float32,1,Nothing}}},getfield(Tracker, Symbol("##429#432")){Base.ReshapedArray{Float32,1,LinearAlgebra.Adjoint{Float32,CuArray{Float32,1,Nothing}},Tuple{}}}}) at ./array.jl:606
 [18] #428 at /home/vshanka2/.julia/packages/Tracker/cpxco/src/lib/array.jl:193 [inlined]
 [19] back_(::Tracker.Call{getfield(Tracker, Symbol("##428#431")){Tuple{TrackedArray{,CuArray{Float32,1,CuArray{Float32,2,Nothing}}},TrackedArray{,CuArray{Float32,1,Nothing}},TrackedArray{,CuArray{Float32,1,CuArray{Float32,2,Nothing}}},TrackedArray{,CuArray{Float32,1,Nothing}}}},Tuple{Tracker.Tracked{CuArray{Float32,1,CuArray{Float32,2,Nothing}}},Tracker.Tracked{CuArray{Float32,1,Nothing}},Tracker.Tracked{CuArray{Float32,1,CuArray{Float32,2,Nothing}}},Tracker.Tracked{CuArray{Float32,1,Nothing}}}}, ::Base.ReshapedArray{Float32,1,LinearAlgebra.Adjoint{Float32,CuArray{Float32,1,Nothing}},Tuple{}}, ::Bool) at /home/vshanka2/.julia/packages/Tracker/cpxco/src/back.jl:35
 [20] back(::Tracker.Tracked{CuArray{Float32,1,Nothing}}, ::Base.ReshapedArray{Float32,1,LinearAlgebra.Adjoint{Float32,CuArray{Float32,1,Nothing}},Tuple{}}, ::Bool) at /home/vshanka2/.julia/packages/Tracker/cpxco/src/back.jl:58
 [21] (::getfield(Tracker, Symbol("##13#14")){Bool})(::Tracker.Tracked{CuArray{Float32,1,Nothing}}, ::Base.ReshapedArray{Float32,1,LinearAlgebra.Adjoint{Float32,CuArray{Float32,1,Nothing}},Tuple{}}) at /home/vshanka2/.julia/packages/Tracker/cpxco/src/back.jl:38
 [22] foreach(::Function, ::Tuple{Tracker.Tracked{CuArray{Float32,1,Nothing}},Nothing,Nothing,Nothing}, ::Tuple{Base.ReshapedArray{Float32,1,LinearAlgebra.Adjoint{Float32,CuArray{Float32,1,Nothing}},Tuple{}},CuArray{Float32,1,Nothing},Nothing,Nothing}) at ./abstractarray.jl:1867
 [23] back_(::Tracker.Call{getfield(DiffEqFlux, Symbol("##25#28")){DiffEqSensitivity.SensitivityAlg{0,true,Val{:central}},Base.Iterators.Pairs{Symbol,Bool,Tuple{Symbol},NamedTuple{(:save_everystep,),Tuple{Bool}}},TrackedArray{,CuArray{Float32,1,Nothing}},CuArray{Float32,1,Nothing},Tuple{Tsit5},ODESolution{Float32,2,Array{CuArray{Float32,1,Nothing},1},Nothing,Nothing,Array{Float32,1},Array{Array{CuArray{Float32,1,Nothing},1},1},ODEProblem{CuArray{Float32,1,Nothing},Tuple{Float32,Float32},false,CuArray{Float32,1,Nothing},ODEFunction{false,getfield(DiffEqFlux, Symbol("#dudt_#32")){Chain{Tuple{Dense{typeof(tanh),TrackedArray{,CuArray{Float32,2,Nothing}},TrackedArray{,CuArray{Float32,1,Nothing}}},Dense{typeof(identity),TrackedArray{,CuArray{Float32,2,Nothing}},TrackedArray{,CuArray{Float32,1,Nothing}}}}}},LinearAlgebra.UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{,Tuple{}}},DiffEqBase.StandardODEProblem},Tsit5,OrdinaryDiffEq.InterpolationData{ODEFunction{false,getfield(DiffEqFlux, Symbol("#dudt_#32")){Chain{Tuple{Dense{typeof(tanh),TrackedArray{,CuArray{Float32,2,Nothing}},TrackedArray{,CuArray{Float32,1,Nothing}}},Dense{typeof(identity),TrackedArray{,CuArray{Float32,2,Nothing}},TrackedArray{,CuArray{Float32,1,Nothing}}}}}},LinearAlgebra.UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Array{CuArray{Float32,1,Nothing},1},Array{Float32,1},Array{Array{CuArray{Float32,1,Nothing},1},1},OrdinaryDiffEq.Tsit5ConstantCache{Float32,Float32}},DiffEqBase.DEStats}},Tuple{Tracker.Tracked{CuArray{Float32,1,Nothing}},Nothing,Nothing,Nothing}}, ::CuArray{Float32,1,Nothing}, ::Bool) at /home/vshanka2/.julia/packages/Tracker/cpxco/src/back.jl:38
 [24] back(::Tracker.Tracked{CuArray{Float32,1,Nothing}}, ::CuArray{Float32,1,Nothing}, ::Bool) at /home/vshanka2/.julia/packages/Tracker/cpxco/src/back.jl:58
 [25] #13 at /home/vshanka2/.julia/packages/Tracker/cpxco/src/back.jl:38 [inlined]
 [26] foreach at ./abstractarray.jl:1867 [inlined]
 [27] back_(::Tracker.Call{getfield(Tracker, Symbol("##484#485")){TrackedArray{,CuArray{Float32,1,Nothing}}},Tuple{Tracker.Tracked{CuArray{Float32,1,Nothing}}}}, ::Float32, ::Bool) at /home/vshanka2/.julia/packages/Tracker/cpxco/src/back.jl:38
 [28] back(::Tracker.Tracked{Float32}, ::Int64, ::Bool) at /home/vshanka2/.julia/packages/Tracker/cpxco/src/back.jl:58
 [29] #back!#15 at /home/vshanka2/.julia/packages/Tracker/cpxco/src/back.jl:77 [inlined]
 [30] #back! at ./none:0 [inlined]
 [31] #back!#32 at /home/vshanka2/.julia/packages/Tracker/cpxco/src/lib/real.jl:16 [inlined]
 [32] back!(::Tracker.TrackedReal{Float32}) at /home/vshanka2/.julia/packages/Tracker/cpxco/src/lib/real.jl:14
 [33] top-level scope at none:0
 [34] include at ./boot.jl:326 [inlined]
 [35] include_relative(::Module, ::String) at ./loading.jl:1038
 [36] include(::Module, ::String) at ./sysimg.jl:29
 [37] include(::String) at ./client.jl:403
 [38] top-level scope at none:0

正向传递可以很好地工作,但向后调用会导致标量getindex。如果我允许标量,当然没有问题,但它比cpu慢得多(即使是对于我正在处理的更大的问题)。

我不确定它是否与任何包依赖关系有关,但以下是我目前安装的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  [fbb218c0] BSON v0.2.4
  [c5f51814] CUDAdrv v5.0.1
  [be33ccc6] CUDAnative v2.7.0
  [3a865a2d] CuArrays v1.6.0
  [aae7a2af] DiffEqFlux v0.7.0
  [9fdde737] DiffEqOperators v4.6.1
  [0c46a032] DifferentialEquations v6.9.0
  [587475ba] Flux v0.8.3
  [a98d9a8b] Interpolations v0.12.5
  [15e1cf62] NPZ v0.4.0
  [91a5bcdd] Plots v0.28.4

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-28 18:54:46

此问题已在DiffEqFlux 0.10.1上修复。执行]up以进行升级,或执行]add DiffEqFlux@0.10.1以明确要求此版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59499585

复制
相关文章
CNN的反向传播DNN中的反向传播卷积神经网络中的反向传播
DNN中的反向传播 反向传播算法是神经网络的训练的基本算法组成之一,在训练神经网络时,训练分为两个步骤:计算梯度和更新权值。其中反向传播负责的是梯度的计算,而训练算法的区分主要在更新权值的方式上。对于DNN,基本的反向传播思路为: $$\cfrac{dz}{dw_{i}} = \cfrac{dz}{da_{i+1}} \times \cfrac{da_{i+1}}{dw_{i}}$$ 其中,$\cfrac{dz}{dw_{i}}$为输出(多为代价函数输出)对第i层的权值的梯度,$\cfrac{da_{i+1
月见樽
2018/04/27
1.2K0
卷积神经网络中卷积运算的前向传播与反向传播推导
版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/90412121
Tyan
2019/05/25
1.2K0
使用矩阵运算加速实现神经网络误差的反向传播
在上一节,我们通过逐步分析的方式讲清楚了神经网络是如何将终端计算获得的误差逐层反向传播给每一个神经元的,同时我们根据节点链路上的权重比值,将误差依次分配给对应的节点,并通过笔算的方式计算了下面例子中每
望月从良
2018/07/19
1.3K0
卷积神经网络的反向传播
---- 反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。其主要思想是: 将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果,这是ANN的前向传播过程; 由于ANN的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层; 在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。 反向传播算法的思想比较
计算机视觉研究院
2018/04/17
9420
卷积神经网络的反向传播
神经网络之反向传播
上节课给大家简单介绍了神经网络,并且重点介绍了神经网络的前向传播工作原理。可能有些同学觉得难,因为上节课涉及到一些矩阵运算,以前没有学过线性代数的同学可能就看不懂了。这里想告诉大家的是,深度学习确实是需要数学基础的,接下来还会有不少求导(偏导)、向量以及矩阵运算等等,要求掌握高数、线性代数等学科知识,所以深度学习不是人人都适合学的。
用户7569543
2020/07/20
6960
神经网络之反向传播
神经网络,激活函数,反向传播
目录 1. 深度学习有哪些应用 2. 什么是神经网络 2.1 什么是感知器 2.2 神经网络的结构 2.3 为什么神经网络具有非线性切分能力 3. 神经网络的计算过程 3.1 计算过程 3.2 随机初
大数据技术与机器学习
2019/11/20
7800
【深度学习 | 反向传播】释放反向传播的力量: 让训练神经网络变得简单
反向传播算法是一种用于训练神经网络的常用优化算法。它通过计算损失函数对每个参数的梯度,然后根据这些梯度更新参数值,以使得神经网络能够逐步调整和改进其预测结果。
计算机魔术师
2023/10/18
4380
【深度学习 | 反向传播】释放反向传播的力量: 让训练神经网络变得简单
神经网络基础:反向传播算法
反向传播(Backpropagation,简称 BP)是目前用来训练人工神经网络(Artificial Neural Network,简称 ANN)算法最常用、最有效的方法。
HyperAI超神经
2019/11/29
1.4K0
卷积神经网络反向传播推导
Disclaimer: It is assumed that the reader is familiar with terms such as Multilayer Perceptron, delta errors or backpropagation. If not, it is recommended to read for example a chapter 2 of free online book ‘Neural Networks and Deep Learning’ by Michael N
量化投资与机器学习微信公众号
2018/01/30
1K0
卷积神经网络反向传播推导
神经网络与反向传播算法
1、前言 先简单的说下神经网络吧。 简单来说就是模拟大脑的神经元。 前端会有一大批数据输入,例如,前端输入了一张图像的所有像素点。 中间层会有成千上万个网络数据节点,我们可以称之为神经元。 一系列的神
企鹅号小编
2018/01/08
5820
神经网络与反向传播算法
使用反向传播训练多层神经网络的原理
文章《Principles of training multi-layer neural network using backpropagation 》提供了直观理解反向传播的完整例子。以下是原文翻译。
用户9624935
2022/04/02
7360
使用反向传播训练多层神经网络的原理
神经网络的反向传播算法—ML Note 52
上一小节讲了神经网络的代价函数,这一小节讲解一个让代价函数最小化的算法:反向传播算法。
讲编程的高老师
2020/09/21
5420
神经网络的反向传播算法—ML Note 52
深度神经网络之反向传播算法
现在对应到我们的DNN模型之中,即输入层有n_in个神经元,输出层有n_out个神经元,再加上一些含有若干个神经元的隐含层。此时我们需要找到所有隐含层和输出层所对应的线性系数矩阵W、偏倚向量b,希望通
小一
2019/08/14
7940
深度神经网络之反向传播算法
【DL笔记4】神经网络,正向传播和反向传播
从【DL笔记1】到【DL笔记N】,是我学习深度学习一路上的点点滴滴的记录,是从Coursera网课、各大博客、论文的学习以及自己的实践中总结而来。从基本的概念、原理、公式,到用生动形象的例子去理解,到动手做实验去感知,到著名案例的学习,到用所学来实现自己的小而有趣的想法......我相信,一路看下来,我们可以感受到深度学习的无穷的乐趣,并有兴趣和激情继续钻研学习。 正所谓 Learning by teaching,写下一篇篇笔记的同时,我也收获了更多深刻的体会,希望大家可以和我一同进步,共同享受AI无穷的乐趣。
beyondGuo
2018/10/25
9000
【DL笔记4】神经网络,正向传播和反向传播
CNN卷积神经网络和反向传播[通俗易懂]
如果我们把图像中的像素点顺序排列作为输入层神经元的值,对于28×28像素的图像,输入神经元有28×28=784个。但是用这种全连接的网络去做图像分类是很奇怪的,因为它没有考虑图像的空间结构(局部特征),它相同看待那些相距很近和很远的像素,这是不好的。
全栈程序员站长
2022/09/07
1.3K0
CNN卷积神经网络和反向传播[通俗易懂]
反向传播神经网络极简入门
我一直在找一份简明的神经网络入门,然而在中文圈里并没有找到。直到我看到了这份162行的Python实现,以及对应的油管视频之后,我才觉得这就是我需要的极简入门资料。这份极简入门笔记不需要突触的图片做装饰,也不需要赘述神经网络的发展历史;要推导有推导,要代码有代码,关键是,它们还对得上。对于欠缺的背景知识,利用斯坦福大学的神经网络wiki进行了补全。 单个神经元 神经网络是多个“神经元”(感知机)的带权级联,神经网络算法可以提供非线性的复杂模型,它有两个参数:权值矩阵{Wl}和偏置向量{bl},不同于感知机的
机器学习AI算法工程
2018/03/13
1.2K0
反向传播神经网络极简入门
神经网络–反向传播详细推导过程
为了描述神经网络,我们先从最简单的神经网络讲起,这个神经网络仅由一个“神经元”构成,以下即是这个“神经元”的图示:
全栈程序员站长
2022/08/23
7740
神经网络–反向传播详细推导过程
反向传播算法推导-卷积神经网络
在SIGAI之前的公众号文章“反向传播算法推导-全连接神经网络”中,我们推导了全连接神经网络的反向传播算法。其核心是定义误差项,以及确定误差项的递推公式,再根据误差项得到对权重矩阵、偏置向量的梯度。最后用梯度下降法更新。卷积神经网络由于引入了卷积层和池化层,因此情况有所不同。在今天这篇文章中,我们将详细为大家推导卷积神经网络的反向传播算法。对于卷积层,我们将按两条路线进行推导,分别是标准的卷积运算实现,以及将卷积转化成矩阵乘法的实现。在文章的最后一节,我们将介绍具体的工程实现,即卷积神经网络的卷积层,池化层,激活函数层,损失层怎样完成反向传播功能。
SIGAI学习与实践平台
2018/08/07
8940
反向传播算法推导-卷积神经网络
反向传播与神经网络初步(下)
神经网络训练过程:通过前馈得到损失,通过反馈得到梯度,通过对梯度的使用来完成权值更新。
听城
2018/08/30
3080
反向传播与神经网络初步(下)
卷积神经网络(CNN)反向传播算法
    在卷积神经网络(CNN)前向传播算法中,我们对CNN的前向传播算法做了总结,基于CNN前向传播算法的基础,我们下面就对CNN的反向传播算法做一个总结。在阅读本文前,建议先研究DNN的反向传播算法:深度神经网络(DNN)反向传播算法(BP)
刘建平Pinard
2018/08/08
8000

相似问题

基于php的神经网络-如何实现反向传播

10

基于Java的神经网络--如何实现反向传播

32

神经网络的反向传播

12

用DiffEqFlux预测ODE参数

15

神经网络反向传播

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文