如何在 Julia 1.6.6 中添加和使用 MNIST?

Dea*_*lze 0 julia mnist

Mohammad Nauman 的优秀著作的代码显示了这一点(对于 Julia 1.5.3):

using Flux, Statistics 
using Flux.Data.MNIST
using Flux: onehotbatch
Run Code Online (Sandbox Code Playgroud)

在 Julai 1.6.6 下失败了

UndefVarError: MNIST not defined

Stacktrace:
 [1] eval
   @ ./boot.jl:360 [inlined]
 [2] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
   @ Base ./loading.jl:1116
Run Code Online (Sandbox Code Playgroud)

所以我尝试

] add MNIST
Run Code Online (Sandbox Code Playgroud)

这使

The following package names could not be resolved:
 * MNIST (not found in project, manifest or registry)
Run Code Online (Sandbox Code Playgroud)

如果我尝试

using MNIST
Run Code Online (Sandbox Code Playgroud)

它给

ArgumentError: Package MNIST not found in current path:
- Run `import Pkg; Pkg.add("MNIST")` to install the MNIST package.
Run Code Online (Sandbox Code Playgroud)

如果我然后尝试推荐的

import Pkg; Pkg.add("MNIST")
Run Code Online (Sandbox Code Playgroud)

它给

The following package names could not be resolved:
 * MNIST (not found in project, manifest or registry)
Run Code Online (Sandbox Code Playgroud)

作者的代码在1.6.6下也给出了同样的错误。

如何在 Julia 1.6.6 下使用 MNIST?

ahn*_*abb 5

MNIST 数据集可从MLDatasets.jl 包中获取。

包文档中提供了大量信息:MNIST

]add MLDatasets
Run Code Online (Sandbox Code Playgroud)
using MLDatasets

# load training set
train_x, train_y = MNIST.traindata()

# load test set
test_x,  test_y  = MNIST.testdata()
Run Code Online (Sandbox Code Playgroud)

扩展上述内容并添加一些背景信息。我没有这本书,所以我无法准确检查使用的 Flux 版本,但它是 v0.12.0 之前的某个版本,即删除数据集(请参阅提交 b78cd76)以支持 MLDatasets (相关 PR) 。当然,拥有不同的 Julia 版本并不妨碍您安装旧版本的 Flux。如果这是您面临的唯一问题,我不建议选择旧版本的 Flux。最新的教程将使用 MLDatasets,并且 Julia 社区通常倾向于出于特定目的而集中在单个包上。

为了澄清上面的例子:

你之前会做的地方:

train_x = MNIST.images(:train)
train_y = MNIST.labels(:train)

test_x = MNIST.images(:train)
test_y = MNIST.labels(:train)
Run Code Online (Sandbox Code Playgroud)

您现在可以使用上面的代码。这两种情况下的标签是相同的:

julia> train_x, train_y = MLDatasets.MNIST.traindata();

julia> Data.MNIST.labels(:train) == train_y
true
Run Code Online (Sandbox Code Playgroud)

但是,Flux.Data.MNIST.images(:train)返回Vector图像(带有 的 28x28 矩阵eltype Gray{N0f8}),而 MLDatasets 返回(或多或少)3D 张量 (28x28x60000)。为了获得与 Flux.Data.MNIST 中的数据相同的数据,我们需要拆分张量矩阵,将它们转换为图像(Gray元素),然后转置它们。

julia> using ImageCore
julia> map(transpose, eachslice(Gray.(train_x); dims=3)) == Data.MNIST.images(:train)
true
Run Code Online (Sandbox Code Playgroud)

如果您决定更喜欢使用旧版本的 Flux,您可以尝试 v0.12.2 - v0.12.10。它们与您的 Julia 版本兼容并且“仍然”具有Flux.Data.MNIST(数据集已添加回来但标记为已弃用):

pkg> add Flux#v0.12.10
Run Code Online (Sandbox Code Playgroud)