使用Python原生代码实现简易两层卷积网络

版权申诉
0 下载量 139 浏览量 更新于2024-11-27 收藏 3KB RAR 举报
在深度学习和人工智能领域,卷积神经网络(Convolutional Neural Networks,简称CNNs)是处理图像识别、视频分析、自然语言处理等多个任务的重要模型结构。CNN模型通过卷积层、池化层等能够有效提取输入数据的空间层级特征,而两层卷积网络作为CNN的基础模型,是学习和理解卷积神经网络概念的理想起点。 在给定的文件信息中,【标题】指向了一个使用Python原生代码实现的两层卷积网络,文件名为"TwoLayerNet.ipynb"。这个标题暗示了代码不依赖于任何额外的深度学习框架,如TensorFlow、PyTorch等,而是采用Python原生的数据结构(如列表、字典)和控制流(如循环、条件判断)来实现网络的前向传播和反向传播算法。【描述】中所提到的"不调用python库"进一步明确了这一点。 【描述】中的知识点涉及到如何仅使用Python基础功能来实现复杂的数学运算和网络操作。这包括了如何实现卷积、激活函数(如ReLU)、池化等核心操作,以及如何初始化网络权重和偏置、如何通过前向传播过程计算输出,以及如何通过反向传播算法进行权重更新。这些是构建任何卷积神经网络的基础,对于初学者来说,理解这些操作的原理和实现方式是非常重要的。 在【标签】中只有一个词"python",这表明相关的讨论和代码都是建立在Python语言的基础之上。Python是一种广泛使用的高级编程语言,以其简洁的语法和强大的库支持而闻名。在数据科学和人工智能领域,Python因其易读性和易用性成为首选语言。 从【压缩包子文件的文件名称列表】中,我们可以得知这个文件是一个Jupyter Notebook文件,文件扩展名为.ipynb。Jupyter Notebook是一个开源的Web应用程序,允许用户创建和共享包含实时代码、方程、可视化和说明性文本的文档。这种格式非常适合教学、原型开发以及数据科学和机器学习的研究。 在实现两层卷积网络时,可能会遇到的一些关键概念和知识点包括: 1. **卷积层(Convolutional Layer)**:这是CNN的核心操作,通过卷积核(滤波器)在输入图像上滑动来提取局部特征。 2. **非线性激活函数(Nonlinear Activation Function)**:最常见的激活函数之一是ReLU(Rectified Linear Unit),它对于引入非线性特性至关重要,使得网络能够学习复杂的模式。 3. **池化层(Pooling Layer)**:池化层通过降维操作减少特征图的空间尺寸,增强模型的不变性。 4. **权重和偏置(Weights and Biases)**:这些是学习参数,通过训练过程调整,使网络能够准确地预测或分类。 5. **损失函数(Loss Function)**:这是衡量模型预测值与真实值之间差异的一种方法。常见的损失函数包括均方误差(MSE)和交叉熵损失。 6. **反向传播算法(Backpropagation)**:这是一种计算损失函数相对于网络参数的梯度的方法,通过梯度下降算法来更新参数以最小化损失函数。 7. **正则化(Regularization)**:为了防止过拟合,可能会使用如L2正则化、Dropout等策略。 实现两层卷积网络的Python代码将需要设计上述组件,并且精确地编写计算前向传播和反向传播的逻辑。这是一个很好的练习,不仅有助于理解CNN的工作原理,而且还能加深对机器学习和深度学习中核心概念的理解。此外,通过原生Python实现还有助于提高对Python编程语言本身的熟练度,为日后使用高级深度学习框架打下坚实的基础。

import idx2numpy import numpy as np from functions import * from two_layer_network import * #导入训练集和训练集对应的标签并将其初始化 X_train,T_train=idx2numpy.convert_from_file('emnist/emnist-letters-train-images-idx3-ubyte'),idx2numpy.convert_from_file('emnist/emnist-letters-train-labels-idx1-ubyte') X_train,T_train=X_train.copy(),T_train.copy() X_train=X_train.reshape((X_train.shape[0],-1)) T_train=T_train-1 T_train=np.eye(26)[T_train] #导入测试集和测试集对应的标签标签并将其初始化 X_test,T_test=idx2numpy.convert_from_file('emnist/emnist-letters-test-images-idx3-ubyte'),idx2numpy.convert_from_file('emnist/emnist-letters-test-labels-idx1-ubyte') X_test,T_test=X_test.copy(),T_test.copy() X_test=X_test.reshape((X_test.shape[0],-1)) T_test=T_test-1 T_test=np.eye(26)[T_test] network=TwoLayerNet(input_size=784,hidden_size=45,output_size=26) train_size=X_train.shape[0] batch_size=100 iters_num=100000 learning_rate=0.01 train_loss_list=[] train_acc_list=[] test_acc_list=[] iter_per_epoch=max(train_size/batch_size,1) for i in range(iters_num): batch_mask=np.random.choice(train_size,batch_size) X_batch=X_train[batch_mask] T_batch=T_train[batch_mask] #从数据集里抽取batch_size笔数据 #grad=network.numerical_gradient(X_batch,T_batch)(跑不出来,卡在None None) grad=network.gradient(X_batch,T_batch) #计算梯度 for key in ('W1','b1','W2','b2') : network.params[key]-=learning_rate*grad[key] #误差反向传播法调整参数 loss=network.loss(X_batch,T_batch) train_loss_list.append(loss) #记录学习过程 if i % iter_per_epoch==0: train_acc=network.accuracy(X_train,T_train) test_acc=network.accuracy(X_test,T_test) train_acc_list.append(train_acc) test_acc_list.append(test_acc) print(train_acc,test_acc) #调整学习率 if i > 0 and i % 1000 == 0 and i<3000: learning_rate *= 0.1 print("learning rate reduced to " + str(learning_rate)) print(network.params) print(train_acc_list[-1],test_acc_list[-1])如果我想存储参数,该怎么做

2023-05-29 上传