Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ```python
- from glob import glob
- # 画像の検索
- image_files = glob('/home/imgs/*.png') # * はワイルドカード
- ```
- ```python
- import cv2
- ```
- ```python
- %matplotlib inline
- import matplotlib.pyplot as plt
- ```
- # 画像の事前処理
- ```python
- import os
- HEIGHT, WIDTH = 50, 50 # 縮小後のサイズ
- for image_file in image_files:
- # OpenCVでの画像の読み込み
- img = cv2.imread(image_file)
- # 画像の縮小
- img_small = cv2.resize(img, (WIDTH, HEIGHT))
- # 縮小後のファイル名
- img_small_file = './' + os.path.basename(image_file)
- # 画像の保存
- cv2.imwrite(img_small_file, img_small)
- ```
- ```python
- import pandas as pd
- # ラベルデータの読み込み
- df = pd.read_csv('data.csv')
- ```
- # 入力変数と出力変数の切り分け
- ```python
- x, t = [], []
- for (i, row) in df.iterrows():
- # 各行のデータからfilepathとlabelを取得
- filepath, label = row['filepath'], row['label']
- # 画像の読み込み
- img = cv2.imread(filepath)
- # RGBチャンネル(2)を一番前に持ってくる
- # + 0−1の範囲に正規化(255で割る)
- _x = np.transpose(img, (2, 0, 1)) / 255.0
- # リストに追加
- x.append(_x) # 正規化した画像データ
- t.append(row['label']) # ラベル
- ```
- ```python
- import numpy as np
- # numpyの形式に変換 + データ型の変更
- x = np.array(x, dtype=np.float32)
- t = np.array(t, dtype=np.int32)
- ```
- ```python
- from chainer.datasets import tuple_dataset, split_dataset_random
- # Chainer推奨のdataset形式
- # dataset = list(zip(x, t))
- dataset = tuple_dataset.TupleDataset(x, t)
- # 訓練データ(50%)と検証データ(50%)に分割
- n_train = int( len(dataset) * 0.5 )
- train, test = split_dataset_random(dataset, n_train, seed=1)
- ```
- # モデル定義
- ```python
- import chainer
- from chainer import Chain, Variable
- import chainer.links as L
- import chainer.functions as F
- ```
- ```python
- class CNN(Chain):
- def __init__(self, n_units, n_output):
- super().__init__()
- with self.init_scope():
- self.conv1 = L.Convolution2D(in_channels=3, out_channels=12, ksize=3, stride=1)
- self.l1 = L.Linear(None, n_units)
- self.l2 = L.Linear(None, n_output)
- def __call__(self, x):
- z = F.relu(self.conv1(x))
- h1 = F.max_pooling_2d(z, 3, 3)
- h2 = self.l1(h1)
- return self.l2(h2)
- ```
- ```python
- # モデルの宣言
- cnn = CNN(50,2)
- model = L.Classifier(cnn)
- ```
- ```python
- # Optimizerの設定
- optimizer = chainer.optimizers.Adam()
- optimizer.setup(model)
- ```
- ```python
- # Iteratorの設定
- batchsize = 3
- train_iter = chainer.iterators.SerialIterator(train, batchsize)
- test_iter = chainer.iterators.SerialIterator(test, batchsize, repeat=False, shuffle=False)
- ```
- ```python
- # Updateの設定
- from chainer import training
- updater = training.StandardUpdater(train_iter, optimizer)
- ```
- ```python
- # Trainerとそのextensionsの設定
- from chainer.training import extensions
- epoch = 40
- trainer = training.Trainer(updater, (epoch, 'epoch'), out='result')
- # 評価データで評価
- trainer.extend(extensions.Evaluator(test_iter, model))
- # 学習結果の途中を表示する
- trainer.extend(extensions.LogReport(trigger=(1, 'epoch')))
- # 1エポックごとに、trainデータに対するaccuracyと、testデータに対するaccuracyを出力させる
- trainer.extend(extensions.PrintReport(['epoch', 'main/accuracy', 'validation/main/accuracy', 'elapsed_time']), trigger=(1, 'epoch'))
- ```
- ```python
- trainer.run()
- ```
- epoch main/accuracy validation/main/accuracy elapsed_time
- [J1 0.583333 0.5 0.081398
- [J2 0.666667 0.916667 0.127008
- [J3 0.916667 0.75 0.172755
- [J4 0.916667 0.916667 0.218207
- [J5 1 0.916667 0.264898
- [J6 1 0.916667 0.324137
- [J7 1 0.833333 0.370681
- [J8 1 0.916667 0.416805
- [J9 1 0.916667 0.46221
- [J10 1 0.833333 0.508246
- [J11 1 0.833333 0.565425
- [J12 1 0.916667 0.612338
- [J13 1 0.916667 0.658242
- [J14 1 0.916667 0.703609
- [J15 1 0.916667 0.749522
- [J16 1 0.916667 0.805929
- [J17 1 0.916667 0.852826
- [J18 1 0.916667 0.898924
- [J19 1 0.916667 0.945089
- [J20 1 0.916667 0.990832
- [J21 1 0.916667 1.05026
- [J22 1 0.916667 1.09726
- [J23 1 0.916667 1.14336
- [J24 1 0.916667 1.18942
- [J25 1 0.916667 1.23655
- [J26 1 0.916667 1.30444
- [J27 1 0.916667 1.3509
- [J28 1 0.916667 1.41909
- [J29 1 0.916667 1.46566
- [J30 1 0.916667 1.51978
- [J31 1 0.916667 1.57249
- [J32 1 0.916667 1.61922
- [J33 1 0.916667 1.66567
- [J34 1 0.916667 1.71288
- [J35 1 0.916667 1.76941
- [J36 1 0.916667 1.81707
- [J37 1 0.916667 1.86409
- [J38 1 0.916667 1.91094
- [J39 1 0.916667 1.95727
- [J40 1 0.916667 2.01688
- # 学習結果を確認
- ```python
- import json
- with open('result/log') as f:
- logs = json.load(f)
- ```
- ```python
- loss_train = [ log['main/loss'] for log in logs ]
- loss_test = [ log['validation/main/loss'] for log in logs ]
- ```
- ```python
- plt.plot(loss_train, label='train') # 訓練データ
- plt.plot(loss_test, label='test') # 検証データ
- plt.legend() # 凡例表示
- plt.show()
- ```
- ![png](output_22_0.png)
- ```python
- accuracy_train = [ log['main/accuracy'] for log in logs ]
- accuracy_test = [ log['validation/main/accuracy'] for log in logs ]
- ```
- ```python
- plt.plot(accuracy_train, label='train') # 訓練データ
- plt.plot(accuracy_test, label='test') # 検証データ
- plt.legend() # 凡例表示
- plt.show()
- ```
- ![png](output_24_0.png)
- # 予測値の計算(推論)
- ```python
- for datum in test:
- _x, _t = datum
- # クラスの予測値を計算
- y = cnn(np.array([_x])) # cnnの中のコール関数が呼ばれている?()
- y = F.softmax(y).data # softmax関数で足して1になるようデータ調整
- index = np.argmax(y) # もっとも値が大きいものを取得
- # 結果の表示
- print('教師データ: ', _t, ' 予測値: ', index, '予測値リスト', y)
- ```
- 教師データ: 1 予測値: 1 予測値リスト [[ 0.04602067 0.95397931]]
- 教師データ: 0 予測値: 0 予測値リスト [[ 0.82391012 0.17608985]]
- 教師データ: 1 予測値: 1 予測値リスト [[ 0.00875639 0.9912436 ]]
- 教師データ: 0 予測値: 0 予測値リスト [[ 0.8621484 0.13785164]]
- 教師データ: 1 予測値: 1 予測値リスト [[ 0.01890844 0.98109162]]
- 教師データ: 1 予測値: 1 予測値リスト [[ 0.00945963 0.99054039]]
- 教師データ: 1 予測値: 1 予測値リスト [[ 0.00305405 0.99694592]]
- 教師データ: 0 予測値: 1 予測値リスト [[ 0.38699657 0.61300349]]
- 教師データ: 0 予測値: 0 予測値リスト [[ 0.98359168 0.01640825]]
- 教師データ: 1 予測値: 1 予測値リスト [[ 0.10968747 0.89031249]]
- 教師データ: 0 予測値: 0 予測値リスト [[ 0.98453289 0.01546716]]
- 教師データ: 0 予測値: 0 予測値リスト [[ 0.97657734 0.0234226 ]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement