斯坦福CS231n作业代码(汉化)Assignment 2 Q5

【神经网络学习篇】tensorflow实现cifar10识别(RNN lstm) tensorflow实现cifar10识别 阅读详情

TensorFlow是个什么东东?

编写:土豆 MoreZheng SlyneD
校对:碧海听滔 Molly
总校对与审核:寒小阳


在前面的作业中你已经写了很多代码来实现很多的神经网络功能。Dropout, Batch Norm 和 2D卷积是深度学习在计算机视觉中的一些重活。你已经很努力地让你的代码有效率以及向量化。

对于这份作业的最后一个部分,我们不会继续探讨之前的代码,而是转到两个流行的深度学习框架之一。在这份Notebook中,主要是Tensorflow(在其他的notebook中,还会有PyTorch代码).

TensorFlow是什么?

Tensorflow是基于Tensor来执行计算图的系统,对于变量(Variables)有原生的自动反向求导的功能。在它里面,我们用的n维数组的tensor相当于是numpy中的ndarray。

为什么用tensorflow?
  • 我们的代码将会运行在GPU上,因此会在训练的时候快很多。不过,编写在GPU上运行的程序模块的方法不在这门课的范围内。
  • 我们希望你为你的项目使用这些框架,这样比起你自己编写基础代码,要更加有效率。
  • 我们希望你们可以站在巨人的肩膀上!TensorFlow和PyTorch都是优秀的框架,可以让你的生活更轻松,既然你已经明白了他们的原理,你就可以随意地使用它们了。
  • 我们希望你可以编写一些能在学术或工业界可以使用的深度学习代码。

我该怎么学习TensorFlow?

TensorFlow已经有许多优秀的教程,包括来自google自己的那些。

另外,这个notebook也会带领你过一遍在TensorFlow中,训练模型所需要用到的许多东西。如果你需要学习更多内容,或者了解更多细节,可以去看本Notebook的结尾部分,那里可以找到一些有用的教程链接。

加载数据

import tensorflow as tf
import numpy as np
import math
import timeit
import matplotlib.pyplot as plt
%matplotlib inline
from cs231n.data_utils import load_CIFAR10

def get_CIFAR10_data(num_training=49000, num_validation=1000, num_test=10000):
    """
    Load the CIFAR-10 dataset from disk and perform preprocessing to prepare
    it for the two-layer neural net classifier. These are the same steps as
    we used for the SVM, but condensed to a single function.  
    """
    # Load the raw CIFAR-10 data
    cifar10_dir = 'cs231n/datasets/cifar-10-batches-py'
    X_train, y_train, X_test, y_test = load_CIFAR10(cifar10_dir)

    # Subsample the data
    mask = range(num_training, num_training + num_validation)
    X_val = X_train[mask]
    y_val = y_train[mask]
    mask = range(num_training)
    X_train = X_train[mask]
    y_train = y_train[mask]
    mask = range(num_test)
    X_test = X_test[mask]
    y_test = y_test[mask]

    # Normalize the data: subtract the mean image
    mean_image = np.mean(X_train, axis=0)
    X_train -= mean_image
    X_val -= mean_image
    X_test -= mean_image

    return X_train, y_train, X_val, y_val, X_test, y_test


# Invoke the above function to get our data.
X_train, y_train, X_val, y_val, X_test, y_test = get_CIFAR10_data()
print('Train data shape: ', X_train.shape)
print('Train labels shape: ', y_train.shape)
print('Validation data shape: ', X_val.shape)
print('Validation labels shape: ', y_val.shape)
print('Test data shape: ', X_test.shape)
print('Test labels shape: ', y_test.shape)
Train data shape:  (49000, 32, 32, 3)
Train labels shape:  (49000,)
Validation data shape:  (1000, 32, 32, 3)
Validation labels shape:  (1000,)
Test data shape:  (10000, 32, 32, 3)
Test labels shape:  (10000,)

