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


相关文章
|
5天前
|
机器学习/深度学习 算法 数据可视化
基于WOA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真
该文介绍了使用优化后的深度学习模型(基于CNN、LSTM和Attention机制)进行时间序列预测,对比了优化前后的效果,显示了性能提升。算法在MATLAB2022a中实现,利用WOA(鲸鱼优化算法)调整模型超参数。模型通过CNN提取局部特征,LSTM处理序列依赖,Attention机制关注相关历史信息。核心程序展示了WOA如何迭代优化及预测过程,包括数据归一化、网络结构分析和预测误差可视化。
|
5天前
|
机器学习/深度学习 算法 数据挖掘
基于WOA优化的CNN-GRU-Attention的时间序列回归预测matlab仿真
使用MATLAB2022a,结合WOA优化算法调整了CNN-LSTM-Attention模型的超参数。WOA仿照鲸鱼捕食策略解决优化问题,提升时间序列预测准确性。模型先用CNN提取局部特征,接着LSTM处理长期依赖,最后注意力机制聚焦相关历史信息。优化前后效果对比图显示,预测性能显著改善。代码中展示了WOA优化的网络训练及预测过程,并绘制了预测值与真实值的比较图表。
|
12天前
|
机器学习/深度学习 算法 数据挖掘
基于PSO优化的CNN-GRU-Attention的时间序列回归预测matlab仿真
摘要: 本文介绍了运用粒子群优化(PSO)调整深度学习模型超参数以提升时间序列预测性能的方法。在比较了优化前后的效果(Ttttttttttt12 vs Ttttttttttt34)后,阐述了使用matlab2022a软件的算法。文章详细讨论了CNN、GRU网络和注意力机制在时间序列预测中的作用,以及PSO如何优化这些模型的超参数。核心程序展示了PSO的迭代过程,通过限制和调整粒子的位置(x1)和速度(v1),寻找最佳解决方案(gbest1)。最终,结果保存在R2.mat文件中。
基于PSO优化的CNN-GRU-Attention的时间序列回归预测matlab仿真
|
12天前
|
机器学习/深度学习 算法 TensorFlow
TensorFlow 2keras开发深度学习模型实例:多层感知器(MLP),卷积神经网络(CNN)和递归神经网络(RNN)
TensorFlow 2keras开发深度学习模型实例:多层感知器(MLP),卷积神经网络(CNN)和递归神经网络(RNN)
|
14天前
|
机器学习/深度学习 算法 TensorFlow
【视频】神经网络正则化方法防过拟合和R语言CNN分类手写数字图像数据MNIST|数据分享
【视频】神经网络正则化方法防过拟合和R语言CNN分类手写数字图像数据MNIST|数据分享
|
18天前
|
机器学习/深度学习 算法 数据挖掘
基于PSO优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真
该文档介绍了使用MATLAB2022A中PSO优化算法提升时间序列预测模型性能的过程。PSO优化前后对比显示了优化效果。算法基于CNN、LSTM和Attention机制构建CNN-LSTM-Attention模型,利用PSO调整模型超参数。代码示例展示了PSO的迭代优化过程及训练、预测和误差分析环节。最终,模型的预测结果以图形形式展示,并保存了相关数据。
|
22天前
|
机器学习/深度学习 人工智能 数据可视化
【视频】CNN(卷积神经网络)模型以及R语言实现回归数据分析
【视频】CNN(卷积神经网络)模型以及R语言实现回归数据分析
|
23天前
|
机器学习/深度学习 数据可视化 数据挖掘
R语言深度学习卷积神经网络 (CNN)对 CIFAR 图像进行分类:训练与结果评估可视化
R语言深度学习卷积神经网络 (CNN)对 CIFAR 图像进行分类:训练与结果评估可视化
|
23天前
|
机器学习/深度学习 数据采集 TensorFlow
R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)
R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)
|
18天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
PYTHON TENSORFLOW 2二维卷积神经网络CNN对图像物体识别混淆矩阵评估|数据分享
PYTHON TENSORFLOW 2二维卷积神经网络CNN对图像物体识别混淆矩阵评估|数据分享

热门文章

最新文章