Yado_tech

旅館+ITとはなんぞ

Google Colaboratory できゅうりを選別する。

f:id:devilmakelie:20180817174629p:plain

最近少しずつ趣味でディープラーニングを勉強しているのでそのアウトプットとして2年ほど前に話題になったキュウリを仕訳してみます。

モチベーション:写経だけじゃなくてもう少し踏み込んだところで機械学習をしたかった。

jupyter notebookでゼロから作るディープラーニングを写経していたのですが、思った以上に学習に時間がかかることがわかりめちゃくちゃだるくなったため、 似たようなサービスであるGoogle Colaboratoryを利用してディープラーニングやってみます。

まだまだ勉強中につき深いことはわかりませんが、なんとなくでも実装できないかしら?と思ってやってみた。結果としてできたけどふわっとしてる

わかったこと:

  • Google Colaboratoryの使い方がわからなかったため、めちゃくちゃつまづいた。
  • さらにきゅうりの画像の読み込み方はさっぱりわからなかった。
  • 前処理が教科書だとざっくりとkeras.dataset使えとかなんとか書いてあるけど、きゅうりの場合それがそもそもわからなかった。 そこでゼロから作るディープラーニングMNISTのやつをちゃんと読んだ。 冗談かもしれないがそれでもわからなかったのでさらにcifar-10のやつやQiitaなどを読んだ。そしてほぼ丸々パクった。

わからなかったことがわかったこと:

  • 途中の変数のnb_train_samplesが何なのかわからない。
  • CNNのsequentialの実装だがこれはたぶんだけどいろいろ流儀というかモデルの作り方があるみたいだ。今回は畳み込み層が2層と結合層が1層の畳み込みニューラルネットワーク・・だよね?

以下ソース

#まずはファイルをアップロードする。

from google.colab import files
uploaded = files.upload()

アップロードするのはGithubからダウンロードしたやつ

ダイアログボックスが出るのでアップロードする。

f:id:devilmakelie:20180817173720p:plain

ファイルの解凍

#ファイルを解凍する。
!tar -zxvf cucumber-9-python.tar.gz

解凍できているみたいだ。

f:id:devilmakelie:20180817173922p:plain

#解凍したファイルを読み込む
#
def unpickle(f):
    import pickle
    fo = open(f, 'rb')
    d = pickle.load(fo,encoding = 'latin-1')
    fo.close()
    return d
  
#訓練データを読み込む

nb_train_samples = 2475
x_train = np.zeros((nb_train_samples, 3, 32, 32), dtype='uint8')
y_train = np.zeros((nb_train_samples,), dtype='uint8')

for i in range(1,5):  
  fpath ='data_batch_' + str(i)
  batch_dict = unpickle(fpath)
  data = batch_dict['data']
  labels = batch_dict['labels']
  x_train[(i-1)*495:i*495, :, :, :] = data.reshape(495, 3, 32, 32)
  y_train[(i-1)*495:i*495] = labels

#教師データを読み込む

data =  unpickle("test_batch")
x_test = data['data'].reshape(495,3,32,32)
y_test = data['labels']

次にデータを3つにわける

#処理したデータを3個に分割する。

from sklearn.model_selection import train_test_split
x_train1,x_valid,y_train1,y_valid = train_test_split(x_train,y_train,test_size = 0.175)

次はモデルの設計図となるSequentialをデザインする。ここでCNNかRNNかNNかとかそういったいろいろが決まる。

#Sequentialの実装。ほぼコピペ。元画像がMNISTだと28*28*1だがきゅうりの場合は32*32*3なのでそれにあわせて書き換える。
#あと出力層はMNISTの場合10だがきゅうりの場合は9だとかなんとか

from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D , MaxPooling2D
import keras

model = Sequential()
model.add(Conv2D(32,kernel_size = (3,3),activation = 'relu' , input_shape=(32,32,3)))
model.add(Conv2D(64,(3,3),activation = 'relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0,25))
model.add(Flatten())
model.add(Dense(128,activation='relu'))
model.add(Dropout(0,5))
model.add(Dense(9,activation = 'softmax'))

データをきれいにする。

#データの正則化。なぜやるのかよくわからない。

x_train = x_train.reshape(x_train.shape[0],32,32,3)
x_valid = x_valid.reshape(x_valid.shape[0],32,32,3)
x_test = x_test.reshape(x_test.shape[0],32,32,3)

x_train = x_train.astype('float32')
x_valid = x_valid.astype('float32')
x_test = x_test.astype('float32')

x_train /= 255
x_valid /= 255
x_test /= 255

y_train = keras.utils.to_categorical(y_train,9)
y_valid = keras.utils.to_categorical(y_valid,9)
y_test = keras.utils.to_categorical(y_test,9)

最後に学習とデータの確認。 なんかわからんけど出来ているようだ。

#学習させる。

from keras.optimizers import RMSprop

model.compile(loss='categorical_crossentropy',
             optimizer = RMSprop(),
             metrics=['accuracy'])

history = model.fit(x_train,y_train,
                   batch_size = 120,
                   epochs=10,
                   verbose=1,
                   validation_data = (x_valid,y_valid))

f:id:devilmakelie:20180817174425p:plain

https://colab.research.google.com/drive/1o7gosgj5NytGGAXvjHxlnuXjW9bxk5E2

パクリ元: