ゼロから作るDeep Learning(18日目)

こんにちは、筋肉めがねです。

 

Contactless paymentと言えば、今月初旬に日本でPayPayが「100億円あげちゃう」キャンペーンを実施しましたね。「箪笥預金」という言葉がこれだけ有名になる日本でも、cashlessの波はきているようです。昨日の記事でも書いたApple Payにしろ、そしてPayPayにしろ、世の中はCashlessの方向へと進んでいるのですね。という事で、ここ半年、新しい財布を買おうと思って意気込んでいた僕の気持ちと、きちんともう一度向き合ってみようと思います。

f:id:KinnikuMegane:20181221083115j:plain

それでは、本日も「ゼロから作るDeep Learning」 を進めていきましょう。

本日は5章最後の記事です。

 

前回の記事では、Softmax-with-Lossレイヤを実装しました。本日は、誤差逆伝播法に対応したニューラルネットワークを1つのクラスとして実装し、そして誤差逆伝播法を用いた「学習」を実装します。

先ずはコードです。

 

ニューラルネットワークをクラスとして実装します。

import sys, os
sys.path.append(os.pardir)
import numpy as np
from common.layers import *
from common.gradient import numerical_gradient
from collections import OrderDict

class TwoLayerNet:
	def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
		self.params = {}
		self.params[‘W1’] =	weight_init_std * \
					np.random.randn(input_size, hidden_size)
		self.params[‘b1’] =	 np.zeros(hidden_size)
		self.params[‘W2’] = 	weight_init_std * \
					np.random.randn(hidden_size, output_size)
		self.params[‘b2’] = 	np.zeros(output_size)

		self.layers = OrderDict()
		self.layers[‘Affine1’] = \
			Affine(self.params[‘W1’], self.params[‘b1’])
		Self.layers[‘Relu1’] = Relu()
		Self.layers[‘Affine2’] = \
			Affine(self.params[‘W2’], self.params[‘b2’])
		Self.lastLayer = SoftmaxWithLoss()

	def predict(self, x):
		for layer in self.layers.values():
			x = layer.forward(x)
		return x

	def loss(self, x, t):
		y = self.predict(x)
		return self.lastLayer forward(y, t)

	def accuracy(self, x, t):
		y = self.predict(x)
		y = np.argmax(y, axit=1)
		if t.ndim != 1 : t = np.argmax(t, axis = 1)

		accuracy = np.sum(y == t) / float(x.shape[0])
		return accuracy

	def numerical_gradient(self, x, t):
		loss_W = lambda W: self.loss(x, t)
		grards = {}
		grads[‘W1’] = numerical_gradient(loss_W, self.params[‘W1’])
		grads[‘b1’] = numerical_gradient(loss_W, self.params[‘b1’])
		grads[‘W2’] = numerical_gradient(loss_W, self.params[‘W2’]
		grads[‘b2’] = numerical_gradient(loss_W, self.params[‘b2’])
		return grads

	def gradient(self, x, t):
		self.loss(x, t)
		dout = 1
		dout = self.lastLayer.backward(dout)
		layers = list(self.layers.values())
		layers.reverse()
		for layer in layers:
			dout = layer.backward(dout)
		grads = {}
		grads[‘W1’] = self.layers[‘Affine1’].dW
		grads[‘b1’] = self.layers[‘Affine1’].db
		grads[‘W2’] = self.layers[‘Affine2’].dW
		grads[‘b2’] = self.layers[‘Affine2’].db
		return grads

続いて「学習」を実装します。

import sys, os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet

(x_train, t_train), (x_test, t_test) = \
	Load_mnist(normalize = True, one_hot_label = True)

network = TwoLayerNet(input_size = 784, hidden_size = 50, output_size=10)

iters_num = 10000
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.1

train_loss_list = []
train_acc_list = []
test_acc_list = []

iter_per_epoch = max(train_size / batch_size, 1)
for i in range(iters_num):
	batch_mask = np.random.choice(train_size, batch_size)
	x_batch = x_train[batch_mask]
	t_batch = t_train[batch_mask]
	grad = network.gradient(x_batch, t_batch)
	for key in (‘W1’, ‘b1’, ‘W2’, ‘b2’):
		network.params[key] -= learning_rate * grad[key]
	loss = network.loss(x_batch, t_batch)
	train_loss_list.append(loss)
	if i % iter_per_epoch == 0:
		train_acc = network.accuracy(x_train, t_train)
		test_acc = network.accuracy(x_test, t_test)
		train_acc_list.append(train_acc)
		test_acc_list.append(test_acc)
		print(train_acc, test_acc)

ここでのニューラルネットワークの実装において大事なことは1点です。それは、ネットワークにおける各層を各々レイヤーとして実装することができ、それを順番にOrderedDictという順番付きディクショナリに保持する事ができる、という事です。「推論」のフェーズではforward処理を呼び出し、ディクショナリに保持されているレイヤを前から順番に呼び出すことができますし、「学習」フェーズではbackward処理を呼び出すことで、レイヤを後ろから順番に呼び出すことができるんですね。

以上で5章は終わりです。

12月が残り10日で終わりますね。それまでに、「ゼロから作るDeep Learning」を終わらせましょう。

 

それでは、本日は以上でございます。


にほんブログ村 IT技術ブログへ
にほんブログ村



Pythonランキング