用python写一个程序:手写一个卷积神经网络,包括一个卷积层,一个池化层,一个全连接层,反向传播算法,要求:给出完整的训练过程,包括数据集的导入,模型搭建,训练等,给出结果可视化,附上详细代码注释,不调tensorflow库,使用sklearn库中的数据集

时间: 2024-05-13 13:14:46 浏览: 14
好的,下面是一个简单的卷积神经网络的代码示例,包括一个卷积层,一个池化层,一个全连接层和反向传播算法。本代码使用的是sklearn库中的手写数字数据集,将手写数字图片转换为28*28的像素矩阵。代码注释详细,希望对你有帮助。 ```python import numpy as np from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split class ConvolutionalNeuralNetwork: def __init__(self): self.lr = 0.1 # 学习率 self.epoch = 10 # 迭代次数 self.batch_size = 32 # 批次大小 self.conv_w = np.random.randn(3, 3, 1, 32) # 卷积核权重,大小为3*3,通道数为1,数量为32 self.conv_b = np.random.randn(32) # 卷积核偏置,数量为32 self.fc_w = np.random.randn(1568, 10) # 全连接层权重,输入为28*28*32,输出为10 self.fc_b = np.random.randn(10) # 全连接层偏置,数量为10 def conv2d(self, x, w, b, stride=1, padding=0): n, h, w, c = x.shape # 输入数据的维度 kh, kw, _, kn = w.shape # 卷积核的维度 ph, pw = padding, padding # 上下左右填充像素数 oh, ow = int((h + 2 * ph - kh) / stride) + 1, int((w + 2 * pw - kw) / stride) + 1 # 输出特征图的尺寸 # 对输入数据进行填充 pad_x = np.zeros((n, h + 2 * ph, w + 2 * pw, c)) pad_x[:, ph:h + ph, pw:w + pw, :] = x # 初始化输出特征图和卷积核的梯度 out = np.zeros((n, oh, ow, kn)) dw = np.zeros(w.shape) db = np.zeros(b.shape) # 卷积运算 for i in range(oh): for j in range(ow): for k in range(kn): out[:, i, j, k] = np.sum(pad_x[:, i*stride:i*stride+kh, j*stride:j*stride+kw, :] * w[:, :, :, k], axis=(1,2,3)) + b[k] # 计算卷积核和偏置的梯度 for i in range(oh): for j in range(ow): for k in range(kn): db[k] += np.sum(out[:, i, j, k]) for l in range(c): dw[:, :, l, k] += np.sum(pad_x[:, i*stride:i*stride+kh, j*stride:j*stride+kw, l] * out[:, i, j, k][:, np.newaxis, np.newaxis], axis=0) # 去掉填充的像素 out = out[:, padding:oh-padding, padding:ow-padding, :] return out, dw, db def max_pool2d(self, x, size=2, stride=2): n, h, w, c = x.shape # 输入数据的维度 oh, ow = int((h - size) / stride) + 1, int((w - size) / stride) + 1 # 输出特征图的尺寸 # 初始化输出特征图 out = np.zeros((n, oh, ow, c)) # 最大池化运算 for i in range(oh): for j in range(ow): out[:, i, j, :] = np.max(x[:, i*stride:i*stride+size, j*stride:j*stride+size, :], axis=(1,2)) return out def softmax(self, x): # 防止指数爆炸 exp_x = np.exp(x - np.max(x, axis=1, keepdims=True)) return exp_x / np.sum(exp_x, axis=1, keepdims=True) def forward(self, x): # 卷积层 conv_out, conv_dw, conv_db = self.conv2d(x, self.conv_w, self.conv_b, padding=1) conv_out = np.maximum(0, conv_out) # ReLU激活函数 # 池化层 pool_out = self.max_pool2d(conv_out, size=2, stride=2) # 全连接层 fc_in = np.reshape(pool_out, (pool_out.shape[0], -1)) fc_out = np.dot(fc_in, self.fc_w) + self.fc_b # 输出层 out = self.softmax(fc_out) # 保存中间结果和梯度 self.conv_out = conv_out self.pool_out = pool_out self.fc_in = fc_in self.fc_out = fc_out self.conv_dw = conv_dw self.conv_db = conv_db self.fc_dw = np.dot(fc_in.T, (out - self.y)) # 计算全连接层的梯度 self.fc_db = np.sum(out - self.y, axis=0) # 计算偏置的梯度 return out def backward(self): # 反向传播 fc_in_grad = np.dot(self.conv_dw.reshape(-1, self.conv_w.shape[-1]), self.fc_dw.T) fc_in_grad = np.reshape(fc_in_grad, self.pool_out.shape) pool_out_grad = fc_in_grad * (self.conv_out > 0) conv_out_grad = np.zeros_like(self.conv_out) _, kh, kw, kn = self.conv_w.shape for i in range(self.conv_out.shape[1]): for j in range(self.conv_out.shape[2]): for k in range(kn): conv_out_grad[:, i:i+kh, j:j+kw, :] += np.sum(pool_out_grad[:, i:i+1, j:j+1, k:k+1] * self.conv_w[:, :, :, k:k+1], axis=-1) # 更新权重和偏置 self.conv_w -= self.lr * self.conv_dw / self.batch_size self.conv_b -= self.lr * self.conv_db / self.batch_size self.fc_w -= self.lr * self.fc_dw / self.batch_size self.fc_b -= self.lr * self.fc_db / self.batch_size def train(self, X_train, y_train): n_samples = X_train.shape[0] n_batches = int(np.ceil(n_samples / self.batch_size)) for i in range(self.epoch): for j in range(n_batches): # 获取当前批次的数据和标签 start_idx = j * self.batch_size end_idx = min(start_idx + self.batch_size, n_samples) X_batch = X_train[start_idx:end_idx] y_batch = y_train[start_idx:end_idx] self.y = np.zeros((y_batch.shape[0], 10)) self.y[np.arange(y_batch.shape[0]), y_batch] = 1 # 前向传播和反向传播 self.forward(X_batch) self.backward() # 计算损失函数并输出当前迭代次数和损失函数值 loss = -np.sum(self.y * np.log(self.fc_out)) / self.batch_size print("epoch: {}, loss: {}".format(i+1, loss)) def predict(self, X_test): # 前向传播获取预测结果 pred = np.argmax(self.forward(X_test), axis=1) return pred # 加载sklearn库中的手写数字数据集 digits = load_digits() X = digits.images y = digits.target # 将手写数字图片转换为28*28的像素矩阵 X = X.reshape(-1, 8, 8, 1) X = np.pad(X, ((0,0),(1,1),(1,1),(0,0)), mode='constant') # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y) # 创建卷积神经网络对象并训练 cnn = ConvolutionalNeuralNetwork() cnn.train(X_train, y_train) # 在测试集上进行预测并输出准确率 pred = cnn.predict(X_test) accuracy = np.mean(pred == y_test) print("accuracy:", accuracy) ```

