LoginSignup
1
2

More than 3 years have passed since last update.

駆け出しエンジニアの機械学習メモ その1

Posted at

はじめに

「ゼロから作るDeep-Learning」の学習メモその1です。

忘れがちなスライス操作

  • [start:step:stop]で表示する数値の操作を行える。
スライス
x=[1,2,3,4,5]
# 全表示
x[:]
# 1から2まで
x[0:2]
# 135の2個飛ばし
x[::2]
# 逆順-2にすると逆から2個飛ばし
x[::-1]

Numpy 形状の一致

  • これが分かっていないとデータ前処理ができない
numpy
# 3×2 の形
A = np.array([[1,2], 
              [3,4],
              [5,6]])
# 2×1 の形
B = np.array([7,
              8])
# 内積計算
np.dot(A,B)
>>>array([23,53,83])

ニューラルネットワークの実装(3章)

  • Google Colaboratoryを使用しているためGoogleドライブのマウントが必要、これをしなければ別のPythonファイルのインポートができない。
マウント
from google.colab import drive
drive.mount('/content/drive')

cd drive/My Drive/deep-learning-from-scratch-master/ch03
  • import文、numpy、pickle、別ファイルの関数を呼び出している
neuralnet
# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax
  • 訓練データと訓練ラベル及びテストデータとテストラベルをmnist.pyより呼び出し格納、ここでx_test,t_testしか呼び出していないのは学習済みのデータを利用して推論処理を行うため。 学習させるためではないので訓練データは使わない。
neuralnet
def get_data():
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
    return x_test, t_test
  • 「sample_weight.pkl」は学習済み重みデータ、データの中身は辞書型で{W1:,W2:,W3:,b1:,b2:,b3}が入っている。
neuralnet
def init_network():
    with open("sample_weight.pkl", 'rb') as f:
        network = pickle.load(f)
    return network

*「sample_weight.pkl」から呼び出したデータを変数に格納し、モデルに投入、結果はNumpy配列として出てくる。このとき、numpy配列の中で最も大きい数値が予測の数字となる。

neuralnet
def predict(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = softmax(a3)

    return y
  • 変数tにはラベルデータが入っており、if文で予測値と正解ラベルが一致しているか判定している。ここでは、10000枚の画像データ中何枚正解か判定。結果はAccuracy:0.9352となる。
neuralnet
x, t = get_data()
network = init_network()
accuracy_cnt = 0
for i in range(len(x)):
    y = predict(network, x[i])
    p= np.argmax(y) # 最も確率の高い要素のインデックスを取得
    if p == t[i]:
        accuracy_cnt += 1

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))

バッチ処理(3章続き)

  • 前項目で記載しているニューラルネットワークは入力層784個、出力層10個のニューロンで構成。784は画像サイズの28×28で10は数字0~9のクラスの分類となっている。隠れ層が2つ、1つ目の隠れ層が50個、2つ目の隠れ層が100個のニューロンを持つ設定となっている。これは学習済みデータである「sample_weight.pkl」の形に合わせている。
  • バッチ処理では10000枚ある画像データのうち100枚分のデータをまとめて入力データとすることができる。これにより、処理がはやくなる。
  • axis = 1 と書いてある部分は列方向の最大値をとるようにしている。
  • np.sum(p == t[i:i+batch_size])では比較演算子(==)でTrueを判定し、個数を算出している。
バッチ処理
x, t = get_data()
network = init_network()

batch_size = 100 # バッチの数
accuracy_cnt = 0

#range(start,stop,step)
for i in range(0, len(x), batch_size):
    x_batch = x[i:i+batch_size]
    y_batch = predict(network, x_batch)
    p = np.argmax(y_batch, axis=1)
    accuracy_cnt += np.sum(p == t[i:i+batch_size])

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))

参考

ゼロから作るDeep Learning

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2