卷积神经网络实例1:CIFAR10

卷积神经网络(含案例代码) 卷积神经网络(Convolutional Neural Network,CNN)是一类专门用于处理具有网格结构数据的神经网络。它主要被设计用来识别和提取图像中的特征,但在许多其他领域也取得了成功,例如自然语言处理中的文本分类任务。CNN 的主要特点是它使用了卷积层(convolutional layer)来处理输入数据。卷积层通过卷积操作在输入数据上滑动一个或多个卷积核(也称为滤波器),从而学习局部特征。这种局部感知能力使得 CNN 能够有效地捕捉输入数据中的空间结构和模式。 阅读详情

几个概念

1、多通道的卷积

     通道(Channel),是指图片中每个像素由几个数来表示,这几个数一般指的就是色彩。比如一个灰度图的通道就是1,一个彩色图的通道就是3(红、黄、蓝)。在卷积神经网络里,通道又分输入通道和输出通道。

  • 输入通道:就是前面刚介绍的图片的通道。如是彩色图片,起始的输入通道就是3.如是中间层的卷积,输入通道就是上一层的输出通道个数,计算方法是,每个输入通道的图片都使用同一个卷积核进行卷积操作,生成与输入通道匹配的feature map(比如彩色图片就是3个),然后再把这几张feature map相同位置上的值加起来,生成一张feature map。
  • 输出通道:很好理解了,想要输出几个feature map,就放几个卷积核,就是几个输出通道。

卷积函数tf.nn.conv2d

tf.nn.conv2d(input, filter, strides, padding, user_cudnn_on_gpu)

  • input:指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的形状(shape),具体含义是“训练时一个batch的图片数量,图片高度,图片宽度,图像通道数”,注意这是一个思维的Tensor,要求类型为float32和float64其中之一。
  • filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, fitler_width, in_channels, out_channels]这样的shape,具体含义是”卷积核的高度,滤波器的宽度,图像通道数,滤波器个数“,要求类型与参数input相同。有一个地方需要注意,第三维in_channels,就是参数input的第四维。
  • strides:卷积时在图像每一维的步长,这是一个一维的向量,长度为4。
  • padding:定义元素边框与元素内容之间的空间。string类型的量,只能是SAME和VALID其中之一,这个值决定了不同的卷积方式,padding的值为”VALID“时,表示边缘不填充,当其为”SAME“时,表示填充到滤波器可以到达图像边缘。只有在步长为1时生成的feature map才会与输入值相等。
  • use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true。
  • 返回值:一个Tensor,就是常说的feature map。

实例:卷积计算

# 卷积核的使用
import tensorflow as tf
# [batch, in_height, in_width, in_channels] 
# [训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数]  
input = tf.Variable(tf.constant(1.0, shape=[1,5,5,1]))
input2 = tf.Variable(tf.constant(1.0, shape=[1,5,5,2]))
input3 = tf.Variable(tf.constant(1.0, shape=[1,4,4,1]))
# [filter_height, filter_width, in_channels, out_channels] 
# [卷积核的高度,卷积核的宽度,图像通道数,卷积核个数]  
filter1 = tf.Variable(tf.constant([-1.0, 0, 0, -1], shape=[2,2,1,1]))
filter2 = tf.Variable(tf.constant([-1.0, 0, 0, -1, -1.0, 0, 0, -1], shape=[2,2,1,2]))
filter3 = tf.Variable(tf.constant([-1.0, 0, 0, -1, 
                                   -1.0, 0, 0, -1, 
                                   -1.0, 0, 0, -1], shape=[2,2,1,3]))
filter4 = tf.Variable(tf.constant([-1.0, 0, 0, -1, 
                                   -1.0, 0, 0, -1, 
                                   -1.0, 0, 0, -1,
                                   -1.0, 0, 0, -1], shape=[2,2,2,2]))
filter5 = tf.Variable(tf.constant([-1.0, 0, 0, -1, 
                                   -1.0, 0, 0, -1], shape=[2,2,2,1]))
# padding的值为‘VALID’,表示边缘不填充, 
# 当其为‘SAME’时,表示填充到卷积核可以到达图像边缘  
op1 = tf.nn.conv2d(input, filter1, strides=[1,2,2,1], padding="SAME")
op2 = tf.nn.conv2d(input, filter2, strides=[1,2,2,1], padding="SAME")
op3 = tf.nn.conv2d(input, filter3, strides=[1,2,2,1], padding="SAME")
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    print("op1:\n",sess.run([op1,filter1]))#1-1  后面补0
    print("------------------")
    
    print("op2:\n",sess.run([op2,filter2])) #1-2多卷积核 按列取
    print("op3:\n",sess.run([op3,filter3])) #1-3
    print("------------------") 

