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?
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)