一、作业说明
本文对应cs231n的用两层神经网络进行cifar10数据集的分类。
程序的源码已上传,也欢迎有需要的读者下载,地址为https://download.csdn.net/download/wjp_ctt/10766477
二、背景知识
关于全连接神经网络的详细知识,可以参见我的上一篇博客,cs231n神经网络,里面包含了神经网络的建立,梯度计算,正则化等基本知识。
在我们的程序中,使用了dropout正则化技术,和Adam学习率自适应方法。
三、程序源码
首先构建神经网络的一层,存放在layer.py文件中。
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 4 12:52:25 2018
@author: wjp_ctt
"""
import numpy as np
#定义神经网络的一层
class LAYER(object):
def __init__(self, input_dim, output_dim, data):
"""
初始化神经网络的一层
---------------------------------------------------
input_dim :输入维度
output_dim : 输出维度
data : 输入数据
"""
self.input_dim = input_dim
self.output_dim = output_dim
self.input = data
self.output = np.zeros([data.shape[0], output_dim])
self.u1 = np.zeros_like(self.output)
self.w = 0.01*np.random.rand(self.input_dim, self.output_dim)
self.b = 0.01 * np.ones(output_dim)
self.dw = np.zeros_like(self.w)
self.db = np.zeros_like(self.b)
self.dsdwh = []
self.dw_m = np.zeros_like(self.w)
self.dw_v = np.zeros_like(self.w)
self.db_m = np.zeros_like(self.b)
self.db_v = np.zeros_like(self.b)
def forward(self, training_mode, p):
temp = np.dot(self.input, self.w)
temp += self.b
temp[temp<=0]=0 #激活函数,使用ReLU
#训练模式下使用dropout
if training_mode:
self.u1=(np.random.rand(*temp.shape)<p)/p
temp *= self.u1
self.output = temp
基于神经网络的一层,我们进行神经网络的叠加,可以得到多层神经网络。这段程序存放于layer.py中。
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 4 14:48:40 2018
@author: wjp_ctt
"""
import numpy as np
import layer
from matplotlib import pylab as plt
#定义神经网络
class NN(object):
def __init__(self, num_layers, layer_size, data, labels, learning_rate, p, batch_size, iterations, k, beta1, beta2):
"""
初始化神经网络
num_layers :网络的层数
layer_size