案例模型

一些实用的建议

我们的图像数据格式是:N x H x W x C, 其中

  • N 是数据点的个数
  • H 是每张图片的高度(单位:像素)
  • W 是每张图片的宽度(单位: 像素)
  • C 是通道的数量 (通常是3:R, G, B)

这是一种正确的表示数据的方式,比如当我们做一些像是2D卷积这样的操作,需要理解空间上相邻的像素点。但是,当我们把图像数据放到全连接的仿射层(affine layers)中时,我们希望一个数据样本可以用一个向量来表示,这个时候,把数据分成不同的通道、行和列就不再有用了。

案例模型本尊

训练你自己模型的第一步就是要定义它的结构。
这里有一个定义在TensorFlow中的卷积神经网络的例子 – 试着搞清楚每一行都在做什么,要记住,每一行都建立在前一行之上。 目前我们还没有训练什么东西 – 这后面会讲到 – 现在, 我们希望你能够明白这些东西都是怎么建立起来的。

在这个例子里面,你们会看到2D的卷积层, ReLU激活层,和全连接层(线性的)。 你们也会看到Hinge loss损失函数, 以及Adam优化器是如何使用的。

确保要明白为什么线性层的参数是5408和10。

TensorFlow细节

在TensorFlow中,像我们前面的Notebook一样,我们首先要初始化我们的变量,然后是我们的模型。

# clear old variables
tf.reset_default_graph()

# setup input (e.g. the data that changes every batch)
# The first dim is None, and gets sets automatically based on batch size fed in
# 设置输入,比如每个batch要输入的数据
# 第一维是None, 可以根据输入的batch size自动改变。

X = tf.placeholder(tf.float32, [None, 32, 32, 3])
y = tf.placeholder(tf.int64, [None])
is_training = tf.placeholder(tf.bool)

def simple_model(X,y):
    # define our weights (e.g. init_two_layer_convnet)
    #  定义权重W
    # setup variables
    # 设置变量
    Wconv1 = tf.get_variable("Wconv1", shape=[7, 7, 3, 32])
    bconv1 = tf.get_variable("bconv1", shape=[32])
    W1 = tf.get_variable("W1", shape=[5408, 10]) 
    b1 = tf.get_variable("b1", shape=[10])

    # define our graph (e.g. two_layer_convnet)
    # 定义我们的图 


    # 这里我们需要用到conv2d函数,建议大家仔细阅读官方文档
    # tf.nn.conv2d()  https://www.tensorflow.org/api_docs/python/tf/nn/conv2d
    # conv2d(input,filter,strides,padding,use_cudnn_on_gpu=None,data_format=None,name=None)
    # input : [batch, in_height, in_width, in_channels]
    # filter/kernel: [filter_height, filter_width, in_channels, out_channels]
    # strides: 长度为4的1维tensor,用来指定在每一个维度上的滑动的窗口滑动的步长
    # 水平或者垂直滑动通常会指定strides = [1,stride,,stride,1] 
    # padding: 'VALID' 或者是 'SAME'
    # data_format: 数据的输入格式,默认是‘NHWC’ 


    # 根据输出的大小的公式:(W-F+2P)/S + 1
    # W: 图像宽度   32
    # F:Filter的宽度  7
    # P: padding了多少  0
    # padding='valid' 就是不padding  padding='same' 自动padding若干个行列使得输出的feature map和原输入feature map的尺寸一致
    # S: stride 步长  2

    a1 = tf.nn.conv2d(X, Wconv1, strides=[1,2,2,1], padding='VALID') + bconv1
    # (W-F+2P)/S + 1 = (32 - 7 + 2*0)/2 + 1 = 13
    # 那么输出的feature map的尺寸就是 13 * 13 * 32 = 5408   (Wconv1 有32个out channels, 也就是说有32个filters)

    h1 = tf.nn.relu(a1) # 对a1中的每个神经元加上激活函数relu
    h1_flat = tf.reshape(h1,[-1,5408])  # reshape h1,把feature map展开成 batchsize * 5408
    y_out = tf.matmul(h1_flat,W1) + b1  # 得到输出的logits: y_out
    return y_out

