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)]


相关文章
|
19天前
|
机器学习/深度学习 存储 人工智能
【AI系统】轻量级CNN模型综述
本文介绍了几种常见的小型化CNN模型,包括SqueezeNet、ShuffleNet、MobileNet等系列。这些模型通过减少参数量和计算量,实现在有限资源下高效运行,适用于存储和算力受限的场景。文章详细解释了各模型的核心技术和优化策略,如Fire Module、Channel Shuffle、Depthwise Separable Convolutions等,旨在帮助读者理解和应用这些高效的小型化CNN模型。
36 3
|
2月前
|
机器学习/深度学习 编解码 算法
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
52 0
|
3月前
|
机器学习/深度学习
ACM MM24:复旦提出首个基于扩散模型的视频非限制性对抗攻击框架,主流CNN和ViT架构都防不住它
【9月更文挑战第23天】复旦大学研究团队提出了ReToMe-VA,一种基于扩散模型的视频非限制性对抗攻击框架,通过时间步长对抗性潜在优化(TALO)与递归令牌合并(ReToMe)策略,实现了高转移性且难以察觉的对抗性视频生成。TALO优化去噪步骤扰动,提升空间难以察觉性及计算效率;ReToMe则确保时间一致性,增强帧间交互。实验表明,ReToMe-VA在攻击转移性上超越现有方法,但面临计算成本高、实时应用受限及隐私安全等挑战。[论文链接](http://arxiv.org/abs/2408.05479)
86 3
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
4月前
|
机器学习/深度学习
CNN模型验证和CNN模型保存
【8月更文挑战第10天】CNN模型验证和CNN模型保存。
69 27
|
4月前
|
机器学习/深度学习
加载CNN保存模型
【8月更文挑战第10天】加载CNN保存模型。
47 12
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
算法金 | 秒懂 AI - 深度学习五大模型:RNN、CNN、Transformer、BERT、GPT 简介
**RNN**,1986年提出,用于序列数据,如语言模型和语音识别,但原始模型有梯度消失问题。**LSTM**和**GRU**通过门控解决了此问题。 **CNN**,1989年引入,擅长图像处理,卷积层和池化层提取特征,经典应用包括图像分类和物体检测,如LeNet-5。 **Transformer**,2017年由Google推出,自注意力机制实现并行计算,优化了NLP效率,如机器翻译。 **BERT**,2018年Google的双向预训练模型,通过掩码语言模型改进上下文理解,适用于问答和文本分类。
172 9
|
5月前
|
机器学习/深度学习 PyTorch 算法框架/工具
图神经网络是一类用于处理图结构数据的神经网络。与传统的深度学习模型(如卷积神经网络CNN和循环神经网络RNN)不同,
图神经网络是一类用于处理图结构数据的神经网络。与传统的深度学习模型(如卷积神经网络CNN和循环神经网络RNN)不同,
|
5月前
|
机器学习/深度学习 数据采集 算法
Python基于卷积神经网络CNN模型和VGG16模型进行图片识别项目实战
Python基于卷积神经网络CNN模型和VGG16模型进行图片识别项目实战
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)##
在当今的人工智能领域,深度学习已成为推动技术革新的核心力量之一。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,因其在图像和视频处理方面的卓越性能而备受关注。本文旨在深入探讨CNN的基本原理、结构及其在实际应用中的表现,为读者提供一个全面了解CNN的窗口。 ##

热门文章

最新文章