Google Colaboratory できゅうりを選別する。
最近少しずつ趣味でディープラーニングを勉強しているのでそのアウトプットとして2年ほど前に話題になったキュウリを仕訳してみます。
モチベーション:写経だけじゃなくてもう少し踏み込んだところで機械学習をしたかった。
- 使用するモジュール:Keras
- 使用するアルゴリズム:CNN
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からダウンロードしたやつ
ダイアログボックスが出るのでアップロードする。
ファイルの解凍
#ファイルを解凍する。 !tar -zxvf cucumber-9-python.tar.gz
解凍できているみたいだ。
#解凍したファイルを読み込む # 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))
https://colab.research.google.com/drive/1o7gosgj5NytGGAXvjHxlnuXjW9bxk5E2