y_out = simple_model(X,y)

# define our loss
# 定义我们的loss

total_loss = tf.losses.hinge_loss(tf.one_hot(y,10),logits=y_out)
mean_loss = tf.reduce_mean(total_loss) # loss求平均

# define our optimizer
# 定义优化器,设置学习率
optimizer = tf.train.AdamOptimizer(5e-4) # select optimizer and set learning rate
train_step = optimizer.minimize(mean_loss)

TensorFlow支持许多其他层的类型,损失函数和优化器 - 你将在后面的实验中遇到。 这里是官方的API文档(如果上面有任何参数搞不懂,这些资源就会非常有用)

训练一轮

我们在上面已经定义了图所需要的操作,为了能够执行TensorFlow图中定义的计算,我们首先需要创建一个tf.Session对象。一个session中包含了TensorFlow运行时的状态。更多内容请参考TensorFlow指南 Getting started

我们也可以指定一个设备,比如/cpu:0 或者 /gpu:0。 这种类型的操作可以参考this TensorFlow

CS231n Assignment2 Q5心得笔记 PytorchBarebones Pytorchnn.Modulenn.SequentialCIFAR-10 Challenge Barebones Pytorch 作业的第一个小问题是为了帮我们理解Pytorch的一些基本元素,首先就是Tensor,一个Tensor类似于一个Numpy矩阵,只不过Tensor可以再GPU上运行,所以省去了我们在CPU和GPU之间传输Munpy浪费的时间。当我们创... 阅读详情

相关推荐

斯坦福CS231n作业代码(汉化)Assignment 2 Q4

编写:土豆 MoreZheng SlyneD 校对:碧海听滔 Molly 总校对与审核:寒小阳 本系列由斯坦福大学CS231n课后作业提供 CS231N - Assignment2 - Q4 - ConvNet on CIFAR-10 问题描述:使用IPython Notebook(现版本为jupyter notebook,如果安装anaconda完整版会内置),在Conv

BigDataDigest的博客 4358

斯坦福CS231n作业代码(汉化)Assignment 1 - Q1

assignment Q1-1 k-Nearest Neighbor (kNN) exercise 编写:郭承坤 观自在降魔 Fanli SlyneD 校对:毛丽 总校对与审核:寒小阳 代码环境 python3.6.1(anaconda4.4.0) && ubuntu16.04 测试通过 作业内容 kNN分类器是一种非常简单粗暴的分类器,它包含两个步骤:

BigDataDigest的博客 6642

斯坦福CS231n作业代码(汉化)Assignment 3 Q1 - Q2

第三次作业问题1和问题2 编写:张礼俊/SlyneD 校对:毛丽 总校对与审核:寒小阳 1. 问题背景 在问题1里,我们要训练一个递归神经网络(Recurrent neural networks)来生成一个图片的文字注释(captions)。问题2中,用以长短时记忆单元(Long-short term memory,LSTM)为基础的递归神经网络来完成同样的任务。 我们将用到的数据...

BigDataDigest的博客 3481

斯坦福CS231n作业代码(汉化)Assignment 1 - Q2

assignment1 -Q2 Multiclass Support Vector Machine 编写:郭承坤 观自在降魔 Fanli SlyneD 校对:毛丽 总校对与审核:寒小阳 代码环境:python3.6.1(anaconda4.4.0) && ubuntu16.04 测试通过 任务 完成一个基于SVM的全向量化损失函数 完成解析梯度的全向量化表示 用数值

BigDataDigest的博客 3281

斯坦福CS231n作业代码(汉化)Assignment 1 - Q4

