パソコン無くても独学ディープラーニング

スマホと本を使ってディープラーニングを学んでいます。

「Python3入門ノート」例題のモデルで自分の手書き文字を分類する 〜データ作成から結果表示まで〜

 

こんにちは、食たまです。

 

 

私はPythonを「詳細!Python 3 入門ノート」(以下、テキスト)という本を使って勉強しました。

この本は、Python初心者のためのプログラミング学習教本ですが、最終章では機械学習を学ぶことができ、3つのモデル(学習をしてある入力から出力を導くもの)を作ります。

 

3つのモデルの内の1つが「手書き数字を分類する」モデルでしたので、このモデルを使って自分で書いた数字を分類してみました。

手書き数字の画像を作るところから、結果の表示まで全てスマホで完了できましたので、ここでご紹介したいと思います。

 

 

数字を書いて画像にする

 

先ずはここから。

 

手書き数字を書く

紙に書いたものを写真で取る方法と、手書きメモアプリを使う方法と2つやってみました。

 

紙に書いて写真で取る

普通に紙にサインペンで数字を書いて、スマホのカメラで撮影しました。

 

スケッチブックに書いた手書き数字

 

今回はクロッキー帳に書きましたが、地は白がおすすめです。クロッキー帳で書く前にピンクの付箋で試しましたが、白地の場合より分類の成功率が下がります。

 

マルマン クロッキー帳 白クロッキー紙 ブルー SS-02

 

手書きメモアプリを使う

手書きメモアプリには Google Keep を使いました。

 

Google Keep - メモとリスト
Google Keep - メモとリスト
開発元:Google LLC
無料
posted withアプリーチ

Google Keep を立ち上げると右下に筆マーク Keepメモの筆マーク があるのでそれをタップ。

そこに、数字を書きます。


f:id:shokutama:20190628115308j:image


書けたら、右上の「3つ丸マーク」→「送信」→「ドライブに保存」を選択し、Google Drive に保存します。

 

1文字ずつ切り出す

画像データは学習に使ったものと同じ形式でなければいけません。

学習に使ったデータは、サイズが8✕8で、16階調のグレースケールでした。

なので、今書いた数字を8✕8サイズに切り出します。

 

そんな作業にとっておきのアプリを発見しました。その名も「写真リサイズ」。

 

写真リサイズ
写真リサイズ
開発元:farluner apps & games
無料
posted withアプリーチ

 これを使えば、切り出しとリサイズを同時にしてくれます。

 

アプリを立ち上げたら、さっき作った写真または手書きメモ画像を選択。

写真リサイズで写真を選択

 

ここで、右上の共有マークの隣の四角が回ってるようなマークを選択。

すると、切り出し画面になります。

 

右上の「0x0」を押すと、サイズが選べるので、今回は「Custom」で8✕8と入力します。

正方形の明るい選択部分が現れました。

これを数字に合わせ左下の「Crop」を押せば切り出し&リサイズの完了です。

写真リサイズで写真を切り出すシーン

 

 

ルールに従って名前を付ける

保存するときに、画像に名前をつけるわけですが、この名前の付け方が重要です。

名前は、数字の分類後に答え合わせをするために、プログラムで答えを読み取れるようにすると便利です。

そのためのルールを作り、それに従って名前を付けます。

 

ルールは

  • 正解の数字が含まれる
  • 正解の数字以外は同じ文字列
  • 正解の数字以外の文字列は数字を含まない(正解と混同しないようにするため)

 

今回は、食たまが書いた数字なので、「shokutama正解の数字.jpg」と名付けることにしました。

 

こうして、0〜9の10個の数字画像を作ることができました。

 

できたデータは Google Drive にフォルダを作って保存しておきましょう。

numbersというフォルダを作って保存しました。

 

 

画像データを取り込む

 

次に、画像をモデルに読み込ませるためのデータに変換する必要があります。

画像は Google Drive にあるので、Google Colaboratory から Google Drive のファイルを読めるようにしてから、画像をデータに変換します。

 

