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


相关文章
|
2月前
|
机器学习/深度学习 传感器 算法
基于GA-HIDMSPSO优化CNN-SVM分类预测的研究(Matlb代码实现)
基于GA-HIDMSPSO优化CNN-SVM分类预测的研究(Matlb代码实现)
104 0
|
6月前
|
缓存 自然语言处理 监控
基于通义大模型的智能客服系统构建实战:从模型微调到API部署
本文详细解析了基于通义大模型的智能客服系统构建全流程,涵盖数据准备、模型微调、性能优化及API部署等关键环节。通过实战案例与代码演示,展示了如何针对客服场景优化训练数据、高效微调大模型、解决部署中的延迟与并发问题,以及构建完整的API服务与监控体系。文章还探讨了性能优化进阶技术,如模型量化压缩和缓存策略,并提供了安全与合规实践建议。最终总结显示,微调后模型意图识别准确率提升14.3%,QPS从12.3提升至86.7,延迟降低74%。
2125 16
|
12月前
|
存储 自然语言处理 机器人
基于的Qwen模型的智能客服Discord机器人,使用🐫 CAMEL、SambaNova、Firecrawl和Qdrant实现RAG Agent
基于Qwen模型的智能客服Discord机器人,使用CAMEL、SambaNova、Firecrawl和Qdrant实现RAG Agent。构建了一个能够处理复杂问题并能进行快速响应的强大聊天机器人。该机器人可在Discord平台上运行,支持实时对话和语义搜索,提供准确、全面的回答。项目包含详细的安装步骤、代码示例及集成指南,适合开发者快速上手。
|
自然语言处理 安全 API
AppFlow:让大模型当您的微信公众号客服
使用阿里云AppFlow和通义百炼,无需编码即可将大模型如通义千问接入微信公众号。首先确保公众号已认证,然后在通义百炼导入文档创建知识库。在AppFlow中选择“微信公众号大模型自动回复”模板,添加微信凭证和百炼API密钥。配置微信公众平台的服务器地址、Token和EncodingAESKey,并设置IP白名单。完成这些步骤后,用户在公众号的提问将由大模型自动回答。AppFlow简化了集成过程,助力高效智能客服建设。
42146 19
|
机器学习/深度学习
CNN网络编译和训练
【8月更文挑战第10天】CNN网络编译和训练。
229 20
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
人工智能 自然语言处理 搜索推荐
大模型时代,如何让AI客服“听懂人话”、“更有温度”?
大模型时代,如何让AI客服“听懂人话”、“更有温度”?
906 1
|
机器学习/深度学习 算法 TensorFlow
【视频】神经网络正则化方法防过拟合和R语言CNN分类手写数字图像数据MNIST|数据分享
【视频】神经网络正则化方法防过拟合和R语言CNN分类手写数字图像数据MNIST|数据分享
|
3月前
|
机器学习/深度学习 传感器 数据采集
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
657 0
|
3月前
|
机器学习/深度学习 传感器 数据采集
【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
287 0

热门文章

最新文章