相关推荐

最新推荐

recommend-type

Mysql 教程(Markd格式 经典全面 看这一个资料就够了)

Mysql 教程(Markd格式 经典全面 看这一个资料就够了)涵盖了mysql工作流、事务、锁、索引、性能优化、运维和配置等各个方面。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB图像处理算法宝典:从理论到实战

![MATLAB图像处理算法宝典:从理论到实战](https://img-blog.csdnimg.cn/20200717112736401.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1emhhbzk5MDE=,size_16,color_FFFFFF,t_70) # 1. MATLAB图像处理基础理论 MATLAB图像处理是一种利用MATLAB编程语言进行图像处理的强大工具。它提供了丰富的函数和工具箱,用于图像获取、增强、分
recommend-type

matlab中1/x的非线性规划

在MATLAB中,可以使用非线性规划函数(`fmincon`)来优化一个包含1/x的非线性目标函数。下面是一个简单的例子: ```matlab % 定义目标函数 fun = @(x) 1/x; % 定义约束函数(这里没有约束) nonlcon = []; % 定义初始点 x0 = 1; % 定义优化选项 options = optimoptions('fmincon', 'Display', 'iter'); % 进行非线性规划 [x, fval] = fmincon(fun, x0, [], [], [], [], [], [], nonlcon, options); ``` 在
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB数据可视化黑科技:洞悉数据背后的秘密

![MATLAB数据可视化黑科技:洞悉数据背后的秘密](https://img-blog.csdnimg.cn/img_convert/1a36558cefc0339f7836cca7680c0aef.png) # 1. MATLAB数据可视化的基本原理 MATLAB数据可视化是一种将数据转化为图形表示形式的技术,以帮助人们理解和分析数据。其基本原理包括: - **数据表示:**将原始数据转换为图形元素,如点、线和条形。 - **图形布局:**确定图形元素在绘图区域中的位置和大小。 - **图形美化:**添加标题、标签、颜色和纹理等元素,以增强图形的可读性和美观性。 - **交互性:**允
recommend-type

优化算法计算单位面积年平均输出热功率的代码

计算单位面积年平均输出热功率的代码具体情况取决于你所要解决的问题和需要的数据。然而,我可以给你一个通用的优化算法的框架,你可以根据具体情况进行调整。 首先,你需要明确计算单位面积年平均输出热功率的数学公式或算法。假设你已经有了计算热功率的函数 `calculate_power`,它接受一些输入参数,并返回热功率值。 下面是一个示例的优化算法框架,以最大化单位面积年平均输出热功率为目标: ```python import random def objective_function(params): # 这个函数用于计算目标函数的值 # 根据具体情况,你需要将 params
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。