Код отличной книги Мохаммада Наумана показывает это (для Джулии 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.
Как я могу использовать MNIST под Джулией 1.6.6?
Набор данных MNIST доступен из Пакет MLDatasets.jl.
Много информации доступно в документации пакета: МНИСТ.
]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, когда наборы данных были удалены (см. коммит 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)
вместо этого вы должны использовать приведенный выше код. Метки идентичны в двух случаях:
julia> train_x, train_y = MLDatasets.MNIST.traindata();
julia> Data.MNIST.labels(:train) == train_y
true
Однако Flux.Data.MNIST.images(:train)
возвращает Vector
изображений (матрицы 28x28 с eltype
Gray{N0f8}
), а MLDatasets возвращает (более или менее) трехмерный тензор (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
Полный пример находится здесь: sylvaticus.github.io/SPMLJ/stable/04_-NN-Нейронные_сети/0402-_Implementation_of_neural_networks_workflows.html#Convolutional-neural-networks
Единственные вызовы API, которые у вас есть, это .traindata и .testdata. Мне нужен пример использования readimageheader и readimages.
@DeanSchulze Я добавил некоторую информацию к ответу. Если вам нужно что-то очень конкретное, возможно, вы могли бы написать новый вопрос с дополнительной информацией. Как я написал в ответе, у меня нет доступа к книге, поэтому я не могу найти пример.
Должно быть, они также полностью изменили API. MNIST.images() больше не существует.