Google Drive のファイルを読めるようにする(Google Driveをマウントする)

これは、想像以上に簡単でした。というか、簡単になったようです。

調べてみると難しいことがいっぱい出てくるんですが、本当はたったの2行でした。しかも、自分で書く必要もありません。

 

Google Colab の左上にある「3本線」→「ツール」→「コマンドパレット」→「コードスニペットパレットを表示」と選択します。

(キーボードがあれば「Ctrl+Alt+p」でもOKです。)

こんな画面になります。

 

スニペットパレット

この「Filter code snippets」のところに「drive」と入力すると、

と候補が出てくるので、2番目の「Mounting」を選択。

 

そして、候補の下に出てきた「挿入」をタップすると、2つ新しいコードセルが現れ、そこには

from google.colab import drive
drive.mount('/gdrive')
with open('/gdrive/My Drive/foo.txt', 'w') as f:
  f.write('Hello Google Drive!')
!cat '/gdrive/My Drive/foo.txt'

と表示されています。

 

今回は1つ目だけでOK。2つ目は削除しましょう。

 

 

これを実行したときに現れるリンクへ飛び、自分のアカウントを選択、アクセスの許可をすると長々したコードが表示されるのでそれをコピーし、Google Colab に戻って貼り付け、Enter。


f:id:shokutama:20190629174432j:image

Mounted at /gdrive

と表示されれば連携完了です。

 

 

Google Drive にアクセスする

osモジュールを入れてファイルにアクセスしてみます。

import os    #osモジュールをインポート
os.chdir("/gdrive/My Drive/numbers/")    #numbersフォルダへカレントディレクトリを移動
files=os.listdir()    #numbersの中身リストをfilesに代入
print(files)    #filesを表示させる

['shokutama7.jpg', 'shokutama2.jpg',

'shokutama8.jpg', 'shokutama1.jpg',

'shokutama0.jpg', 'shokutama9.jpg',

'shokutama3.jpg', 'shokutama4.jpg',

'shokutama6.jpg', 'shokutama5.jpg']

 

無事、さっき作った画像ファイルにアクセスすることができました。

 

画像データを読み込む

では早速、画像ファイルを分類器が読み込めるデータに変換していきます。

 

私は、cv2画像処理モジュールを使いました。

import cv2    #OpenCVをインポート
image=cv2.imread("shokutama0.jpg",0)    #shokutama0.jpgをグレースケールの画像データにしてimageに代入
print(image.shape,"\n",image)    #imageの構造と中身を表示させる

(8, 8)

[[192 203 199 206 131 200 200 196]

[195 198 46 35 37 48 200 200]

[199 200 25 31 200 142 110 194]

[196 176 30 124 186 194 55 198]

[201 69 87 194 195 171 75 203]

[200 48 107 200 192 58 131 188]

[200 89 31 81 38 49 194 198]

[192 197 141 80 179 194 192 199]]

 

狙い通り8×8のデータになりましたが、学習データとの違いが2つありました。

  • 256階調(学習データは16階調)
  • 地が大きい値、数字部分が小さい値(学習データは逆)

 

ということで、テキストの15章で勉強した通り、配列の演算を用いて変換することにしました。

import numpy as np    #NumPyをインポート
image=16-np.round(image/16)    #画像データを256階調から16階調にし、16から引いて大小の関係を入れ替える
print(image)    #画像データを表示させる

[[ 4. 3. 4. 3. 8. 4. 4. 4.]

[ 4. 4. 13. 14. 14. 13. 4. 4.]

[ 4. 4. 14. 14. 4. 7. 9. 4.]

[ 4. 5. 14. 8. 4. 4. 13. 4.]

[ 3. 12. 11. 4. 4. 5. 11. 3.]

[ 4. 13. 9. 4. 4. 12. 8. 4.]

[ 4. 10. 14. 11. 14. 13. 4. 4.]

[ 4. 4. 7. 11. 5. 4. 4. 4.]]

 

構造が揃いました。これでできそうです。

 

 