实例:使用卷积提取图片的轮廓

# sobe算子提取轮廓
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import tensorflow as tf

myimg = mpimg.imread("img.png")
plt.imshow(myimg)
plt.axis('off')
plt.show()
print(myimg.shape)  # (214, 282, 4)

full = np.reshape(myimg, [1, 214, 282, 4])
inputfull = tf.Variable(tf.constant(1.0, shape=[1,214,282,4]))
filter =  tf.Variable(tf.constant([[-1.0,-1.0,-1.0],  [0,0,0],  [1.0,1.0,1.0], [1.0,1.0,1.0],
                                    [-2.0,-2.0,-2.0], [0,0,0],  [2.0,2.0,2.0], [1.0,1.0,1.0],
                                    [-1.0,-1.0,-1.0], [0,0,0],  [1.0,1.0,1.0], [1.0,1.0,1.0]],shape = [3, 3, 4, 1]))    
op = tf.nn.conv2d(inputfull, filter, strides=[1, 1, 1, 1], padding='SAME') #3个通道输入,生成1个feature ma
o=tf.cast(  ((op-tf.reduce_min(op))/(tf.reduce_max(op)-tf.reduce_min(op)) ) *255 ,tf.uint8)
with tf.Session() as sess:  
    sess.run(tf.global_variables_initializer()  )  

    t,f=sess.run([o,filter],feed_dict={ inputfull:full})
    #print(f)
    t=np.reshape(t,[214,282]) 
 
    plt.imshow(t,cmap='Greys_r') # 显示图片
    plt.axis('off') # 不显示坐标轴
    plt.show()

  

实例:使用卷积神经网络对图片分类

在CIFAR数据集上做图像识别的练习

与MNIST类似,TensorFlow中同样有一个下载和导入CIFAR数据集的代码文件,不同的是,Models模块分离了出来。

$ git clone https://github.com/tensorflow/models.git

将models/tutorials/image/路径下的cifar10目录中所有内容复制到本地的Python工作区即可。

数据集下载http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz

目前tensorflow将cifar10数据集集成到 tensorflow_datasets中,所以需要安装tensorflow_datasets

 pip install tensorflow_datasets

包含10个类别的50000条训练数据和10000条测试数据

导入并显示CIFAR数据集

import cifar10_input
import tensorflow as tf
import pylab
batch_size = 128
# inputs函数会将图片裁剪好,由原来的32x32x3,变成24x24x3。eval_data=True为测试集,False为训练集
images_test, labels_test = cifar10_input.inputs(eval_data = True, batch_size = batch_size)
sess = tf.Session()
tf.global_variables_initializer().run(session=sess)
tf.train.start_queue_runners(sess=sess) # 使用队列
image_batch, label_batch = sess.run([images_test, labels_test])
print("__\n",image_batch[0])
print("__\n",label_batch[0])
pylab.imshow(image_batch[0])
pylab.show()

提示:TensorFlow提供了一个队列机制,通过多线程将读取数据与计算数据分开。因为在处理海量数据集的训练时,无法把数据集一次全部载入到内存中,需要一边从硬盘中读取,一边进行训练计算。

网络结构:使用全局平均池化层来代替传统的全连接层,使用了3个卷积层的同卷积操作,滤波器为5x5,每个卷积层后面都会跟个步长为2x2的池化层,滤波器为2x2。2层的卷积池化后是输出为10个通道的卷积层,然后对这10个feature map进行全局平均池化,得到10个特征,再对这10个特征进行softmax计算,其结果来代表最终分类。

import cifar10_input
import tensorflow as tf
import numpy as np

batch_size = 128
print("begin")
images_train, labels_train = cifar10_input.inputs(eval_data = False, batch_size = batch_size)
images_test, labels_test = cifar10_input.inputs(eval_data = True, batch_size = batch_size)
print("begin data")

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)
def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)
def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding="SAME")
def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1,2,2,1],strides=[1,6,6,1], padding="SAME")
def avg_pool_6x6(x):
    return tf.nn.avg_pool(x, ksize=[1, 6, 6, 1],
                        strides=[1, 6, 6, 1], padding='SAME')

