昨天捣鼓了一天两层网络(一层隐藏层)的MNIST手写数据识别系统,我用尽各种手法,各种图片处理办法,最终实测正确率被锁定在50%上下。这真让人沮丧。。。
今天脑子灵光一闪,2层网络性能不行,那就来3层吧!虽然没有现成的代码可以抄,但复制粘贴,举一反三,不就行了。于是,动手操作!
首先把 two_layer_net 类改成 three_layer_net,改改形状,加上W3和b3,predict函数多添两行,backward需要修改的比较多,稍微细心一点,也就可以类比出来了。
three_layer_net.py
import sys, os
from my_fn import *
class ThreeLayerNet:
def __init__(self, input_size, hidden_size1, hidden_size2, output_size,
weight_init_std=0.01):
# 初始化权重
self.params = {}
self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size1)
self.params['b1'] = np.zeros(hidden_size1)
self.params['W2'] = weight_init_std * np.random.randn(hidden_size1, hidden_size2)
self.params['b2'] = np.zeros(hidden_size2)
self.params['W3'] = weight_init_std * np.random.randn(hidden_size2, output_size)
self.params['b3'] = np.zeros(output_size)
def predict(self, x):
W1, W2, W3 = self.params['W1'], self.params['W2'], self.params['W3']
b1, b2, b3 = self.params['b1'], self.params['b2'], self.params['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
# x:输入数据, t:监督数据
def loss(self, x, t):
y = self.predict(x)
return cross_entropy_error(y, t)
def accuracy(self, x, t):
y = self.predict(x)
y = np.argmax(y, axis&#