自分の手書き数字を分類する

 

手書き数字の分類モデルを作る

先ず、テキストで紹介されていた手書き数字の分類器作るプログラムは以下の通りです。

from sklearn import datasets
from sklearn import svm, metrics
import matplotlib.pyplot as plt

# 手書き数字データセットを読み込む
digits = datasets.load_digits()
X = digits.data    # 手書き数字データ
y = digits.target   # ターゲット
n_train = len(X)*2//3 # データの2/3の個数

# 訓練データ
X_train, y_train = X[:n_train], y[:n_train]   # 前半 2/3
# テストデータ
X_test, y_test = X[n_train:], y[n_train:]    # 後半 1/3

# 学習器の作成と学習
clf = svm.SVC(gamma=0.001)    # 学習器
clf.fit(X_train, y_train)     # 訓練データと教師データで学習する

参照:詳細! Python 3 入門ノート サポートサイト

テキストには、できたモデルの評価方法なども書かれていますが、今回は割愛します。

 

 

自分の手書き数字を分類する

いよいよ、自分が書いた手書き数字10個を分類してみます。

 

私が作ったプログラムはこちらです。

os.chdir("/gdrive/My Drive/numbers/")    #カレントディレクトリをnumbersに移動
files=os.listdir()    #numbersの中身リストをfilesに代入
images=np.zeros((len(files),8,8))    #全ての画像データを入れる配列を作成
data=np.zeros((len(files),64))    #モデルに読み込ませる形にした全てのデータを入れる配列を作成
target=np.zeros(len(files),int)    #全ての正解を入れる配列を作成

#画像の読み込み
for i,file in enumerate(files):    #filesの中から1つずつ番号iと一緒に取り出す
    images[i]=cv2.imread(file,0)    #imagesのi行目に、(i+1)個目の画像データを代入する
    images[i]=16-images[i]//16    #16階調、地が0になるようにデータを修正
    data[i]=images[i].ravel()    #imagesのi行目(8×8)を一次元(64×1)にしてdataのi行目に入れる
    target[i]=int(file.strip("shokutama.jpg"))    #ファイル名の数字を正解としてtargetのi行目に入れる

#分類する
predicted=clf.predict(data)    #モデルclfでdataから分類した結果をpredictedに代入する

#結果の表示
for index,(image, y_t, ans) in enumerate(zip(images,target,predicted),1):
    plt.subplot(3,4,index)    #3行4列の枡のindex番目に以下の結果を表示する
    plt.axis("off")    #マッピングの軸を表示しない
    plt.tight_layout()    #行間をあける(書かないと上の行のマッピングと下の行のタイトルが被る)
    plt.imshow(image,cmap="Greys")    #index番目の画像データをGreysのカラーマップで表示する
    plt.title(f"{y_t} pre:{ans}",fontsize=12)    #マッピングのタイトルを「(正解),pre:(分類結果)」とする

 

分類結果

結果は次のようになりました。


f:id:shokutama:20190630121507j:image

 

正解率:40%

かなり悪いですね。

 

ちなみに、コントラストがハッキリして比較的キレイなデータができた手書きメモアプリで書いた数字の結果はこちら。


f:id:shokutama:20190630121911j:image

正解率:60%

結構良くなりました。

 

学習データに私のデータが1つも含まれないので、こんなもんなのかも知れません。

 

 

おわりに

 

「詳細!Python 3 入門ノート」に従って作った手書き数字分類モデルを使って、自分の書いた数字を分類しました。

 

手書き数字画像の作成から、分類、結果表示まで全てスマホでやることができました。

自分の手書き数字を分類できたことで、Python機械学習を教科書で勉強するだけの机上のものから少し現実世界に近づけたような気分になりました。

 

できたプログラムコードはこちらす。何かの参考になれば幸いです。

from sklearn import datasets
from sklearn import svm, metrics
import matplotlib.pyplot as plt

# 手書き数字データセットを読み込む
digits = datasets.load_digits()
X = digits.data
y = digits.target
n_train = len(X)*2//3

