今回は、少しスクレイピングに戻って、画像の文字認識に使うためのMNIST(手書き数字データ)をダウンロードして解凍できるようになりました。機械学習では、圧縮されたデータをダウンロードして処理することもあるので、自動化できるのは非常に効率的です。
Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]の第4章を参考にさせていただきながら、取り組んでいます。
環境構築については、Dockerを使われる方は、以下をご参照ください。
OSから、Ubuntuを導入して取り組む方は、以下をご参照ください。
では、振り返っていきたいと思います。
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 コード全体は以下の通りで、「mnist-download.py」に保存しました。 import urllib.request as req #(1)パラメータを設定する savepath = './mnist' # (2)ダウンロードする # (3)gzipを解凍する for f in files: では、コードを順番に見ていきます。 ファイルをダウンロードするのに必要なパラメータを設定します。 このパラメータを編集すれば、今後、gzipファイルをWebからダウンロードして解凍する作業が自動化できることになります。 まずは、ダウンロードしたファイルを保存するパスを設定します。 savepath = './mnist' ダウンロードする先の基準となるURLを設定します。 baseurl = 'http://yann.lecun.com/exdb/mnist' 最後に、ダウンロードするファイルをリスト型に設定します。 files = [ ダウンロードするファイルの中身は、それぞれ以下の通りとなります。 設定されたパラメータを使って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: os.path.exists()メソッドを使って、保存先ファイル名(loc)が存在しているかチェックします。 存在していなければ、urlretrieve()メソッドを使って、ダウンロードするURL(url)から、保存先ファイル名(loc)に保存します。 if not os.path.exists(loc): ファイルのダウンロードが完了したら、ファイル名を一つづつ取り出して、保存したファイル名(gz_file)と、解凍後の生データのファイル名(raw_file)を設定します。 raw_file設定時には、 replace()メソッドを使って、ファイル名から'.gz'を削除(''に置き換え)します。 for f in files: gzip.open()メソッドを使って、gzipで圧縮されたファイル(gz_file)をバイナリ読み込み('rb')で開きます。 開いたファイルから、read()メソッドで解凍されたデータを読み込みます。 with gzip.open(gz_file, 'rb') as fp: open()メソッドで、保存先ファイル(raw_file)を書き込み('wb')で開きます。 解凍されたデータ(body)をwrite()メソッドで書き込みます。 with open(raw_file, 'wb') as w: 先ほど作成したファイルを実行してみます。 python3 mnist-download.py 以下の通り、MNISTのデータをダウンロードして、解凍することができました。 結果のファイルを確認してみると、解凍した後に大量の画像ファイルがある訳ではなく、それぞれのファイルを解凍したファイルが1つずつできています。 実は、MNISTのデータセットは、独自データベース形式でデータが格納されており、画像もそのデータベースの中に保存されています。 このデータの読み込みについては、次回、CSVに変換する際に振り返っていきたいと思います。 今回は、少しスクレイピングの復習として、MNISTの手書き数字データのダウンロードと解凍を自動化しました。 次回は、このデータのCSVへの変換と画像分類の機械学習を実施していきたいと思います。 次回以降も、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピングと機械学習開発に取り組んでいきたいと思います。 【過去記事】 2019年8月31日(土)にE資格を受験して、合格しました! E資格対策として勉強の進め方や、参考書などをまとめました。 これから受験される方がいらっしゃいましたらご参考まで。 2019年3月9日(土)にG検定を受験し、見事合格できました! 受験の体験記や勉強法などを別のブログにまとめました。 これから受験される方がいらっしゃいましたらご参考まで。 【E資格対策に使った参考書】 MNIST(手書き数字データ)のダウンロード/解凍を自動化する。
1.MNISTとは何か
2.全体像
import gzip, os, os.path
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'
]
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)
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.パラメータを設定する
'train-images-idx3-ubyte.gz',
'train-labels-idx1-ubyte.gz',
't10k-images-idx3-ubyte.gz',
't10k-labels-idx1-ubyte.gz'
]
4.ダウンロードする
url = baseurl + '/' + f
loc = savepath + '/' + f
print('download:', url)
req.urlretrieve(url, loc)5.gzipを解凍する
gz_file = savepath + '/' + f
raw_file = savepath + '/' + f.replace('.gz','')
print('gzip:',f)
body = fp.read()
w.write(body)6.コマンドラインから実行してみる。