PR

オライリーのゼロから作るDeepLearningのMNISTにひっかかったはなし

oreilly-zero-mnist-module-error-eyecatch

今回だいぶ引っかかりました…

おなじように引っかかってこの記事にたどり着いたあなたに贈る、

解決方法です。MNISTが使いたいだけなのに、

このモジュールをインポートできるようになるまでにだいぶ時間かかりました….

相対パスがおかしいのか?

絶対パスにしないととおらないのか?

などなどいろいろ試行錯誤しました。

ちなみに私が使用している環境はVisualStudioCodeです。

それでは具体的に解説していきましょう。

この記事を読むことでわかること

自己紹介

東証一部上場企業でサラリーマンしてます。

主に工場(生産現場)で使用する検査装置のアプリケーション開発してます。

ヒトの作業を自動化して簡略化するアプリケーションを日々開発中。

2022年5月に転職。現役バリバリの技術者です。
現在は超大手企業の新規事業分野で装置の研究・開発をしています。

Youtubeチャンネルにさまざまな動画を上げています

↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓

どんなエラーがでる?

それではエラー内容についてみていきましょう。

具体的には、どんなエラーかというと、

モジュールのインポートでそんなモジュールないよ。と怒られるやつです。

エラーが出る箇所はこちら↓↓

from dataset.mnist import load_mnist

はいこれです。

この一文の意味ですが、

datasetフォルダ内にある、

mnist.pyのなかから、

load_mnistというクラスを使いますよ。

という宣言です。

この一文自体特に問題なさそうですよね。

問題は、どこに実行ファイル(.py)があって、

モジュールはどこに存在しているか?です。

書籍の相対パスが効かない?

書籍では、相対ファイルパスを使用しています。

使ってみようというファイルは、

ch03のフォルダに入っています。

ファイルの名前は、mnist_show.pyです。

では、load_mnistが格納されている、mnist.pyはどこにあるでしょう?

それが、ch03と同列に存在するdatasetフォルダの中です。

図示するとこんな感じ。↓↓↓

mnistFile
datasetフォルダとch03フォルダの関係性

というわけなので、

mnist_show.pyからmnist.pyを相対パスで指定する場合には、

ひとつ上の階層の、datasetフォルダを指定して、

そのなかのmnistを指定。

さらに、mnistのなかのload_mnistを指定することになります。

書籍では、その相対パスを実現するために、

sys.path.append(os.pardir)

という一文を使っています。

これは、親ディレクトリのパスを、相対パスに使えるようにするものです。

イメージとしては、「..」ですね。

これで一個上の階層が指定できる【はず】なので、

前出の

from dataset.mnist import load_mnist

この一文で問題なく、load_mnistが読み込めるはずでした…

ただ、これだとわたしの環境ではできませんでした。

わたしが実行した解決方法

結局のところ、

一個上の階層を相対パスに指定することをあきらめました。

単純な話ですが、フォルダの構成を変更しました。

【datasetフォルダをch03にコピー】です。

すると、

sys.path.append(os.pardir)

この一文をコメントアウトしても問題なくインポートできるようになりました。

comment-out-pardir
このようにsys.path.appendをコメントアウトしても動作する。

若干チカラワザな気もしませんが、先に進めないのでこれでやっていきます。

pardirが効かない理由がちょっとわかんないです…

まとめ

インポートがとにかくできなくて、先に進めない…

という場合には、とりあえずこれで動くようになるので、

いったんこれで様子見でいいんじゃないですかね…

コメント

タイトルとURLをコピーしました