# 訓練データ
X_train, y_train = X[:n_train], y[:n_train]
# テストデータ
X_test, y_test = X[n_train:], y[n_train:]

# 学習器の作成と学習
clf = svm.SVC(gamma=0.001)
clf.fit(X_train, y_train)

os.chdir("/gdrive/My Drive/numbers/")
files=os.listdir()
images=np.zeros((len(files),8,8))
data=np.zeros((len(files),64))
target=np.zeros(len(files),int)

#画像の読み込み
for i,file in enumerate(files):
    images[i]=cv2.imread(file,0)
    images[i]=16-images[i]//16
    data[i]=images[i].ravel()
    target[i]=int(file.strip("shokutama.jpg"))

#分類する
predicted=clf.predict(data)

#結果の表示
for index,(image, y_t, ans) in enumerate(zip(images,target,predicted),1):
    plt.subplot(3,4,index)
    plt.axis("off")
    plt.tight_layout()
    plt.imshow(image,cmap="Greys")
    plt.title(f"{y_t} pre:{ans}",fontsize=12)

 

 

 

「Python3 入門ノート」をGoogle Colabで勉強する。(Chapter4〜9)

 

こんにちは、食たまです。

 

スマホのブラウザでGoogle Colaboratory を使ってPython3の勉強をしています。

目標は、ディープラーニングで時系列データの分析をすることです。

 

教科書には、こちらの本を使っています。

 

 

パソコン(WindowsまたはMac)で勉強することを前提としている本書をスマホで学んだときの相違点紹介第二弾です。

 

第一弾はこちら。

 

deeplearning-nopc.hatenablog.jp

 

 

 

Chapter4

標準ライブラリを勉強する章です。

組み込み関数の紹介や、モジュール(特殊な関数のセットみたいなもの)を読み込んで使う関数が紹介されています。

 

ここでの違いは次の1点でした。

 

p.77 入出力に使う関数

教科書では、Pythonインタプリタを使って、次のように使うと書かれています。

 

>>> value = input("好きな言葉を入力してください。:")

好きな言葉を入力してください。:こんにちは

>>> print(value)

こんにちは

 

インタプリタなので会話のように、inputのプログラムを書いて、「こんにちは」と入力して、printのプログラムを書くと、「こんにちは」と出力される感じです。

 

Google Colaboratory でも、これでもいいのですが、少々面倒。

 

ということで、コードセルの中に一気に書きます。

 

value = input("好きな言葉を入力してください。:")

print(value)

 

それで実行すれば、
f:id:shokutama:20190601104301j:image

画像のように入力待ちになるので、そこで四角の中に「こんにちは」と入力し、「Enter」。

 

すると、次の行に「こんにちは」がprintされます。


f:id:shokutama:20190601104557j:image

 

インタプリタのように、入力して表示させることができました。

 

 

Chapter5

ここは、for文やif文など、繰り返しや条件分岐などを勉強する章です。

 

ここでも少し違いがありました。

 

p.97 if文/条件で処理を分岐する

 

教科書には、

次に「if v<0 :」まで入力して改行すると、次の行には … と表示されてif文が続いていることが分かります。

 …に続いて半角空白を4個入れてインデント(字下げ)し、v = 0 の式を入力します。(中略)

 次の行にも … と表示されますが、ここでは何も入力せずに改行します。すると次の行は >>> の表示に戻り if文が終了します。

とあります。

 

でも、Google Colabで書いてみると

  1. 「if v<0 :」まで入力して改行すると、2個インデントされる。
  2. 自分で更に2個インデントして改行すると、4個インデントされる。
  3. 何も入力せずに改行すると、やっぱり4個インデントされる。何回でもずーっと。
  4. if文を終了するには、BackSpaceでインデントを消す。

となりました。

 

ちょっとやり方は違いますが、同じ様に書けました。


f:id:shokutama:20190601112344j:image

 

p.113 無限ループを止める

