俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

MNIST(手書き数字データ)のダウンロード/解凍を自動化する(Pythonによるスクレイピング&機械学習テクニック)

今回は、少しスクレイピングに戻って、画像の文字認識に使うためのMNIST(手書き数字データ)をダウンロードして解凍できるようになりました。機械学習では、圧縮されたデータをダウンロードして処理することもあるので、自動化できるのは非常に効率的です。

 Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]の第4章を参考にさせていただきながら、取り組んでいます。

環境構築については、Dockerを使われる方は、以下をご参照ください。

oregin-ai.hatenablog.com

OSから、Ubuntuを導入して取り組む方は、以下をご参照ください。

oregin-ai.hatenablog.com

では、振り返っていきたいと思います。

MNIST(手書き数字データ)のダウンロード/解凍を自動化する。

1.MNISTとは何か

MNISTは、Mixed National Institute of Standards and Technology handwritten digit databaseの略で「エムニスト」と読むそうです。(MNISTが提供する手書き文字データベースなので、略したらいけないところが略されているような…。)

学習用の手書き数字画像6万枚と、テスト用の手書き数字画像1万枚を集めた、画像データセットです。

あらかじめ、手書きの数字「0〜9」に正解ラベルが与えられているので、そのまま画像分類の実践データとして使うことができます。MNISTは機械学習の入門のデータとしてもよく使われています。

公式のWebサイトは以下の通りです。

MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

2.全体像

コード全体は以下の通りで、「mnist-download.py」に保存しました。

import urllib.request as req
import gzip, os, os.path

#(1)パラメータを設定する

savepath = './mnist'
baseurl = 'http://yann.lecun.com/exdb/mnist'
files = [
    'train-images-idx3-ubyte.gz',
    'train-labels-idx1-ubyte.gz',
    't10k-images-idx3-ubyte.gz',
    't10k-labels-idx1-ubyte.gz'
]

# (2)ダウンロードする
if not os.path.exists(savepath): os.mkdir(savepath)
for f in files:
    url = baseurl + '/' + f
    loc = savepath + '/' + f
    print('download:', url)
    if not os.path.exists(loc):
        req.urlretrieve(url, loc)

 

# (3)gzipを解凍する

for f in files:
    gz_file = savepath + '/' + f
    raw_file = savepath + '/' + f.replace('.gz','')
    print('gzip:',f)
    with gzip.open(gz_file, 'rb') as fp:
        body = fp.read()
        with open(raw_file, 'wb') as w:
            w.write(body)
print('ok')

では、コードを順番に見ていきます。

3.パラメータを設定する

ファイルをダウンロードするのに必要なパラメータを設定します。

このパラメータを編集すれば、今後、gzipファイルをWebからダウンロードして解凍する作業が自動化できることになります。

まずは、ダウンロードしたファイルを保存するパスを設定します。

savepath = './mnist'

ダウンロードする先の基準となるURLを設定します。

baseurl = 'http://yann.lecun.com/exdb/mnist'

最後に、ダウンロードするファイルをリスト型に設定します。

files = [
    'train-images-idx3-ubyte.gz',
    'train-labels-idx1-ubyte.gz',
    't10k-images-idx3-ubyte.gz',
    't10k-labels-idx1-ubyte.gz'
]

ダウンロードするファイルの中身は、それぞれ以下の通りとなります。

  • train-images-idx3-ubyte.gz:学習用画像データ
  • train-labels-idx1-ubyte.gz:学習用ラベルデータ
  • t10k-images-idx3-ubyte.gz:テスト用画像データ
  • t10k-labels-idx1-ubyte.gz:テスト用ラベルデータ

4.ダウンロードする

設定されたパラメータを使ってWebからファイルをダウンロードします。

ダウンロードをする前に、保存用のディレクトリ(savepath)があるか確認します。

なければ、os.mkdir()メソッドでディレクトリを作成します。

if not os.path.exists(savepath): os.mkdir(savepath)

ダウンロードするファイル名のリスト(files)から、ファイル名を一つずつ取り出して、ダウンロード先の基準となるURL(baseurl)とファイル名(f)を繋いで、ダウンロードするURL(url)と、保存先のパス(savepath)とファイル名(f)を繋いで、保存先ファイル名(loc)を設定します。

for f in files:
    url = baseurl + '/' + f
    loc = savepath + '/' + f
    print('download:', url)

os.path.exists()メソッドを使って、保存先ファイル名(loc)が存在しているかチェックします。

存在していなければ、urlretrieve()メソッドを使って、ダウンロードするURL(url)から、保存先ファイル名(loc)に保存します。

    if not os.path.exists(loc):
        req.urlretrieve(url, loc)

5.gzipを解凍する

ファイルのダウンロードが完了したら、ファイル名を一つづつ取り出して、保存したファイル名(gz_file)と、解凍後の生データのファイル名(raw_file)を設定します。

raw_file設定時には、 replace()メソッドを使って、ファイル名から'.gz'を削除(''に置き換え)します。

 for f in files:
    gz_file = savepath + '/' + f
    raw_file = savepath + '/' + f.replace('.gz','')
    print('gzip:',f)

gzip.open()メソッドを使って、gzipで圧縮されたファイル(gz_file)をバイナリ読み込み('rb')で開きます。

開いたファイルから、read()メソッドで解凍されたデータを読み込みます。

    with gzip.open(gz_file, 'rb') as fp:
        body = fp.read()

open()メソッドで、保存先ファイル(raw_file)を書き込み('wb')で開きます。

解凍されたデータ(body)をwrite()メソッドで書き込みます。

        with open(raw_file, 'wb') as w:
            w.write(body)

6.コマンドラインから実行してみる。

先ほど作成したファイルを実行してみます。

python3 mnist-download.py

以下の通り、MNISTのデータをダウンロードして、解凍することができました。

f:id:kanriyou_h004:20200516185017p:plain

図1.mnist-download.py実行結果

結果のファイルを確認してみると、解凍した後に大量の画像ファイルがある訳ではなく、それぞれのファイルを解凍したファイルが1つずつできています。

実は、MNISTのデータセットは、独自データベース形式でデータが格納されており、画像もそのデータベースの中に保存されています。

このデータの読み込みについては、次回、CSVに変換する際に振り返っていきたいと思います。

f:id:kanriyou_h004:20200516185323p:plain

図2.ダウンロード/解凍したファイル

今回は、少しスクレイピングの復習として、MNISTの手書き数字データのダウンロードと解凍を自動化しました。

次回は、このデータのCSVへの変換と画像分類の機械学習を実施していきたいと思います。

 

次回以降も、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピング機械学習開発に取り組んでいきたいと思います。

 

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】