CS231N - Assignment 1 - Q4 - Two-Layer Neural Network 编写:郭承坤 观自在降魔 Fanli SlyneD 校对:毛丽 总校对与审核:寒小阳 1 任务 在这个练习里,我们将实现一个完全连接的神经网络分类器,然后用CIFAR-10数据集进行测试。 2 知识点 2.1 神经元 要讲神经网络就得先从神经元开始说起,神经元

BigDataDigest的博客 3934

斯坦福CS231n作业代码(汉化)Assignment 1 - Q5

[CS231N - Assignment1 - Q5 - Image features exercises] 编写:郭承坤 观自在降魔 Fanli SlyneD 校对:毛丽 总校对与审核:寒小阳 我们已经看到,通过用输入图像的像素训练的线性分类器对图像的分类问题已经取得了不错的结果。在这个练习中我们会用对图像像素进一步计算得来的特征来训练线性分类器从而提高性能。 抽取特征(Ext

BigDataDigest的博客 2809

斯坦福CS231n作业代码(汉化)Assignment 1 - Q3

CS231N - Assignment1 - Q3 - Softmax exercise 编写:郭承坤 观自在降魔 Fanli SlyneD 校对:毛丽 总校对与审核:寒小阳 1. 任务 这次练习跟SVM练习类似。你将完成下面的任务: - 通过矩阵运算为Softmax分类器实现一个损失函数 - 为这个损失函数的分析梯度实现一个完全矢量化的表达式 - 用数值梯度检查上面的分析

BigDataDigest的博客 2472

斯坦福CS231n作业代码(汉化)Assignment 3 Q3

Network Visualization (TensorFlow) 编写:张礼俊/SlyneD 校对:毛丽 总校对与审核:寒小阳 在这份Notebook里面我们会来探索图像梯度对于生成新图片的用法。 当训练模型的时候,我们会定义一个损失函数来表示我们对当前模型性能的不满意程度(和标准答案的差异程度);接着我们用反向传播来计算损失函数对于模型参数的梯度,接着在模型参数上用梯度下降来最小化...

BigDataDigest的博客 6875

斯坦福CS231n作业代码(汉化)Assignment 3 Q5

生成对抗网络 (GANs) 编写:张礼俊/SlyneD 校对:毛丽 总校对与审核:寒小阳 CS231N到目前位置,所有对神经网络的应用都是判别式模型,给定一个输入,训练产生一个label输出。从直接对一个图片的分类到句子生成(也是一个分类问题,我们的label是在词空间中,我们会去逐个学习来产生多词label)。在这个作业中,我们会拓展开来,用神经网络来构建一个生成式模型。特别的,我们会学...

BigDataDigest的博客 4579

斯坦福CS231n作业代码(汉化)Assignment 3 Q4

风格迁移 编写:张礼俊/SlyneD 校对:毛丽 总校对与审核:寒小阳 这份作业里面我们会实现风格迁移的技巧,来自于这篇文章 “Image Style Transfer Using Convolutional Neural Networks” (Gatys et al., CVPR 2015). 主要的想法就是拿两张图,然后生成一张新图片来反应了一张图的内容和另一张图的艺术风格。我们首先...

BigDataDigest的博客 2579

CS231n-2017:完成了斯坦福大学的CS231n 2017Spring作业

CS231n-2017年Spring 这些是我对斯坦福大学的CS231n 2017年Spring课程的解决方案。 我完成了所有作业,以提高自己的Python技能以及对深度学习的理解。 已完成 作业1 作业2(PyTorch和Tensorflow) 作业3(PyTorch和Tensorflow) 未来的工作 额外的信用任务 问题 如果您有任何疑问,我们将很乐意为您解答,只需将其发布为问题,然后我会尽可能答复。

SEED-VII 实战指南:如何利用多模态脑电图数据提升情感识别精度

本文提供了SEED-VII多模态脑电图数据集的实战指南,详细介绍了如何利用该数据集提升情感识别精度。内容涵盖数据获取、预处理、特征提取,以及构建多模态融合神经网络模型的关键步骤,并强调了被试者独立评估的重要性,为情感计算研究者提供了从数据到模型的全流程解决方案。

weixin_29196891的博客 318

KUKA 虚拟调试实战——打通Simpro4.1与OfficeLite8.6的通信与实时控制链路

本文详细介绍了KUKA虚拟调试实战,重点解析如何打通Simpro4.1与OfficeLite8.6的通信与实时控制链路。通过环境搭建、权限配置、机器人型号匹配等关键步骤,帮助工程师高效完成机器人轨迹规划和PLC联锁逻辑验证,大幅降低真机调试风险。文章还提供了典型报错解决方案和实时控制优化技巧,适用于工业机器人仿真与培训场景。

weixin_30907935的博客 451

手把手教你用FPGA驱动DAC8830:一个Verilog SPI驱动模块的完整实现与调试

本文详细介绍了如何使用FPGA通过Verilog实现DAC8830的SPI驱动模块,包括SPI通信机制解析、Verilog模块设计、代码优化及调试技巧。重点解决时钟同步、状态机设计等工程实践问题,适用于音频处理、仪器仪表等高精度数模转换场景。

weixin_26886855的博客 230

Mamba再封神!与YOLO结合,拿下二区!好发不卷!

相比传统的YOLO改进,Mamba是新技术,两者结合尚在蓝海阶段,可发挥空间大!更为关键的是,它在检测精度和速度方面,都让以往的YOLO模型难以望其项背!比如代表模型Mamba YOLO,便在参数减少45.5%、FLOPs减少50%的同时,精度还比YOLOv8高6.1%!这主要得益于,Mamba能够捕捉长期依赖关系,而YOLO则擅长捕捉局部特征,两者能够优势互补,且Mamba线性复杂度的特性,也有利于提高计算效率!为了让大家能够紧跟前沿发展,找到更多灵感启发,我给大家10种。

2401_88190197的博客 2507

Android AudioFlinger实战:如何用FastMixer优化低延迟音频流(附调试技巧)

本文深入解析了Android AudioFlinger的FastMixer线程机制,指导开发者如何利用该技术优化低延迟音频流。通过实战配置AAudio API、调整硬件缓冲区及线程优先级,并结合adb、Systrace等调试技巧,可将音频延迟显著降低至10毫秒以下,适用于音乐制作、游戏音效等实时音频处理场景。

weixin_29230901的博客 335

STM32H743 SD卡读写避坑实录:CubeMX配置MDMA给FATFS,我的FreeRTOS项目踩了哪些雷?

本文详细解析了STM32H743在CubeMX配置中结合SDMMC、MDMA与FATFS的实战避坑指南,特别针对FreeRTOS环境下的SD卡读写问题提供了解决方案。从时钟配置到FATFS参数设置,再到DMA缓存维护和FreeRTOS集成技巧,帮助开发者高效解决数据损坏、DMA传输错误等常见问题,提升项目稳定性。

weixin_30878501的博客 494

华为OD机试双机位A卷 - 小明减肥 (C++ & Python & JAVA & JS & GO)

华为OD机试2025双机位A卷 小明减肥,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 710

高斯过程的数学理解

G澳大利亚的过程是有益的,特别是当我们有少量数据时。当我在制造业担任数据科学家时,我们的团队使用这种算法来揭示我们接下来应该进行哪些实验条件。但是,此算法不如其他算法流行。在这篇博客中,我将通过可视化和 Python 实现来解释高斯过程 [1] 的数学背景。

gongdiwudu的专栏 3611

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 斯坦福CS231n作业代码(汉化)Assignment 2 Q4
下一篇: 手把手:我的深度学习模型训练好了,然后要做啥?
BigDataDigest
博客等级 码龄9年 448粉丝 500原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值