cs231n assignment2 ConvolutionalNetworks

深度学习小白——CS231n Assignment2(CNN) 二、卷积神经网络 【补1】np.pad(array, pad_width, mode, **kwargs) 对矩阵进行填充,此处用0将图像矩阵进行填充,所用代码为 x_pad[m][n]=np.pad(x[m][n], pad, 'constant', constant_values=0) 当pad为单独一个数时,意味着在原数组上下左右角上填充pad*pad大小的数组,其余位置自动补齐 阅读详情

Convolution

Naive forward pass

实现卷积操作,按照卷积的流程,写出最能理解的代码。

N, C, H, W = x.shape
F, _, HH, WW = w.shape
stride, pad = conv_param['stride'], conv_param['pad']
# 整除
H_out = 1 + (H + 2 * pad - HH) // stride
W_out = 1 + (W + 2 * pad - WW) // stride
# 预先分配
out = np.zeros((N, F, H_out, W_out))

# 只在长、宽上做变换,故只写第三第四维度
# 以常量进行填充,以constant_values=0填充
x_pad = np.pad(x, ((0, 0), (0, 0), (pad, pad), (pad, pad)), mode='constant', constant_values=0)

for i in range(N):  # 对于第i幅图片
	for f in range(F):  # 对于第f个滤波器
		for j in range(H_out):
			for k in range(W_out):
				out[i, f, j, k] = np.sum(x_pad[i, :, j * stride: HH + j * stride, k * stride: WW + k * stride] * w[f]) + b[f]

Naive backward pass

x, w, b, conv_param = cache
N, C, H, W = x.shape
F, _, HH, WW = w.shape
stride, pad = conv_param['stride'], conv_param['pad']
H_out = 1 + (H + 2 * pad - HH) / stride
W_out = 1 + (W + 2 * pad - WW) / stride

# padding
x_pad = np.pad(x, ((0, 0), (0, 0), (pad, pad), (pad, pad)), mode='constant', constant_values=0)
# 预分配
dx = np.zeros_like(x)
dx_pad = np.zeros_like(x_pad)
dw = np.zeros_like(w)
db = np.zeros_like(b)

for i in range(N):  # 第i个图片
	for f in range(F):  # 第f个滤波器
		for j in range(H_out):
			for k in range(W_out):
				window = x_pad[i, :, j * stride: HH + j * stride, k * stride: WW + k * stride]
				db[f] += dout[i, f, j, k]
                dw[f] += window * dout[i, f, j, k]
                dx_pad[i, :, j * stride:HH + j * stride, k * stride: WW + k * stride] += w[f] * dout[i, f, j, k]

dx = dx_pad[:, :, pad: -pad, pad: -pad]

Max-Pooling

Naive forward

N, C, H, W = x.shape
pool_height, pool_width, stride = pool_param['pool_height'], pool_param['pool_width'], pool_param['stride']
H_out = 1 + (H - pool_height) // stride
W_out = 1 + (W - pool_width) // stride

out = np.zeros((N, C, H_out, W_out))
for j in range(H_out):
	for k in range(W_out):
		out[:, :, j, k] = np.max(x[:, :, j * stride:pool_height + j * stride, k * stride: pool_width + k * stride],
                                     axis=(2, 3))

pass

Naive backward

x, pool_param = cache
N, C, H, W = x.shape
pool_height, pool_width, stride = pool_param['pool_height'], pool_param['pool_width'], pool_param['stride']
H_out = 1 + (H - pool_height) // stride
W_out = 1 + (W - pool_width) // stride

dx = np.zeros_like(x)

for i in range(H_out):
	for j in range(W_out):
		x_masked = x[:, :, i * stride:i * stride + pool_width, j * stride:j * stride + pool_height]
		# print(x_masked.shape)
		max_x_masked = np.max(x_masked, axis=(2, 3))[:,:,None,None]
		# print(max_x_masked.shape)
		dx[:, :, i * stride:i * stride + pool_height, j * stride:j * stride + pool_width] += (x_masked == max_x_masked) * dout[:,:,i,j][:,:,None,None]