繰り返しを中断して終了する break の項に、MEMOとして無限ループの止め方が書いてありました。

 

誤って無限ループに陥った場合には、control + Z キーで中断することができます。

 

Google Colab に、control + Z キーは通用しませんでした。

他にも、control + C とか、Esc とかも試してみましたが、通用しませんでした。

 

止め方は、「■を押す」です。


f:id:shokutama:20190601104301j:image

この、左上でくるくる回っている■ボタンを押せば止まります。

 

 

Chapter6〜9

 

ここには、教科書と違う動作をしたところは一つもありませんでした。

 

全くそのまま進められます。

 

ただ、段々難しくなってきました。

 

 

おわりに

 

詳細! Python3 入門ノート(大重美幸 著)を教科書にして、Google Colab上でPythonの勉強をしています。

勉強を進める上で気付いた、Google Colabならではの教科書との相違点をChapter4〜9までまとめてみました。

 

色々書きましたが、違いは特にありません。

スマホGoogle Colaboratory でも、全く問題なく進められます。

 

今の時代、パソコンがなくてもプログラミングが勉強できるんだと実感しています。

大切なことは、「どうやって」勉強するかではなく、「何のために」勉強するかだと思います。

これかも目的を忘れず、ちょっとずつでも前に進みたいなと思います。

 

 

 

 

「Python3 入門ノート」をGoogle Colabで勉強する。(Chapter1〜3)

 

こんにちは、食たまです。

 

私は、パソコンを持っていないので、スマホを使ってGoogle Colab上でPythonの勉強をしています。

 

教科書にはこの本を使っています。

 

 

本は、パソコン(WindowsMac)を使うことを想定しているので、Google Colabを使ったときの相違点をまとめてみました。

 

今日はChapter1〜3までのお話です。

 

Chapter1

 

Chapter1は、Python環境を構築する話です。

Google Colab は、既に環境が整っているので、環境設定は不要です。

これがGoogle Colabの良いところですよね。

 

つまり、ここは丸っとすっ飛ばします。

 

 

Chapter2

 

Chapter2は試しにプログラムを動かしてみるパートです。

 

ここでは、「Section2-3 コードをファイルに書く」の中に、教科書そのままでは動かない部分がありました。

 

ファイルをアップロードする

 

本の中では、ファイルを保存したパスを指定して、そこで実行します。

 

しかし、Google Colabは、クラウド上でプログラムを実行しているので、先ず作ったファイルをアップロードする必要があります。

 

アップロードの仕方は次の通りです。

 

  1. コードセルに次のように書き、実行▶。

    from google.colab import files

    uploaded = files.upload()

  2. 「ファイル選択」ボタンが現れるので、それをタップ。
    Google Colabでファイルをアップロードするときに現れるファイル選択ボタン
  3. 「ファイル」から保存した場所へ行き、目的のファイルを選択。
    Google Colabでファイルを選択するときに現れる画面
  4. 「100% done」と出ればOK。
    Google Colabでファイルアップロードが完了したときの様子

 

これで、アップロードは完了です。

 

lsと書いて実行すればファイル名を確認できます。

 

 

ファイルを実行する

 

教科書のp.35には

>python ファイル名.py

とありますが、これでは実行されませんでした。

 

次のコマンドで実行できます。

 

    run -i ファイル名.py
Google ColabでPythonファイルを実行したときの様子

 

これで、Google Colab上で実行できました。

 

 

Chapter3

 

こちらは、全く教科書通りに進めることができました。

Google Colab上でも全く問題なくパソコンと同じように学べるようです。

 

 

おわりに

 

詳細! Python3 入門ノート(大重美幸 著)を教科書にして、Google Colab上でPythonの勉強をしています。

 

勉強を進める上で気付いた、Google Colabならではの教科書との相違点をChapter1〜3までまとめてみました。

 

私は現在Chapeter5まで進めていますが、いくつか相違点はあるものの、特に不自由無く勉強は進められています。

スマホだけでもまだ何とかなってます。

 