x = tf.placeholder(tf.float32, [None,24,24,3])
y = tf.placeholder(tf.float32, [None, 10])

# 第一层
W_conv1 = weight_variable([5, 5, 3, 64])
b_conv1 = bias_variable([64])
x_image = tf.reshape(x, [-1, 24, 24, 3])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
# 第二层
W_conv2 = weight_variable([5, 5, 64, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
# 第三层
W_conv3 = weight_variable([5, 5, 64, 10])
b_conv3 = bias_variable([10])
h_conv3 = tf.nn.relu(conv2d(h_pool2, W_conv3) + b_conv3)
nt_hpool3=avg_pool_6x6(h_conv3)#10
nt_hpool3_flat = tf.reshape(nt_hpool3, [-1, 10])
# 分类
y_conv=tf.nn.softmax(nt_hpool3_flat)
# 损失计算
cross_entropy = -tf.reduce_sum(y*tf.log(y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
# 训练
sess = tf.Session()
sess.run(tf.global_variables_initializer())
tf.train.start_queue_runners(sess=sess)
for i in range(15000):#20000
    image_batch, label_batch = sess.run([images_train, labels_train])
    label_b = np.eye(10,dtype=float)[label_batch] #one hot
    train_step.run(feed_dict={x:image_batch, y: label_b},session=sess)
    if i%200 == 0:
        train_accuracy = accuracy.eval(feed_dict={
            x:image_batch, y: label_b},session=sess)
    print( "step %d, training accuracy %g"%(i, train_accuracy))
# 测试集
image_batch, label_batch = sess.run([images_test, labels_test])
label_b = np.eye(10,dtype=float)[label_batch]#one hot
print ("finished! test accuracy %g"%accuracy.eval(feed_dict={
     x:image_batch, y: label_b},session=sess))
finished! test accuracy 0.492188准确率还比较低
卷积神经网络应用实例,卷积神经网络实际应用 border_mode可以是valid或者full,具体看这里说明:.conv2d#激活函数用tanh#你还可以在(Activation('tanh'))后加上dropout的技巧: (Dropout(0.5))(Convolution2D(4, 5, 5, border_mode='valid',input_shape=(1,28,28))) (Activation('tanh'))#第二个卷积层,8个卷积核,每个卷积核大小3*3。同时,图像预处理的好坏也会影响到提取的特征。 阅读详情

相关推荐

卷积神经网络的应用实例,卷积神经网络及算法

上世纪60年代,Hubel等人通过对猫视觉皮层细胞的研究,提出了感受野这个概念,到80年代,Fukushima在感受野概念的基础之上提出了神经认知机的概念,可以看作是卷积神经网络的第一个实现网络,神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其能够在即使物体有位移或轻微变形的时候,也能完成识别。卷积神经网络(ConvolutionalNeuralNetworks,CNN)是多层感知机(MLP)的变种。...

kfc67269的博客 1648

Python CNN卷积神经网络实例讲解,CNN实战,CNN代码实例,超实用

Python CNN卷积神经网络实例讲解,CNN实战,CNN代码实例,套用简单

L_goodboy的博客 5万+

利用tensorflow编写卷积神经网络(CNN)对CIFAR-10进行识别(附完整代码)

利用tensorflow编写卷积神经网络(CNN)对CIFAR-10进行识别,识别率达到80%左右,源码中附有详细注释,适合初学者!

x_lock的博客 3万+

paddlepaddle学习

paddle

qq_51086926的博客 1245

用卷积神经网络(CNN)实现cifar_10图像识别分类

一、资源链接 无数据集纯代码链接:https://pan.baidu.com/s/1w20ZUkwaYw22qXIRWw2NXA 提取码:csco 带数据集和代码链接: https://pan.baidu.com/s/1OTu17l_9tk7Vg45m1BokNw 提取码:w7o9 二、资源格式 一共4个文件,三个为py代码文件,另一个是数据集。目录尽量存放在一起,我的目录是这样...

懒骨头707 8124

TensorFlow应用之进阶版卷积神经网络CNN在CIFAR-10数据集上分类

一、概述 1. 数据集简介 本文使用的数据集是CIFAR-10,这是一个经典的数据集,包含了60000张32*32的彩色图像,其中训练集50000张,测试集10000张,如同其名字,CIFAR-10数据集一共标注为10类,每一类6000张图片,这10类分别是airplane、automobile、bird、cat、deer、dog、frog、horse、ship和truck。类别之间没有重

marsjhao Blog 1万+

CV&NLP基础10之卷积神经网络CNN进阶

使用CIFAR10数据集、VGG13模型深入学习CNN

Waldocsdn的博客 527

(学习笔记02) CNN对CIFAR-10图像数据集分类(tensorflow)

(学习笔记02) CNN对CIFAR-10图像数据集分类(tensorflow) 本节将继续写学习机器学习的分类开发应用,我们将使用卷积神经网络对CIFAR-10数据集进行图像分类。 CIFAR-10数据集介绍 CIFAR-10 数据集共有60000张彩色图像,这些图像大小为32×32,分为10个类,每类6000张图。 总数量 图片尺寸 训练集数量 测试集数量 60000 32×32 50000 10000 整个数据集被分为5个training batches 和 1个test bat

要多喝牛奶才能变成巨人 5024

Tensorflow 笔记 Ⅶ——cifar10卷积神经网络

文章目录数据集数据集来源数据集简介数据集下载数据集读取卷积神经网络卷积神经网络应用图像分类(本篇所述)目标检测(将在后续版本给出)卷积神经网络原理全连接网络的局限性卷积神经网络的提出卷积神经网络结构卷积神经网络中的操作卷积0 填充(Padding)多通道卷积池化操作可视化Cifar10 TensorFLow 1.x 低阶 API 实现前情函数np.random.rand(d0, d1, d2......

DeepHao'Blog 3539

【图像识别】CIFAR-10(CNN)

一、CIFAR-10简介 CIFAR-10官网 CIFAR-10 是由 Hinton的学生Alex Krizhevsky和 Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。 它一共包含10个类别的RGB彩色图片,具体参考如下图: 数据集中一共有5000张训练图片和1000张测试图片,图片的尺寸大小为 32 * 32。 官方提供文件介绍: 文件 用途 ...

Vici__ 4157

CNN实现与训练--------------以cifar10数据集为例进行演示(基于Tensorflow)

CNN实现CiFar10训练

weixin_44119674的博客 957

Tensorflow在CIFAR-10构建CNN

使用Tensorflow在CIFAR-10二进制数据集上构建CNN 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Tensorflow机器学习实战指南 利用Tensorflow读取二进制CIFAR-10数据集 Tensorflow官方文档 tf.transpose函数解析 tf.slice函数解析 CIFAR10/CIFAR100数据集介绍 tf.train.shuffle_...

weixin_33963594的博客 123

RLC电阻电容电感基础知识——电感篇

电感 等效电路 电感线圈由铜导线绕制,等效电路如图所示。 寄生电阻RS,包括了绕线电阻、引脚串联电阻以及磁芯损耗电阻三部分组成,其中绕线电阻与线径、长度、铜线电阻率有关;引脚电阻与引线长短、粗细有关;磁芯损耗电阻与磁芯材料特性有关,显然磁芯损耗电阻还与工作频率有关.寄生电容C主要是绕线圈与圈之间的杂散电容(为PF级),与绕线工艺有关。 等效导纳 显然: (1)当角频率ω(频率f)较小时,呈电感性. (2)当角频率ω等于ω0时,导纳Y虚部为0,呈现电阻性,即发生共振。令导纳Y虚部为0,即可求出共振角频率ω

azj2019的博客 1万+

【第2周】卷积神经网络

在dataloader中,shuffle参数用于控制数据在每个epoch(一个完整的数据集迭代)开始时是否随机打乱。shuffle=True时,在每个epoch开始时将数据随机打乱,这有助于防止模型对数据的顺序依赖性。shuffle=False时,数据将按照原始顺序加载,适用于某些需要按顺序处理数据的情况。

qq_52491380的博客 210

schrodinger 薛定谔

链接: https://pan.baidu.com/s/1Duh4GsoytIklvZp7TdHpWg 密码: wmr1 Linux系统版 进入 Schrodinger_Suites_2021-2_Linux-x86_64 sudo ./INSTALL 中间按默认的来即可,也可以自己调整安装目录。安装目录一定要记住。 安装完,把patcher 拷贝到安装目录 sudo ./patcher 点击Patch即可。 启动程序,进入安装目录 ./maestro ...

周迪新的博客 1万+

计算光刻效率革命:为什么Hopkins模型比Abbe模型快?深入解析TCC的魔力

本文深入解析了计算光刻中Hopkins模型相比Abbe模型的效率优势,重点探讨了TCC(透射交叉系数)的工程智慧。通过预计算光学系统特性并复用TCC矩阵,Hopkins模型实现了数量级的加速,特别适用于复杂照明条件下的光刻仿真。文章详细介绍了TCC的物理意义、模态分解技术以及GPU并行计算等关键加速策略,为半导体制造中的光刻工艺优化提供了实用见解。

weixin_33364627的博客 389

Pytorch搭建CIFAR10的CNN卷积神经网络

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

yanxueotft的博客 1万+

语音增强评价指标全解析:从MOS到eSTOI的实战指南

本文全面解析了语音增强领域的核心评价指标,包括主观评价的黄金标准MOS,以及PESQ、STOI、eSTOI等关键客观指标。文章详细阐述了各指标的原理、适用场景与实战计算方法,并提供了Python代码示例,旨在帮助开发者和研究者建立科学的评估体系,以平衡语音可懂度与音质,从而优化算法效果。

yhn456789的博客 1200

pytorch利用卷积神经网络进行CIFAR-10图像分类

卷积神经网络 在这教程中,主要学习训练CNN,来对CIFAR-10数据集进行图像分类。 该数据集中的图像是彩色小图像,其中被分为了十类。 一些示例图像,如下图所示: 测试GPU是否可以使用 数据集中的图像大小为32x32x3 。在训练的过程中最好使用GPU来加速。 import torch import numpy as np # 检查是否可以利用GPU train_on_gpu = torch.cuda.is_available() if not train_on_gpu: print('

陨星落云的博客 2万+

代谢组数据分析(二十六):LC-MS/MS代谢组学和脂质组学数据的分析流程

本教程概述了LC-MS/MS在代谢组学和脂质组学数据分析中的应用流程。首先介绍了样本的采集、提取和LC-MS/MS分析,随后详细阐述了质谱数据的预处理、峰值识别、特征注释,以及数据标准化和统计分析的重要性。特别强调了使用XCMS和CAMERA进行数据对齐和加合物识别,以及利用MultiABLER和LipidFinder进行数据过滤、插补和标准化处理。此外,还介绍了如何应用EigenMS算法进行数据标准化,以及如何使用Limma包进行差异分析。整个流程旨在提高数据质量,确保分析结果的准确性和可靠性,为后续的生

专注生信领域 1955

UE4打包为Framework库嵌入iOS原生工程

UE4打包为Framework库嵌入iOS原生工程

tangfuling1991的博客 1294

Pytorch之CIFAR10分类卷积神经网络

在计算机视觉领域,图像分类是一个重要的问题。CIFAR-10是一个常用的图像分类数据集,包含10个类别的60000张32x32彩色图像。在本篇博客中,我们将使用PyTorch构建一个卷积神经网络(Convolutional Neural Network,CNN)来对CIFAR-10数据集中的图像进行分类。

风间琉璃的博客 7187

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

努力,加油每一天鸭~ 1037

基于CIFAR10数据集的CNN

目录摘要CNN数据集介绍代码实现读取数据集合搭建CNN网络fit函数总结 摘要 本日志记录我初次用pytorch搭建卷积神经网络,参考了很多别人的经验和代码,主要是根据https://blog.youkuaiyun.com/jining11/article/details/89114502这篇博客,按照博客上的内容一步步弄下来的,加强了我对CNN的理解,并明白了如何使用torch搭建神经网络。(在这里十分...

yawen的博客 3447

【CicadaPlayer】av_rescale_q 学习:转换PTS和Duration

参考 av_rescale_q()理解 大神时间基准的总结: AVPacket下的pts和dts以AVStream->time_base为单位(数值比较大),时间间隔就是AVStream->time_base。 大神:多种转换的总结 av_rescale_q用于计算Packet的PTS 如: if (pkt->pts != AV_NOPTS_VALUE) { pkt->pts = av_rescale_q(pkt->pts, m

突围 842

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【深度学习】越来越卷,教你使用Python实现卷积神经网络(CNN)

@Author:Runsenhttps://blog.youkuaiyun.com/weixin_44510615/article/details/117409037卷积神经网络Yann LeCun ...

fengdu78的博客 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 对抗神经网络(GAN)
下一篇: 卷积神经网络实例2:反卷积
CopperDong
博客等级 码龄14年 1205粉丝 466原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值