边写代码边学习之卷积神经网络CNN

news2024/11/16 2:50:29

1. 卷积神经网络CNN

卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习神经网络的架构,主要用于图像识别、图像分类和计算机视觉等任务。它是由多层神经元组成的神经网络,其中包含卷积层、池化层和全连接层等组件。

CNN的设计受到了生物视觉系统的启发,其中最重要的组件是卷积层。卷积层通过使用一系列称为卷积核(或过滤器)的小矩阵,对输入图像进行卷积操作。这个卷积操作可以理解为滑动窗口在输入图像上的移动,对窗口中的图像部分和卷积核进行逐元素相乘并相加,从而生成输出特征图。这个过程可以有效地提取输入图像中的局部特征,例如边缘、纹理等信息。

随后,通常会应用池化层来降低特征图的空间维度,减少模型中的参数数量,以及提取更加抽象的特征。常见的池化操作包括最大池化和平均池化,它们分别选择局部区域中的最大值或平均值作为池化后的值。

最后,通过一个或多个全连接层对池化后的特征进行处理,将其映射到特定的输出类别。全连接层通常是传统的神经网络结构,其输出用于执行分类、回归或其他任务。

卷积神经网络在图像处理领域表现出色,因为它们能够自动从原始像素中学习特征,并且能够处理大量数据,从而实现较高的准确性。在过去的几年里,CNN在计算机视觉和其他领域的许多任务上取得了显著的突破,成为深度学习的重要组成部分。

2. tf.keras.layers.Conv1D

 

tf.keras.layers.Conv1D(
    filters,
    kernel_size,
    strides=1,
    padding="valid",
    data_format="channels_last",
    dilation_rate=1,
    groups=1,
    activation=None,
    use_bias=True,
    kernel_initializer="glorot_uniform",
    bias_initializer="zeros",
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    **kwargs
)

一维卷积层(例如时间卷积(temporal convolution))。

该层创建一个卷积核,该卷积核与单个空间(或时间)维度上的层输入进行卷积,以产生输出张量。 如果 use_bias 为 True,则创建偏差向量并将其添加到输出中。 最后,如果激活不是 None,它也会应用于输出。