pass

Three-layer ConvNet

cnn.py
直接使用已经封装好的方法实现三层网络

首先计算scores

out_conv, cache_conv = conv_relu_pool_forward(X, W1, b1, conv_param, pool_param)
out_fc1, cache_fc1 = affine_relu_forward(out_conv, W2, b2)
scores, cache_fc2 = affine_forward(out_fc1, W3, b3)

接着计算loss和梯度,注意需要添加正则项

loss, dout = softmax_loss(scores,y)
loss += 0.5 * self.reg * (np.sum(W1 ** 2) + np.sum(W2 ** 2) + np.sum(W3 ** 2))


dx3, dW3, db3 = affine_backward(dout,cache_fc2)
dx2, dW2, db2 = affine_relu_backward(dx3, cache_fc1)
dx1, dw1, db1 = conv_relu_pool_backward(dx2, cache_conv)
grads['W3'] = dW3 + self.reg * W3
grads['b3'] = db3
grads['W2'] = dW2 + self.reg * W2
grads['b2'] = db2
grads['W1'] = dw1 + self.reg * W1
grads['b1'] = db1

Spatial Batch Normalization

Batchnorm对于全连接网络来讲有着巨大的作用,可以帮助网络实现正则化,防止过拟合。对于卷积神经网络需要对之前的Batchnorm做些小修改,主要表现在数据维度层面。之前的batchnorn是两维的,现在的卷积神经网络中数据成了4维,故需要用transpose和reshape函数对数据进行变换。

前向传播
layer.py中的spatial_batchnorm_forward()

N, C, H, W = x.shape
x_new = x.transpose(0, 2, 3, 1).reshape(N * H * W, C)
out, cache = batchnorm_forward(x_new, gamma, beta, bn_param)
out = out.reshape(N, H, W, C).transpose(0, 3, 1, 2)

layers.py中的spatial_batchnorm_backward()

N, C, H, W = dout.shape
dout_new = dout.transpose(0, 2, 3, 1).reshape(N * H * W, C)
dx, dgamma, dbeta = batchnorm_backward_alt(dout_new, cache)
dx = dx.reshape(N, H, W, C).transpose(0, 3, 1, 2)

Group Normalization