また、暫く進めたら教科書との相違点を更新していきたいと思います。

引き続き読んで頂ければ幸いです。

 

 

 

 

たった3つ。パソコン無しでディープラーニングを学ぶために必要なもの

 

こんにちは、食たまです。

 

パソコン無しでディープラーニングの学習を始めました。

今日は、パソコンが無い、もしくはパソコンのスペックが低い状態でディープラーニングを学ぶために必要なものを紹介します。

 

 

必ず必要なもの

 

必ず必要なものは1つだけです。

 

それは、Webブラウザです。

これでGoogle Colaboratoryを開いてそこで全てを行います。

 

私の場合はスマホしか持っていないので、スマホを使っています。

ちなみにPixel 3です。

 

国内版SIMフリー Google Pixel3 64GB Just Black

 

オススメはしません。

できるだけ大きな画面のものがオススメです。

だから、スマホよりはタブレットがいいと思います。

 

私も、Huaweiタブレット買っちゃおうかなとか考えています。

 

HUAWEI MediaPad T5

 

やっぱりコスパを考えると何もHuaweiには敵いませんよね。

 

でも、本当はiPadApple Pencilに憧れていたりします。

 

 

Apple iPad Pro

 

 

絶対じゃないけど無いと辛いもの

 

これも1つだけです。

 

それは、物理キーボードです。

 

私は、これを使っています。

 

エレコム キーボード

 

本体も軽く持ち運びも便利です。使っていて何の不満もありません。

 

<2019年5月2日追記>

何の不満もありませんと書きましたが、今のところ私は「半角/全角」キーが使えません。

日本語と英語の入力をキー1つで変えられず、しかたなくタッチで操作しています。

結構不便です。

なぜ使えないのかは不明です。キーボードが悪いのか、スマホとの相性が悪いのか、設定が間違っているのか。。。

 

 

やはり、コードを仮想キーボードで書くのは無理があります。

英数と記号をまぜこぜですし、量も書かなければ上達しません。

 

そんなに高いものでもありませんし、何かと便利です。ここは買ってしまいましょう。

 

 

あるといいもの

 

これは本です。

 

多分、Web上にもたくさん情報はありますが、やはり物事を体系的に学ぶにはやっぱり本の方が読みやすくわかりやすいです。

 

私は、先ず始めにこちらの本を買ってみました。

 

 

これで、Pythonを勉強するところから始めます。

 

 

おわりに

 

パソコン無しでディープラーニングを勉強するために必要なものを書き出してみました。

です。

 

おそらく皆さんスマホは持っていらっしゃると思うので、キーボードと本。

はじめの一歩はとても小さいです。

 

ぜひ、皆さんも気軽に始めてみてはいかがでしょうか。

 

     

 

一先ず、スマホでディープラーニング勉強してみます。

 

こんにちは、食たまです。

 

この度、ちょっと前から気になっていたディープラーニングの勉強を始めることにしました。

 

 

私は、現在育休中。

補助金はありますが、お給料がもらえないのでそんなにお金はかけたくありません。

乳飲み子を一人養育中なので、定期的に研修に参加するのも難しい状況です。

 

 

ちょっとかじってみたいだけ。

家で簡単にできないかなと思っていると、Google Colabなるものを見つけました。

 

Webブラウザ上で機械学習のプロジェクトを実行することができるサービスだそうです。

 

なんと!

Webブラウザなら、手元にあるじゃないか。(スマホだけど)

と思い、試しに少し触ってみました。

すると、スマホでも本当にプログラムを実行できました!


スマホでGoogle Colabを使って Hello world! と書いたところ

 

なんだか勉強できそうです。

 

 

スマホでどこまでのことができるのかわかりませんが、

一先ず、スマホディープラーニングの勉強を始めることにしました。

 

スマホディープラーニングを学ぼうなんて、なめた姿勢の人はあまりいないと思いますが、手持ちのものだけでちょっとかじってみたいなと思っている人の役に立てるような記事を書いて行きたいと思います。

よろしくお願い致します。