问题标签 [flux.jl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
julia - 贝叶斯 ODE 与 Julia
我一直在尝试实现贝叶斯 ODE。在石油行业,我们使用以下等式拟合生产数据然后进行预测:
ODE 方程描述为:
其中 0<n<1,n 和 K 是通过拟合原始生产数据定义的参数,在我的情况下,K 为 0.17,n = 0.87。
我的初始代码:
不知道如何解决这个问题:
julia - 在 Julia 中使用带有 GPU 的通量时出错
以上是我第一个使用flux和julia的深度学习项目。尝试使用 GPU 时出现以下错误。
RuntimeError: <PyCall.jlwrap (在从 Python 调用的 Julia 函数中) JULIA: InvalidIRError: 编译内核 getindex_kernel(CUDA.CuKernelContext, CuDeviceArray{Float32,4,1}, CuDeviceArray{Float32,4,1}, NTuple{4,Int64 }, Base.Slice{Base.OneTo{Int64}}, Base.Slice{Base.OneTo{Int64}}, Base.Slice{Base.OneTo{Int64}}, CuDeviceArray{Int64,1,1}) 导致无效LLVM IR 原因:不支持的动态函数调用(调用 pointerref(ptr::Core.LLVMPtr{T,A}, i::Int64, ::Val{align}) where {T, A, align} in LLVM.Interop at /root/.julia/packages/LLVM/F9DFY/src/interop/pointer.jl:7)
任何帮助都会很棒。我正在为这个项目使用 Kaggle 环境。
julia - 在 Julia 中对机器学习 (flux) 代码进行基准测试
我正在尝试对Flux
下面提到的代码的性能进行基准测试:
我尝试使用内置tick()
和tock()
功能来测量时间。但是,这给了执行密集比较的基本时间并且效率不高。社区中的许多开发人员都建议使用BenchmarkTools.jl
package 来对代码进行基准测试。但是当我尝试ScikitLearn Model
在 REPL 中进行基准测试时,它会产生警告;
REPL
同样,我尝试在using中对上述代码进行基准测试,@btime
但它会引发此错误:
我可以知道执行代码详细基准测试的最佳方法是什么?
提前致谢。
performance - Flux.jl 没有利用 julia 中所有可用的线程进行机器学习
我对下面提到的来自model-zoo的通量代码进行了基准测试。我注意到一些性能问题:
- Flux 比等效的 python 慢。
- Flux 不会利用所有线程来执行(通常 CPU 使用率约为 50%)。
代码:
我曾尝试使用sysimage
包含pre-compilation
文件运行此代码,但结果仍然不支持通量。
请评论我在这段代码中的错误,这使得它比 python 慢。正如我想知道的那样,朱莉娅应该比 python 快。
我还在julia-discourse上发布了这个问题。
提前致谢!
julia - 使用 Zygote 在 Julia 中计算包含 NN wrt 参数的损失函数的 Hessian
您将如何计算由神经网络 wrt NN 参数组成的损失函数的粗麻布?
例如,考虑下面的损失函数
我可以通过两种方式获得渐变 wrt 参数……</p>
或者
但是,我找不到一种方法来获取粗麻布的参数。(我想做类似的事情Zygote.hessian(model -> loss(model), model)
,但Zygote.hessian
不::Params
作为输入)
最近,一个jacobian
函数被添加到 master 分支(issue #910),它被理解::Params
为一个 input。
我一直在尝试组合gradient
并jacobian
获得粗麻布(因为粗麻布是函数梯度的雅可比),但无济于事。我认为问题在于这model
是一个Chain
包含通用函数的对象,reshape
并且σ.
缺少参数,但我无法超越这一点。
编辑:作为参考,我之前在 pytorch 中创建了这个
neural-network - 创建一个简单的神经网络来预测和生成音乐
我目前正在尝试实现一个神经网络,它将根据给定的训练生成音乐。我正在使用 Flux 包在 Julia 中编写,但是我发现文档有点难以掌握(我理解 nn 背后的逻辑,但是,我仍然对不同函数的作用感到困惑)。
我首先设置了一些训练数据以输入模型:
想法是将标签索引 1 处的值输入模型,并告诉它预期输出是索引 2 处的值。然后给它索引 2,并说预期输出是索引 3,依此类推。然后,这些值充当地图,我们可以使用它来获得原始音高和节奏。
我是否正确地说该模型将能够根据预测生成一些音乐?
有人能给我一个关于如何创建模型来实现这一目标的先机吗?
干杯
machine-learning - Julia Flux 中循环神经网络训练中的歧义
我正在使用 Julia 的 Flux 库来学习神经网络。根据train!
(其中train!
需要参数(loss, params, data, opt)
)的文档:
对于 data 中的每个数据点 d,通过反向传播计算相对于 params 的损失梯度并调用优化器 opt。
(参见来源train!
:https ://github.com/FluxML/Flux.jl/blob/master/src/optimise/train.jl )
对于基于传统的神经网络Dense
——比方说具有一维输入和输出,即具有一个特征——这很容易理解。中的每个元素data
都是一对单个数字,是一维输入/输出值的独立样本。 train!
一次对每对一维样本进行一个前向和反向传播。在此过程中,loss
函数会在每个样本上进行评估。(我有这个权利吗?)
我的问题是:这如何扩展到循环神经网络?以具有一维(即一个特征)输入和输出的 RNN 为例。似乎在如何构造输入和输出数据方面存在一些歧义,并且结果会根据结构而变化。举个例子:
(loss
函数取自:https ://github.com/FluxML/Flux.jl/blob/master/docs/src/models/recurrence.md )
在此示例中,当train!
循环遍历每个样本 ( for d in data
) 时, 的每个值都是来自和d
的一对单个值,例如。 基于这些单一值进行评估。这与本案相同。x
y
([1], 4)
loss
Dense
另一方面,考虑:
请注意,这里唯一的区别是x
和y
嵌套在一对额外的方括号中。结果只有一个d in data
,它是一对序列:([[1], [2], [3]], [4, 5, 6])
。 loss
可以在这个版本的 上进行评估d
,并且它返回一个 1-d 值,这是训练所需的。但是返回的值loss
与前一个案例的三个结果中的任何一个都不同,因此训练过程结果不同。
关键是这两种结构在某种意义上都是有效的,loss
并且可以train!
毫无错误地处理它们。从概念上讲,我可以论证两种结构都是正确的。但结果不同,我认为只有一种方法是正确的。换句话说,对于训练一个 RNN,每个应该d in data
是一个完整的序列,还是一个序列中的单个元素?
julia - 由于策略争论,使用 NueralPDE.jl 中的 PhysicsInformedNN() 时出现 MethodError
我正在尝试通过阅读此处找到的文档教程来学习用于某些 PINN 工作的 NeuralPDE.jl 的语法。
使用 PhysicsInformedNN(chain, strategy) 函数构建 PINN 算法时,无论我尝试使用哪种策略,都会收到 MethodError。该教程建议使用 GridTraining(.05),我也尝试了 StochasticTraining(::Int64),但没有成功。
错误:
machine-learning - Julia Flux 梯度函数的奇怪结果
在我上一个关于使用 Flux 训练循环神经网络的困惑之后,我更深入地研究了 Flux 训练过程,现在我更加困惑了。我认为我的麻烦在于在loss
函数中使用总和,因此损失会考虑到序列中的许多点。请参见此处,其中损失定义为:
loss(x, y) = sum((Flux.stack(m.(x),1) .- y) .^ 2)
如果x
是具有多个点的序列,并且y
是每个点的对应输出,则此loss
函数评估整个序列的损失。我想了解的是 Flux 如何采用这样的函数的梯度。想象一下将其简化为:
L(x, y) = sum((Flux.stack(m.(x), 1) .- y))
我们还可以创建一个非常简单的循环神经“网络”作为单个 1 -> 1 节点,没有激活函数:
m = Flux.RNN(1, 1, x -> x)
这(有点)相当于:
loss
相对于的梯度是Wx
多少?取一个包含两个点的序列,x = [x1, x2] 和 y* = [y1*, y2*]。将 x1 通过 RNN 得到:
y1 = h2 = Wx*x1 + Wh*h1 + b
然后把 x2 通过,你得到:
y2 = h3 = Wx*x2 + Wh*h2 + b = Wx*x2 + Wh*(Wx*x1 + Wh*h1 + b) + b。
现在计算损失:
L = y1 - y1* + y2 - y2* = Wx*x1 + Wh*h1 + b - y1* + Wx*x2 + Wh*(Wx*x1 + Wh*h1 + b) + b - y2*
很明显,dL/dWx 应该是 x1 + x2 + Wh*x1。所以让我们说x
并且y
是:
并且参数被初始化为:
如果计算 dL/DWx = x1 + x2 + Wh*x1,则为 2.8003。您也可以尝试有限差分:
并得到 2.8003。但是如果你使用 Flux 的gradient
功能:
你得到 2.8025,这似乎是 x1 + x2 + Wh*x2。我不明白为什么结果会有所不同,尤其是考虑到在评估两个不同的损失函数本身时一切都是一致的。有什么我忽略的吗?里面有什么奇怪的事情gradient
吗?