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

How do I add and use MNIST in Julia 1.6.6?

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

using Flux, Statistics 
using Flux.Data.MNIST
using Flux: onehotbatch

在 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

所以我试试

] add MNIST

这给出了

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

如果我尝试

using MNIST

它给出

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

如果我再试试推荐的

import Pkg; Pkg.add("MNIST")

它给出

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

作者的代码在1.6.6下也报同样的错误

如何在 Julia 1.6.6 下使用 MNIST?

MNIST 数据集可从 MLDatasets.jl package

软件包文档中提供了很多信息:MNIST

]add MLDatasets
using MLDatasets

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

# load test set
test_x,  test_y  = MNIST.testdata()

对上述内容进行扩展并添加一些背景信息。我没有这本书,所以我无法确切检查使用的是哪个版本的 Flux,但它是 v0.12.0 之前的某个版本,也就是删除数据集时 (see commit b78cd76) in favor of MLDatasets (relevant 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)

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

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

julia> Data.MNIST.labels(:train) == train_y
true

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

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

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

pkg> add Flux#v0.12.10

您可以通过以下方式使用 MLDatasets:

using Flux
using Flux: Data.DataLoader
using Flux: onehotbatch, onecold, crossentropy
using Flux: @epochs
using Statistics
using MLDatasets
# Load the data
x_train, y_train = MLDatasets.MNIST.traindata()
x_valid, y_valid = MLDatasets.MNIST.testdata()
# Add the channel layer
x_train = Flux.unsqueeze(x_train, 3)
x_valid = Flux.unsqueeze(x_valid, 3)
# Encode labels
y_train = onehotbatch(y_train, 0:9)
y_valid = onehotbatch(y_valid, 0:9)
# Create the full dataset
train_data = DataLoader(x_train, y_train, batchsize=128)

(来源:https://towardsdatascience.com/deep-learning-with-julia-flux-jl-story-7544c99728ca

但是,我在 book/course 中关于形状的讨论将不匹配,因为数据结构在 MLDatasets 包中发生了变化。如果您想认真关注该讨论,我建议您安装我正在使用的版本。如果你愿意花时间,你自己也可以理解它。

免责声明:本人是原作者post。