#はじめに
「ゼロから作るDeep-Learning」の学習メモその1です。
#忘れがちなスライス操作
- [start:step:stop]で表示する数値の操作を行える。
スライス
x=[1,2,3,4,5]
# 全表示
x[:]
# 1から2まで
x[0:2]
# 1、3、5の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