Group Normalization是2018年发表至ECCV的一篇论文提出来的。主要思想是折衷Layer Normalization和Instance Normalization的一种方法,即克服了batch的约束,又保证了收敛速度。
其主要思想是将特征通道进行分组,然后以[N,G,C//G,H,W]的维度进行归一化。

forward

N, C, H, W = x.shape
# 将特征通道数分组,按照分组重新设置形状
x_group = x.reshape((N, G, C // G, H, W))
mean = np.mean(x_group, axis=(2, 3, 4), keepdims=True)
var = np.var(x_group, axis=(2, 3, 4), keepdims=True)
x_norm = (x_group - mean) / np.sqrt(var + eps)  # 归一化
x_norm = x_norm.reshape((N, C, H, W))  # 还原维度
out = x_norm * gamma + beta
cache = (x, gamma, beta, G, eps, mean, var, x_norm)

backward

反向传播代码参考他人博客,博客地址见[1]

N, C, H, W = dout.shape
x, gamma, beta, G, eps, mean, var, x_norm = cache

dbeta = np.sum(dout, axis=(0, 2, 3), keepdims=True)
dgamma = np.sum(dout * x_norm, axis=(0, 2, 3), keepdims=True)

dx_norm = dout * gamma
dx_groupnorm = dx_norm.reshape((N, G, C // G, H, W))

x_group = x.reshape((N, G, C // G, H, W))
dvar = np.sum(dx_groupnorm * -1.0 / 2 * (x_group - mean) / (var + eps) ** (3.0 / 2), axis=(2, 3, 4), keepdims=True)

N_GROUP = C // G * H * W
dmean1 = np.sum(dx_groupnorm * -1.0 / np.sqrt(var + eps), axis=(2, 3, 4), keepdims=True)
dmean2_var = dvar * -2.0 / N_GROUP * np.sum(x_group - mean, axis=(2, 3, 4), keepdims=True)
dmean = dmean1 + dmean2_var

dx_group1 = dx_groupnorm * 1.0 / np.sqrt(var + eps)
dx_group2_mean = dmean * 1.0 / N_GROUP
dx_group3_var = dvar * 2.0 / N_GROUP * (x_group - mean)
dx_group = dx_group1 + dx_group2_mean + dx_group3_var

dx = dx_group.reshape((N, C, H, W))

参考文章
[1] https://blog.youkuaiyun.com/weixin_42880443/article/details/81589745
[2] https://blog.youkuaiyun.com/u013832707/article/details/83059540

cs231n 课程作业 Assignment 2 上一次作业基本已经讲了构建一个多层神经网络的基本知识,包括其结构,公式推导,训练方法。这一次主要关注卷积神经网络(CNN, Convolution Neural Network),要先读完课程笔记 CS231n Convolutional Neural Networks for Visual Recognition,基本就懂了。特别是那个解释卷积的动态图,非常形象。CNN 主要多了卷积层(convo 阅读详情

相关推荐

CS231n assignment2

斯坦福CS231n assignment2整个代码 基于python,利用numpy编写两层神经网络。

深度学习之卷积神经网络(Convolutional Neural Networks, CNN)(二)

前面我们说了CNN的一般层次结构, 每个层的作用及其参数的优缺点等内容.https://blog.csdn.net/fenglepeng/article/details/106077002 一 CNN参数初始化及参数学习方法 和机器学习很多算法一样, CNN在进行训练之前也要进行参数的初始化操作. 我们知道, 在机器学习中的参数值一般都是随机给定的. 但是, 这CNN的参数初始化又和机器学习中有所不同. 1.1 W的初始化 由于CNN 中的参数更新的过程一般是通过BP算法实现的,再由前面我们在深..

fenglepeng的博客 8074

cs231n-Assignment-2 python.

CS231n的Assignment, 用Python3.6.3写的,大家可以参考一下,

卷积神经网络

目录 概述 卷积层 卷积层的产生 卷积运算 填充 步幅 应用滤波器后的输出数据大小计算 三维数据的卷积运算 批处理(‘四维数据’) 池化层 卷积层和池化层的Python实现 im2col介绍 im2col的Python实现 卷积层的实现 池化层的实现 CNN的实现 概述 卷积神经网络(Convolutional Neural Network),简称CNN,CNN...

u012132349的博客 2398

【路由交换】思科5506防火墙三区域互通

思科 5506 inside outside dmz 互通

baidu_22774701的博客 6203

第四节、C# 上位机面向对象编程详解(工控硬件继承实战版)

继承核心价值:在 C# 上位机工控开发中,继承的核心是通用逻辑复用与接口统一,将所有硬件的通用属性 / 方法封装到抽象基类,子类只需实现独有逻辑,大幅减少冗余代码。基类设计要点:优先使用抽象基类,合理分配访问修饰符(privateprotectedpublic),定义通用事件与虚方法,提供资源释放机制,兼顾复用性与扩展性。子类设计要点:通过: base()调用基类构造函数,强制实现抽象方法(保证接口统一),选择性重写虚方法(实现独有逻辑),复用基类的protected成员。多设备管理。

kylezhao2019的博客 784

CS231n Spring 2019 Assignment 2—Convolutional Networks卷积神经网络

这一篇真正开始进入深度学习里面的核心操作了-卷积神经网络,这是继Fully-Connected Neural Nets(全连接神经网络)又比较综合的一次作业,难度会有点。作业主要是完成卷积中的两种基本操作:convolution和max pooling,之后会放出两种快速版本,然后瞬间觉得自己写的朴素版本被吊着打;之后重点还得完成一下针对卷积里面的归一化:Spatial Batch Normali...

laizi_laizi的博客 1351

【初阶】手把手教你轻松上手Denodo | 连接数据库并创建基本视图 (二)

在本教程的第二部分,我们将涵盖:连接到数据库,与创建基本视图。

Denodo的博客 1104

CS231n-assignment2-Convolutional Networks

卷积网络 到目前为止,我们已经使用了深度全连接网络,使用它们探索不同的优化策略和网络架构。全连接网络是一个很好的实验平台,因为它们的计算效率非常高,但实际上所有最先进的结果都使用卷积网络。 首先,您将实现在卷积网络中使用的几种层类型。然后,您将使用这些层来训练CIFAR-10数据集上的卷积网络。 ln[1]: # As usual, a bit of setup import numpy as np import matplotlib.pyplot as plt from cs231n.classifier

Esaka 1267

Unity性能优化 - 动态图集

Unity 动态图集是 Unity 引擎中用于处理游戏纹理优化的一种技术。本文介绍了什么是动态图集,动态图集的优缺点,以及提供了一套完整的代码供大家参考。

qq_33808037的博客 4839

Codex 团队如何用自己的产品构建产品——整个 Spec 只有 10 个要点

OpenAI Codex团队采用极简产品开发模式,整个产品规格仅10个要点。团队50-100人长期仅1名PM,设计师代码量已超过工程师。产品负责人Alexander Embiricos透露,团队几乎不写详细文档,仅在需要协调时写简短要点。OpenAI采用独特规划哲学:只做8周内短期或长期方向性规划,拒绝中期路线图。2025年GPT-5.2 Codex发布后,模型能力突破催生了桌面应用开发。团队强调"让离代码最近的人做决策",PM角色转变为"填空者",设计师与工程师界限

346

h, w = img.shape什么意思?

image.shape属性是读入图片后的一个元组dutuple 返回图片的(高,宽,位深) 比如image.shape返回(687, 740, 3) 而h,w=(687, 740, 3) 分解了元组并分别用h,w获得了前两个数据,即高687、宽740

weixin_44682222的博客 1万+

华为OD机试 - 整型数组按照个位数排序(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。给定一个非空数组(列表),其元素数据类型为整型,请按照数组元素十进制最低位从小到大进行排序,十进制最低位相同的元素,相对位置保持不变。当数组元素为负值时,十进制最低位等同于去除符号位后对应十进制值最低位。给定一个非空数组,其元素数据类型为32位有

学Java,找哪吒 398

CS231N Assignment 2 ConvolutionalNetworks

CS231N Assignment 2 ConvolutionalNetworks 1. 正向传播 def conv_forward_naive(x, w, b, conv_param): """ Input: - x: Input data of shape (N, C, H, W) - w: Filter weights of shape (F, C, HH...

逐水草而居的造轮人的博客 1274

手把手教你学simulink(44.1)--串励直流电动机场景示例:基于Simulink开发一个串励直流电动机电压控制仿真模型

高启动转矩:由于励磁绕组和电枢绕组串联连接,电机在启动时可以产生较大的转矩。速度随负载变化:由于励磁电流和电枢电流是同一电流,电机的速度会随着负载的变化而显著变化。适用于重载启动:适合用于需要高启动转矩的应用,如起重机、牵引系统等。

MHD0815的博客 338

【OpenClaw从入门到精通】第34篇:医疗AI的“Agent OS”时代:基于WiseClaw构建医院专属智能体平台(2026实测版)

2026年医疗AI迈入实战落地新阶段,全球首个医疗OpenClaw平台WiseClaw正式发布,香港中文大学(深圳)医院完成业内首个私有化部署。本文基于真实医疗场景需求与公开技术资料,系统拆解医疗智能体平台的建设逻辑:从医疗Agent OS的五大核心特性切入,详解门诊病历质控、用药审查、医院运行管理三大临床场景的智能体搭建流程,提供完整的私有化部署代码、安全配置方案与实操演示。文章兼顾新手入门与进阶需求,严格遵循医疗合规要求,强调“只读不写+人工复核”原则,所有方案均经过虚拟实测验证。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 786

cs231n'18: Assignment 2 | ConvolutionalNetworks

Assignment 2 | ConvolutionalNetworks Convolution 首先说说这个aside。仅仅将 filter 设置为特定的数字,就可以对图像进行某种处理,这里是将图像灰度化和在一个图层取其水平边缘,这直观的给出了一个 filter 的作用。第一层的 filter 可以直观的看出其作用,以后各层 filter 是第一层 filter 的各种线性、非线性组合,...

FortiLZ的博客 626

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

cs231n作业:Assignment2-Convolutional Networks

def conv_forward_naive(x, w, b, conv_param): """ A naive implementation of the forward pass for a convolutional layer. The input consists of N data points, each with C channels, height H ...

MR CODER 701

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

CS231n -- assignment2 Convolutional Network

经过前面对CNN的直观上的理解和公式的推导,我们也可以完成手写CNN的工作了,写完成就感MAX。reference:   CNN反向传播推导, deeplearning.ai CNN,CS231n note1.conv_forward_naive首先根据题目中给出的信息,确定卷积核尺寸(数量、通道、高、宽)N, C, H, W = x.shape F, C, HH, WW = w.shape(1)...

donghai_yu的博客 1384

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

cs231n:assignment2——Q4: ConvNet on CIFAR-10

视频里 Andrej Karpathy上课的时候说,这次的作业meaty but educational,确实很meaty,作业一般是由.ipynb文件和.py文件组成,这次因为每个.ipynb文件涉及到的.py文件较多,且互相之间有交叉,所以每篇博客只贴出一个.ipynb或者一个.py文件.(因为之前的作业由于是一个.ipynb文件对应一个.py文件,所以就整合到一篇博客里) 还是那句话,有错

xieyi4650的博客 5906

CS231n (winter 2016) : Assignment2

http://www.jianshu.com/p/9c4396653324 前言: 以斯坦福cs231n课程的python编程任务为主线,展开对该课程主要内容的理解和部分数学推导。建议PC端阅读,该课程的学习资料和代码如下: 视频和PPT 笔记 assignment2初始代码 Part 1:深层全连接神经网络(python编程任务) 我们在Assignment1中完成了简单的

Just for fun的专栏 1547

斯坦福深度学习课程cs231n assignment2作业笔记六:Convolutional Networks

话不多说,直接上代码: Convolution: Naive forward pass def conv_forward_naive(x, w, b, conv_param): """ A naive implementation of the forward pass for a convolutional layer. The input consists of N ...

持久决心的博客 2974

cs231n:assignment2——Q1: Fully-connected Neural Network

视频里 Andrej Karpathy上课的时候说,这次的作业meaty but educational,确实很meaty,作业一般是由.ipynb文件和.py文件组成,这次因为每个.ipynb文件涉及到的.py文件较多,且互相之间有交叉,所以每篇博客只贴出一个.ipynb或者一个.py文件.(因为之前的作业由于是一个.ipynb文件对应一个.py文件,所以就整合到一篇博客里) 还是那句话,有错误

xieyi4650的博客 8415

CS231n - Assignment2 Tensorflow

本次的作业很贴心,在ipython的作业中有一段教程大概告诉我们tensorflow的基本使用,还附上了一些常用API的guide链接,赞!没有科学上网也没有关系,我这里分享一个API查询神器 DevDocs,offline data对于我这种家里没有网的同志更是实用性MAX!作业过程中碰到不清楚的API随手一查即可~作业代码地址:my_github废话不多说,看作业首先是作业里已经写好的simp...

donghai_yu的博客 2143

#cs231n#Assignment2:FullyConnectedNets.ipynb

根据自己的理解和参考资料实现了一下 FullyConnectedNets.ipynbFully-Connected Neural NetsIn the previous homework you implemented a fully-connected two-layer neural network on CIFAR-10. The implementation was simple but

LiuSpark 4565

cs231n之Assignment2全连接网络上

cs231n之Assignment2全连接网络上——光城0.说在前面在上次作业中,已经实现了两层神经网络,但是有些问题,比如程序不够模块化,耦合度不高等问题,所以本节引出...

Francis的博客 1127
上一篇: cs231n assignment2 dropout
下一篇: cs231n assignment2 PyTorch
一叶知秋Autumn
博客等级 码龄10年 170粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值