DL之CNN:自定义SimpleConvNet【3层,im2col优化】利用mnist数据集实现手写数字识别多分类训练来评估模型

简介: DL之CNN:自定义SimpleConvNet【3层,im2col优化】利用mnist数据集实现手写数字识别多分类训练来评估模型

输出结

image.png

 

设计思

image.png

 

核心代

class Convolution:

   def __init__(self, W, b, stride=1, pad=0):  

……

   def forward(self, x):  

       FN, C, FH, FW = self.W.shape  

       N, C, H, W = x.shape

       out_h = 1 + int((H + 2*self.pad - FH) / self.stride)

       out_w = 1 + int((W + 2*self.pad - FW) / self.stride)

       col = im2col(x, FH, FW, self.stride, self.pad)    

       col_W = self.W.reshape(FN, -1).T                  

           

       out = np.dot(col, col_W) + self.b                  

       out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2)

       

       self.x = x

       self.col = col

       self.col_W = col_W

       return out  

   def backward(self, dout):    

       FN, C, FH, FW = self.W.shape                  

       dout = dout.transpose(0,2,3,1).reshape(-1, FN)  

       self.db = np.sum(dout, axis=0)    

       self.dW = np.dot(self.col.T, dout)

       self.dW = self.dW.transpose(1, 0).reshape(FN, C, FH, FW)

       dcol = np.dot(dout, self.col_W.T)  

       return dx  

class Pooling:

   def __init__(self, pool_h, pool_w, stride=1, pad=0):

       self.pool_h = pool_h

       self.pool_w = pool_w

       self.stride = stride

       self.pad = pad

     

       self.x = None

       self.arg_max = None

……

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['pad']

       filter_stride = conv_param['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))

       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 = OrderedDict()

       self.layers['Conv1'] = Convolution(self.params['W1'], self.params['b1'],

                                          conv_param['stride'], conv_param['pad'])  

       self.layers['Relu1'] = Relu()                                                

       self.layers['Pool1'] = Pooling(pool_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()  

 

……

   def save_params(self, file_name="params.pkl"):  

       params = {}                            

       for key, val in self.params.items():

           params[key] = val

       with open(file_name, 'wb') as f:    

           pickle.dump(params, f)

   def load_params(self, file_name="params.pkl"):  

       with open(file_name, 'rb') as f:      

           params = pickle.load(f)

       for key, val in params.items():      

           self.params[key] = val

       for i, key in enumerate(['Conv1', 'Affine1', 'Affine2']):

           self.layers[key].W = self.params['W' + str(i+1)]

           self.layers[key].b = self.params['b' + str(i+1)]


相关文章
|
8月前
|
机器学习/深度学习 编解码 PyTorch
Pytorch实现手写数字识别 | MNIST数据集(CNN卷积神经网络)
Pytorch实现手写数字识别 | MNIST数据集(CNN卷积神经网络)
|
8月前
|
机器学习/深度学习 算法 数据库
基于CNN卷积网络的MNIST手写数字识别matlab仿真,CNN编程实现不使用matlab工具箱
基于CNN卷积网络的MNIST手写数字识别matlab仿真,CNN编程实现不使用matlab工具箱
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
5月前
|
机器学习/深度学习
CNN网络编译和训练
【8月更文挑战第10天】CNN网络编译和训练。
98 20
|
7月前
|
边缘计算 JSON 网络协议
移动端IM开发者必读(三):爱奇艺移动端跨国弱网通信的优化实践
本次分享的文章内容,基于爱奇艺面向全球用户推出的国际版,在海外跨国网络环境复杂的前提下,针对性地做了一系列弱网优化实践,取得了不错的效果,在此总结分享我们的一些做法和优化思路,希望对你有所帮助。
89 1
|
8月前
|
机器学习/深度学习 数据可视化 数据挖掘
R语言深度学习卷积神经网络 (CNN)对 CIFAR 图像进行分类:训练与结果评估可视化
R语言深度学习卷积神经网络 (CNN)对 CIFAR 图像进行分类:训练与结果评估可视化
|
8月前
|
机器学习/深度学习 算法 TensorFlow
【视频】神经网络正则化方法防过拟合和R语言CNN分类手写数字图像数据MNIST|数据分享
【视频】神经网络正则化方法防过拟合和R语言CNN分类手写数字图像数据MNIST|数据分享
|
8月前
|
机器学习/深度学习 数据采集 TensorFlow
R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)
R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)
|
15天前
|
机器学习/深度学习 算法 计算机视觉
基于CNN卷积神经网络的金融数据预测matlab仿真,对比BP,RBF,LSTM
本项目基于MATLAB2022A,利用CNN卷积神经网络对金融数据进行预测,并与BP、RBF和LSTM网络对比。核心程序通过处理历史价格数据,训练并测试各模型,展示预测结果及误差分析。CNN通过卷积层捕捉局部特征,BP网络学习非线性映射,RBF网络进行局部逼近,LSTM解决长序列预测中的梯度问题。实验结果表明各模型在金融数据预测中的表现差异。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)##
在当今的人工智能领域,深度学习已成为推动技术革新的核心力量之一。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,因其在图像和视频处理方面的卓越性能而备受关注。本文旨在深入探讨CNN的基本原理、结构及其在实际应用中的表现,为读者提供一个全面了解CNN的窗口。 ##

热门文章

最新文章