CNN的實現(xiàn)
網(wǎng)絡(luò)的構(gòu)成是“Convolution - ReLU - Pooling -Affine - ReLU - Affine - Softmax”,我們將它實現(xiàn)為名為 SimpleConvNet的類。
首先來看一下 SimpleConvNet的初始化(init),取下面這些參數(shù)。
input_dim——輸入數(shù)據(jù)的維度:(通道,高,長)
conv_param——卷積層的超參數(shù)(字典)。字典的關(guān)鍵字如下:
filter_num——濾波器的數(shù)量
filter_size——濾波器的大小
stride——步幅
pad——填充
hidden_size——隱藏層(全連接)的神經(jīng)元數(shù)量
output_size——輸出層(全連接)的神經(jīng)元數(shù)量
weitght_int_std——初始化時權(quán)重的標準差
這里,卷積層的超參數(shù)通過名為 conv_param的字典傳入。
SimpleConvNet的實現(xiàn)如下:
class SimpleConvNet:
def __init__(self, input_dim=(1,28,28), conv_param={'filter_num':30, 'filter_size':5,'pad':0, 'stride':1}, hidden_size=100,output_size=10, weight_init_std=0.01):
filter_num = conv_param['filter_num']
filter_size = conv_param['filter_size']
filter_pad = conv_param['filter_pad']
filter_stride = conv_param['filter_stride']
input_size = input_dim[1]
conv_output_size = (input_size - filter_size + 2*filter_pad) / filter_stride +1
pool_output_size = int(filter_num * (conv_output_size /2) * (conv_output_size/2))
# 這里將由初始化參數(shù)傳入的卷積層的超參數(shù)從字典中取了出來(以方便后面使用),然后,計算卷積層的輸出大小。
# 接下來是權(quán)重參數(shù)的初始化部分
self.params = {}
self.params['W1'] = weight_init_std * np.random.randn(filter_num, input_dim[0],filter_size, filter_size)
self.params['b1'] = np.zeros(filter_num)
self.params['W2'] = weight_init_std * np.random.randn(pool_output_size, hidden_size)
self.params['b2'] = np.zeros(hidden_size)
self.params['W3'] = weight_init_std * np.random.randn(hidden_size, output_size)
self.params['b3'] = np.zeros(output_size)
# 最后生成必要的層
self.layers = OrderDict()
self.layers['Conv1'] = Convolution(self.params['W1'],self.params['b1'],conv_param['stride'],conv_param['pad'])
self.layers['Relu1']= Relu()
self.layers['Pool1']= Pooling(poo_h=2,pool_w=2,stride=2)
self.layers['Affine1'] = Affine(self.params['W2'],self.params['b2'])
self.layers['Relu2'] = Relu()
self,layers['Affine2']= Affine(self.params['W3'],self.params['b3'])
self.last_layer = SoftmaxWithLoss()
# 從最前面開始按順序向有序字典(OrderedDict)的layers中添加層。只有最后的SoftmaxWithLoss層被添加到別的變量LastLayer中。
以上就是simpleConvNet的初始化中進行的處理。像這樣初始化后,進行推理的predict方法和求損失函數(shù)值的 Loss方法就可以像下面這樣實現(xiàn)
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)
這里,參數(shù)x是輸入數(shù)據(jù),t是監(jiān)督標簽。用于推理的predict方法從頭開始依次調(diào)用已添加的層,并將結(jié)果傳遞給下一層。
在求損失函數(shù)的loss方法中,除了使用predict方法進行的forward處理之外,還會繼續(xù)進行forward處理,直到到達最后的SoftmaxwithLoss層。
下面是基于誤差反向傳播法求梯度的代碼實現(xiàn)
def gradient(self,x,t):
#forward
self.loss(x,t)
#backward
dout = 1
dout = self.lastLayer.backward(dout)
layers = list(self.layers.values())
layers.reverse()
for layer in layers:
dout = layer.backward(dout)
# 設(shè)定
grads={}
grads['W1'] = self,layers['Conv1'].dw
grads['b1'] = self.layers['Conv1'].db
grads['W2'] = self.layers['Affine1'].dw
grads['b2'] = self,layers['Affine1'].db
grads['W3'] = self,layers['Affine2'].dw
grads['b3'] = self.layers['Affine2'].db
return grads
參數(shù)的梯度通過誤差反向傳播法(反向傳播)求出文章來源:http://www.zghlxwxcb.cn/news/detail-496452.html
使用這個 SimpleConvNet學(xué)習(xí) MNIST 數(shù)據(jù)集。訓(xùn)練數(shù)據(jù)的識別率為 99.82%,測試數(shù)據(jù)的識別率為 98.96%,測試數(shù)據(jù)的識別率大約為 99%,就小型網(wǎng)絡(luò)來說,這是一個非常高的識別率。文章來源地址http://www.zghlxwxcb.cn/news/detail-496452.html
到了這里,關(guān)于【深度學(xué)習(xí)】6-4 卷積神經(jīng)網(wǎng)絡(luò) - CNN的實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!