当将此层用作模型中的第一层时,请提供 input_shape 参数(整数元组或 None,例如 (10, 128) 表示 10 个 128 维向量的向量序列,或 (None, 128) 表示可变长度 128 维向量的序列。

3. 例子

3.1 简单的一层卷积网络

定义一个一维的卷积,卷积核的shape的(,2),输入的shape是(None, 1)。 biase没有,filter是1.  

定义输入数据和卷积核,然后输入到卷积网络中,输出结果。

def case1():
    # Create a Conv1D model
    model = tf.keras.Sequential([
        tf.keras.layers.Conv1D(filters=1, kernel_size=2, activation='linear', use_bias=False,
                               input_shape=(None, 1)),
    ])
    model.summary()

    # Input sequence and filter
    input_sequence = np.array([1, 2, 3, 4, 5, 6])
    filter_kernel = np.array([2, -1])

    # Reshape the input sequence and filter to fit Conv1D
    input_sequence = input_sequence.reshape(1, -1, 1)
    filter_kernel = filter_kernel.reshape(-1, 1, 1)

    # Set the weights of the Conv1D layer to the filter_kernel
    model.layers[0].set_weights([filter_kernel])

    # Perform 1D Convolution
    output_sequence = model.predict(input_sequence).flatten()

    print("Input Sequence:", input_sequence.flatten(), "shape:", input_sequence.shape)
    print("Filter:", filter_kernel.flatten(), " shape :",filter_kernel.shape )
    print("Output Sequence:", output_sequence)

if __name__ == '__main__':
    case1()

输出

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv1d (Conv1D)             (None, None, 1)           2         
                                                                 
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
_________________________________________________________________
1/1 [==============================] - 0s 121ms/step
Input Sequence: [1 2 3 4 5 6] shape: (1, 6, 1)
Filter: [ 2 -1]  shape : (2, 1, 1)
Output Sequence: [0. 1. 2. 3. 4.]

Process finished with exit code 0

3.2 . 自定激活函数

为了验证激活函数是在卷积后调用, 特写下面代码。你们可以根据输入和输出做校验。

def case_custom_activation():
    # Input sequence and filter
    input_sequence = np.array([1, 2, 3, 4, 5, 6])
    filter_kernel = np.array([2, -1])

    # Reshape the input sequence and filter to fit Conv1D
    input_sequence = input_sequence.reshape(1, -1, 1)
    filter_kernel = filter_kernel.reshape(-1, 1, 1)

    def custom_activation(x):
        # return tf.square(tf.nn.tanh(x))
        return tf.square(x)

    # Create a Conv1D model
    model = keras.Sequential([
        keras.layers.Conv1D(filters=1, kernel_size=2, activation=custom_activation, use_bias=False,
                               input_shape=(None, 1)),
    ])

    model.summary()

    # Set the weights of the Conv1D layer to the filter_kernel
    model.layers[0].set_weights([filter_kernel])

    # Perform 1D Convolution
    output_sequence = model.predict(input_sequence).flatten()

    print("Input Sequence:", input_sequence.flatten(), "shape:", input_sequence.shape)
    print("Filter:", filter_kernel.flatten(), " shape :",filter_kernel.shape )
    print("Output Sequence:", output_sequence)

if __name__ == '__main__':
    case_custom_activation()

输出

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv1d (Conv1D)             (None, None, 1)           2         
                                                                 
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
_________________________________________________________________
1/1 [==============================] - 0s 57ms/step
Input Sequence: [1 2 3 4 5 6] shape: (1, 6, 1)
Filter: [ 2 -1]  shape : (2, 1, 1)
Output Sequence: [ 0.  1.  4.  9. 16.]

3.3. 验证偏置

和上面代码唯一不同是,定义了偏置。

def cnn1d_biase():
    # Input sequence and filter
    input_sequence = np.array([1, 2, 3, 4, 5, 6])
    filter_kernel = np.array([2, -1])
    biase = np.array([2])

    # Reshape the input sequence and filter to fit Conv1D
    input_sequence = input_sequence.reshape(1, -1, 1)
    filter_kernel = filter_kernel.reshape(-1, 1, 1)

    def custom_activation(x):
        # return tf.square(tf.nn.tanh(x))
        return tf.square(x)

    # Create a Conv1D model
    model = keras.Sequential([
        keras.layers.Conv1D(filters=1, kernel_size=2, activation=custom_activation,
                               input_shape=(None, 1)),
    ])

    model.summary()

    print(model.layers[0].get_weights()[0].shape)
    print(model.layers[0].get_weights()[1].shape)

    # Set the weights of the Conv1D layer to the filter_kernel
    model.layers[0].set_weights([filter_kernel, biase])

    # Perform 1D Convolution
    output_sequence = model.predict(input_sequence).flatten()

    print("Input Sequence:", input_sequence.flatten(), "shape:", input_sequence.shape)
    print("Filter:", filter_kernel.flatten(), " shape :", filter_kernel.shape)
    print("Output Sequence:", output_sequence)


if __name__ == '__main__':
    cnn1d_biase()

输出

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv1d (Conv1D)             (None, None, 1)           3         
                                                                 
=================================================================
Total params: 3
Trainable params: 3
Non-trainable params: 0
_________________________________________________________________
(2, 1, 1)
(1,)
1/1 [==============================] - 0s 60ms/step
Input Sequence: [1 2 3 4 5 6] shape: (1, 6, 1)
Filter: [ 2 -1]  shape : (2, 1, 1)
Output Sequence: [ 4.  9. 16. 25. 36.]

Process finished with exit code 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/805134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法与数据结构-二分查找

文章目录 什么是二分查找二分查找的时间复杂度二分查找的代码实现简单实现:不重复有序数组查找目标值变体实现:查找第一个值等于给定值的元素变体实现:查找最后一个值等于给定值的元素变体实现:查找最后一个小于给定值的元素变体实…

【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU2

KPU的基础架构 让我们回顾下经典神经网络的基础运算操作: 卷积(Convolution):1x1卷积,3x3卷积,5x5及更高的卷积 批归一化(Batch Normalization) 激活(Activate) 池化&…

玩一玩编程式 AOP

[toc] 平时我们项目中涉及到 AOP,基本上就是声明式配置一下就行了,无论是基于 XML 的配置还是基于 Java 代码的配置,都是简单配置即可使用。声明式配置有一个好处就是对源代码的侵入小甚至是零侵入。不过今天松哥要和小伙伴们聊一聊编程式的 …

Chapter 9: Lists | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介ListsA list is a sequenceLists are mutableTraversing a listList operationsList slicesList methodsDeleting elementsLists and functionsLists and stringsParsing linesObjects and valuesAliasingList argumentsDebuggingGlossar…

【Spring】Spring 下载及其 jar 包

根据 【动力节点】最新Spring框架教程,全网首套Spring6教程,跟老杜从零学spring入门到高级 以及老杜的原版笔记 https://www.yuque.com/docs/share/866abad4-7106-45e7-afcd-245a733b073f?# 《Spring6》 进行整理, 文档密码:mg9b…

数字签名与数字证书

数字签名与数字证书 数字签名数字证书数字证书的原理数字证书的特点 如何验证证书机构的公钥不是伪造的 数字签名 数字签名是非对称密钥加密技术与数字摘要技术的应用,数字签名就是用加密算法加密报文文本的摘要(摘要通过hash函数得到)而生成…

「回溯框架」

文章目录 0 回溯和动态规划(dp)的区别0.1 框架 1 刷题1.1 全排列1.1.1 题解1.1.2 Code1.1.3 结果 1.2 N皇后1.2.1 题解1.2.2 Code1.2.3 结果 0 回溯和动态规划(dp)的区别 动态规划的核心是穷举,那么回溯算法和dp有什么…

单机最快的队列Disruptor解析和使用

前言 介绍高性能队列Disruptor原理以及使用例子。 Disruptor是什么? Disruptor是外汇和加密货币交易所运营商 LMAX group 建立高性能的金融交易所的结果。用于解决生产者、消费者及其数据存储的设计问题的高性能队列实现。可以对标JDK中的ArrayBlockingQueue。是目前单机且…

IDC报告背后:大模型时代,重新理解AI公有云

大模型之于AI公有云的意义,在于大模型可以改变过去“手工作坊定制算法”的高成本模式,转向“工厂模式”,只需要微调和精调,就可以形成针对性的场景算法。 作者|葛覃 出品|产业家 一年前,依然有不少云计算从业者思…

基于智能状态和源代码插桩的 C 程序内存安全性动态分析

原文来自微信公众号“编程语言Lab”:基于智能状态和源代码插桩的 C 程序内存安全性动态分析 搜索关注“编程语言Lab”公众号(HW-PLLab)获取更多技术内容! 欢迎加入 编程语言社区 SIG-程序分析 参与交流讨论(加入方式&a…

警惕!通过谷歌和必应搜索广告传播的新型恶意活动

据观察,一种新的恶意广告活动利用谷歌搜索和必应的广告,以AnyDesk、Cisco AnyConnect VPN和WinSCP等IT工具的用户为目标,诱骗他们下载木马安装程序,目的是入侵企业网络,并可能在未来实施勒索软件攻击。 Sophos在周三的…

Python生成pyc以及pyd文件的方法

文章目录 0. 背景1. pyc文件的生成2. pyd文件的生成3. 两者的异同 0. 背景 当有些模块的代码需要一定的保密性,这个时候就需要考虑pyc和pyd文件了。今天就好好琢磨一下这两种文件的生成和使用方法。让自己的知识能够朝着商业化的方向再前进一步。 1. pyc文件的生成…

为企业发展赋能增效:中国智能交通协会来访闪马智能

7月26日,中国智能交通协会秘书长杨颖一行来访闪马智能,闪马智能助理总裁兼营销与方案中心总经理黄智宏、CMO王一佳、副总裁詹诚以及副总裁兼智慧城市创新院院长邵钦豪等出席了交流会。 上海电科智能系统股份有限公司、卡斯柯信号有限公司、上海澳星照明电…

告别胆怯,大步向前,迎接新挑战!

告别胆怯,大步向前,迎接新挑战! “赤日炎炎似火烧,野田禾稻半枯焦。农夫心内如汤煮。公子王孙把扇摇。”读罢《水浒传》中的这一首七绝诗,受其感染,笔者也乘兴呤顺口溜四句抒怀:“烈日炎炎似火…

FlatBuffers 使用编译器

1、前言 可能刚接触的人会思考为啥要使用编译器: 一般跨平台、跨语言的都有一套固定的流程,大致可分为: 撰写IDL文件 -> 使用对应语言的编译器,编译成对应的语言 -> 序列化 ->持久化 -> 反序列化 这里就对应着这个…

Spring中IOC容器常用的接口和具体的实现类

在Spring框架没有出现之前,在Java语言中,程序员们创建对象一般都是通过关键字new来完成,那时流行一句话“万物即可new,包括女朋友”。但是这种创建对象的方式维护成本很高,而且对于类之间的相互关联关系很不友好。鉴于…

三言两语说透关于 MySQL2 和 MySQL 的区别

MySQL是最流行的开源关系型数据库管理系统,拥有大量的使用者和广泛的应用场景。而MySQL2是MySQL官方团队推出的新一代MySQL驱动,用于取代老版的MySQL模块,提供更好的性能和更丰富的功能。本文将介绍MySQL2相较于MySQL有哪些优势以及具体的技术区别。 My…

01 关于 ABAP RAP 模型

ABAP RAP 模型 概览 关于 RAP 专栏内容,是个人在 SAP 官方提供的课程学习后整理的文档。这些文档涉及部分对概念的理解。在这里,不做具体讲解,而是跟随后续实例开发教程,通过实际练习,让大家能够理解这些概念。 ABAP …

【Linux】多线程——生产者和消费者模型

目录 1 生活中的例子 2 为何要使用生产者消费者模型 3 生产者和消费者模型的特点 优点 4 如何理解生产消费模型提高了效率? 5 基于BlockingQueue(阻塞队列)的生产者消费者模型 C queue模拟阻塞队列的生产消费模型 1 生活中的例子 存在多个消费者&#xff0c…

pve安装ikuai并设置,同时把pve的网络连接到ikuai虚拟机

目录 前因 前置条件 安装ikuai 进入ikuai的后台 配置lan口,以及wan口 配置lan口桥接 按实际情况来设置了 单拨(PPOE拨号) 多拨(内外网设置点击基于物理网卡的混合模式) 后续步骤 pve连接虚拟机ikuai的网络以及其他虚拟机连接ikuai的网…