convLSTM2D 层使用方法解析(Keras库)

news2024/10/1 3:34:34
image-20230507121348596

最近在研究时序图像分类问题,需要用到convLSTM层提取特征,所以在此仔细分析一下keras.layers.ConvLSTM2D层的使用方法。深度学习框架是tensorflow

官方文档:recurrent/#convlstm2d - Keras 中文文档

下面这部分内容摘自官方文档


ConvLSTM2D

keras.layers.ConvLSTM2D(filters, 
                        kernel_size, 
                        strides=(1, 1),
                        padding='valid', 
                        data_format=None, 
                        dilation_rate=(1, 1), 
                        activation='tanh', 
                        recurrent_activation='hard_sigmoid',
                        use_bias=True, 
                        kernel_initializer='glorot_uniform',
                        recurrent_initializer='orthogonal', 
                        bias_initializer='zeros',
                        unit_forget_bias=True,
                        kernel_regularizer=None, 
                        recurrent_regularizer=None, 
                        bias_regularizer=None, 
                        activity_regularizer=None, 
                        kernel_constraint=None, 
                        recurrent_constraint=None,
                        bias_constraint=None, 
                        return_sequences=False, 
                        go_backwards=False,
                        stateful=False,
                        dropout=0.0,
                        recurrent_dropout=0.0)

卷积 LSTM。

它类似于 LSTM 层,但输入变换和循环变换都是卷积的。

参数

  • filters: 整数,输出空间的维度 (即卷积中滤波器的输出数量)。
  • kernel_size: 一个整数,或者 n 个整数表示的元组或列表, 指明卷积窗口的维度。
  • strides: 一个整数,或者 n 个整数表示的元组或列表, 指明卷积的步长。 指定任何 stride 值 != 1 与指定 dilation_rate 值 != 1 两者不兼容。
  • padding: "valid""same" 之一 (大小写敏感)。
  • data_format: 字符串, channels_last (默认) 或 channels_first 之一。 输入中维度的顺序。 channels_last 对应输入尺寸为 (batch, time, ..., channels)channels_first 对应输入尺寸为 (batch, time, channels, ...)。 它默认为从 Keras 配置文件 ~/.keras/keras.json 中 找到的 image_data_format 值。 如果你从未设置它,将使用 "channels_last"
  • dilation_rate: 一个整数,或 n 个整数的元组/列表,指定用于膨胀卷积的膨胀率。 目前,指定任何 dilation_rate 值 != 1 与指定 stride 值 != 1 两者不兼容。
  • activation: 要使用的激活函数 (详见 activations)。 如果传入 None,则不使用激活函数 (即 线性激活:a(x) = x)。
  • recurrent_activation: 用于循环时间步的激活函数 (详见 activations)。
  • use_bias: 布尔值,该层是否使用偏置向量。
  • kernel_initializer: kernel 权值矩阵的初始化器, 用于输入的线性转换 (详见 initializers)。
  • recurrent_initializer: recurrent_kernel 权值矩阵 的初始化器,用于循环层状态的线性转换 (详见 initializers)。
  • bias_initializer:偏置向量的初始化器 (详见initializers).
  • unit_forget_bias: 布尔值。 如果为 True,初始化时,将忘记门的偏置加 1。 将其设置为 True 同时还会强制 bias_initializer="zeros"。 这个建议来自 Jozefowicz et al.。
  • kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数 (详见 regularizer)。
  • recurrent_regularizer: 运用到 recurrent_kernel 权值矩阵的正则化函数 (详见 regularizer)。
  • bias_regularizer: 运用到偏置向量的正则化函数 (详见 regularizer)。
  • activity_regularizer: 运用到层输出(它的激活值)的正则化函数 (详见 regularizer)。
  • kernel_constraint: 运用到 kernel 权值矩阵的约束函数 (详见 constraints)。
  • recurrent_constraint: 运用到 recurrent_kernel 权值矩阵的约束函数 (详见 constraints)。
  • bias_constraint: 运用到偏置向量的约束函数 (详见 constraints)。
  • return_sequences: 布尔值。是返回输出序列中的最后一个输出,还是全部序列。
  • go_backwards: 布尔值 (默认 False)。 如果为 True,则向后处理输入序列并返回相反的序列。
  • stateful: 布尔值 (默认 False)。 如果为 True,则批次中索引 i 处的每个样品的最后状态 将用作下一批次中索引 i 样品的初始状态。
  • dropout: 在 0 和 1 之间的浮点数。 单元的丢弃比例,用于输入的线性转换。
  • recurrent_dropout: 在 0 和 1 之间的浮点数。 单元的丢弃比例,用于循环层状态的线性转换。

输入尺寸

  • 如果 data_format=‘channels_first’, 输入 5D 张量,尺寸为: (samples,time, channels, rows, cols)
  • 如果 data_format=‘channels_last’, 输入 5D 张量,尺寸为: (samples,time, rows, cols, channels)

输出尺寸

  • 如果return_sequences =true
    • 如果 data_format=‘channels_first’,返回 5D 张量,尺寸为:(samples, time, filters, output_row, output_col)
    • 如果 data_format=‘channels_last’,返回 5D 张量,尺寸为:(samples, time, output_row, output_col, filters)
  • 否则,
    • 如果 data_format =‘channels_first’,返回 4D 张量,尺寸为:(samples, filters, output_row, output_col)
    • 如果 data_format=‘channels_last’,返回 4D 张量,尺寸为:(samples, output_row, output_col, filters)

o_row 和 o_col 取决于 filter 和 padding 的尺寸。


为了更深度了解ConvLSTM2D层的用法,我在Keras官方仓库里找到了ConvLSTM2D层的测试程序:

keras/conv_lstm_test.py at master · keras-team/keras · GitHub

下面我们基于官方例程,看一下如何调用此网络层

测试例程1

def test_conv_lstm(self, data_format, return_sequences):
    	# 卷积核的长和宽
        num_row = 3
        num_col = 3
        # 卷积核的数量=输出的通道数
        filters = 2
        # 样本数量
        num_samples = 1
        # 输入数据的通道数C
        input_channel = 2
        # 输入图像的大小H*W
        input_num_row = 5
        input_num_col = 5
        # 输入图像时间序列的长度S
        sequence_len = 2
        # 参数:data_format: 字符串, "channels_last" (默认) 或 "channels_first"
        #      代表输入数据维度的顺序,channels_last代表通道维在最后一维
        if data_format == "channels_first":
            inputs = np.random.rand(
                num_samples,
                sequence_len,
                input_channel,
                input_num_row,
                input_num_col,
            )
        else:
            inputs = np.random.rand(
                num_samples,
                sequence_len,
                input_num_row,
                input_num_col,
                input_channel,
            )

        # test for return state:
        x = keras.Input(batch_shape=inputs.shape)
        # 参数:return_sequences,布尔值。是返回输出序列中的最后一个输出,还是全部序列
        # 参数:stateful,布尔值 (默认 False)。 如果为 True,
        #     则批次中索引 i 处的每个样品的最后状态 将用作下一批次中索引 i 样品的初始状态。
        # 参数:return_state:,布尔值。除了输出之外是否返回最后一个状态。
        kwargs = {
            "data_format": data_format,
            "return_sequences": return_sequences,
            "return_state": True,
            "stateful": True,
            "filters": filters,
            "kernel_size": (num_row, num_col),
            "padding": "valid",
        }
        layer = keras.layers.ConvLSTM2D(**kwargs)
        layer.build(inputs.shape)
        outputs = layer(x)
        # 返回输出和状态变量
        _, states = outputs[0], outputs[1:]
        self.assertEqual(len(states), 2)
        # states[0] 表示整个神经网络中的第一个状态变量
        model = keras.models.Model(x, states[0])
        state = model.predict(inputs)

        self.assertAllClose(
            keras.backend.eval(layer.states[0]), state, atol=1e-4
        )

        # test for output shape:
        test_utils.layer_test(
            keras.layers.ConvLSTM2D,
            kwargs={
                "data_format": data_format,
                "return_sequences": return_sequences,
                "filters": filters,
                "kernel_size": (num_row, num_col),
                "padding": "valid",
            },
            input_shape=inputs.shape,
        )

测试例程2

def test_conv_lstm_statefulness(self):
        # Tests for statefulness
        num_row = 3
        num_col = 3
        filters = 2
        num_samples = 1
        input_channel = 2
        input_num_row = 5
        input_num_col = 5
        sequence_len = 2
        inputs = np.random.rand(
            num_samples,
            sequence_len,
            input_num_row,
            input_num_col,
            input_channel,
        )

        with self.cached_session():
            model = keras.models.Sequential()
            # "return_sequences" = False,只返回最后一个预测结果
            # "stateful": True, 上次预测得到的记忆输出作为下次记忆的输入
            kwargs = {
                "data_format": "channels_last",
                "return_sequences": False,
                "filters": filters,
                "kernel_size": (num_row, num_col),
                "stateful": True,
                "batch_input_shape": inputs.shape,
                "padding": "same",
            }
            layer = keras.layers.ConvLSTM2D(**kwargs)

            model.add(layer)
            model.compile(optimizer="sgd", loss="mse")
            out1 = model.predict(np.ones_like(inputs))

            # train once so that the states change
            model.train_on_batch(
                np.ones_like(inputs), np.random.random(out1.shape)
            )
            out2 = model.predict(np.ones_like(inputs))

            # 如果状态变量没有重置,2个的输出结果是不同的
            self.assertNotEqual(out1.max(), out2.max())

            # 重置层的状态,再次进行预测,输出结果应该是相同的
            layer.reset_states()
            out3 = model.predict(np.ones_like(inputs))
            self.assertNotEqual(out3.max(), out2.max())

            # check that container-level reset_states() works
            model.reset_states()
            out4 = model.predict(np.ones_like(inputs))
            self.assertAllClose(out3, out4, atol=1e-5)

            # check that the call to `predict` updated the states
            out5 = model.predict(np.ones_like(inputs))
            self.assertNotEqual(out4.max(), out5.max())

测试例程3

 def test_conv_lstm_regularizers(self):
        # check regularizers
        num_row = 3
        num_col = 3
        filters = 2
        num_samples = 1
        input_channel = 2
        input_num_row = 5
        input_num_col = 5
        sequence_len = 2
        inputs = np.random.rand(
            num_samples,
            sequence_len,
            input_num_row,
            input_num_col,
            input_channel,
        )
		# 添加权值矩阵的L2正则化函数
        # 
        with self.cached_session():
            kwargs = {
                "data_format": "channels_last",
                "return_sequences": False,
                "kernel_size": (num_row, num_col),
                "stateful": True,
                "filters": filters,
                "batch_input_shape": inputs.shape,
                "kernel_regularizer": keras.regularizers.L1L2(l1=0.01),
                "recurrent_regularizer": keras.regularizers.L1L2(l1=0.01),
                "activity_regularizer": "l2",
                "bias_regularizer": "l2",
                "kernel_constraint": "max_norm",
                "recurrent_constraint": "max_norm",
                "bias_constraint": "max_norm",
                "padding": "same",
            }

            layer = keras.layers.ConvLSTM2D(**kwargs)
            layer.build(inputs.shape)
            self.assertEqual(len(layer.losses), 3)
            layer(keras.backend.variable(np.ones(inputs.shape)))
            self.assertEqual(len(layer.losses), 4)

测试例程4

def test_conv_lstm_with_initial_state(self):
        num_samples = 32
        sequence_len = 5
        encoder_inputs = keras.layers.Input((None, 32, 32, 3))
        encoder = keras.layers.ConvLSTM2D(
            filters=32,
            kernel_size=(3, 3),
            padding="same",
            return_sequences=False,
            return_state=True,
        )
        _, state_h, state_c = encoder(encoder_inputs)
        encoder_states = [state_h, state_c]

        decoder_inputs = keras.layers.Input((None, 32, 32, 4))
        decoder_lstm = keras.layers.ConvLSTM2D(
            filters=32,
            kernel_size=(3, 3),
            padding="same",
            return_sequences=False,
            return_state=False,
        )
        decoder_outputs = decoder_lstm(
            decoder_inputs, initial_state=encoder_states
        )
        output = keras.layers.Conv2D(
            1, (3, 3), padding="same", activation="relu"
        )(decoder_outputs)
        model = keras.Model([encoder_inputs, decoder_inputs], output)

        model.compile(
            optimizer="sgd",
            loss="mse",
            run_eagerly=test_utils.should_run_eagerly(),
        )
        x_1 = np.random.rand(num_samples, sequence_len, 32, 32, 3)
        x_2 = np.random.rand(num_samples, sequence_len, 32, 32, 4)
        y = np.random.rand(num_samples, 32, 32, 1)
        model.fit([x_1, x_2], y)

        model.predict([x_1, x_2])

总结

对于例程和例程4目前我还不是很理解,没有实际用过。但是按照我个人的理解ConvLSTM2D有如下几个重要的参数:

  1. filters: 整数,输出空间的维度

  2. kernel_size: 一个整数,或者 n 个整数表示的元组或列表, 指明卷积窗口的维度

  3. return_sequences,布尔值。是返回输出序列中的最后一个输出,还是全部序列

  4. return_state:,布尔值。除了输出之外是否返回最后一个状态。

假设输入图像的维度为(T*H*W*C),基于上述参数总结了3个如下用法:

  1. 预测:输出图像时间序列的下一张图像预测结果(H*W*C1)

    x = ConvLSTM2D(filters=32, kernel_size=(3, 3), padding='same', return_sequences= return_sequences=False)
    
  2. 多层网络:构建多层convLSTM网络(T*H*W*C1)

    x = ConvLSTM2D(filters=32, kernel_size=(3, 3), padding='same', return_sequences=True)(inputs)
    x = ConvLSTM2D(filters=32, kernel_size=(3, 3), padding='same', return_sequences=True)(x)
    
  3. 特征提取:提取输入影像的时间维度特征,使用记忆变量C作为输出(H*W*C1)

    _, _, state_c = ConvLSTM2D(filters=32, kernel_size=(1, 1),activation='relu',padding='same',return_sequences=False,return_state=True)(input_tensor)
    

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

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

相关文章

Axure 轮播图如何制作

近来在学习axure,用的版本为Axure 9,给大家讲一下怎么使用轮播图,老规矩保姆式教学法 一、作图 1.创建新的页面,方便我们做图 2.在元件库搜索“动态面板”字样,设置一个动态面板,为什么要设置呢&#xff…

IIC总线通讯协议学习

​ IIC(最简单的总线通讯,简单意味着通用和普适性) iic通讯一般采用一主多从的方式.同一时间要么在发送信息,要么在读取信息(半双工通讯) ​​​​​​​​​​​​​​ ​​​​ ​​​ 标准的写数据帧(主机向从机写数据) 解释以上的写数据帧 S:起始信号(在SCL…

Linux学习---VMWare安装和CentOS7安装

1、 VMWare安装 1、VMware16安装包 链接:https://pan.baidu.com/s/1TKf5szN6k5Hk4HH4zqBgrg 提取码:zhm6 –来自百度网盘超级会员V1的分享 2、VMWare安装流程 (1)找到下载好的安装包,双击运行程序 (2&…

云贝餐饮连锁V2-2.7.7 【新增】外卖新订单提醒

独立版:云贝餐饮连锁V2、版本更新至2.7.7,小程序、公众号版本,全插件,包含微信公众号小程序;包更新,独立版; 带商家端,修复收银台、排队点餐、堂食点餐;最新版更新了&…

【pytorch损失函数(3)】nn.L1Loss()和nn.SmoothL1Loss()

文章目录 【回归损失函数】L1(MAE)、L2(MSE)、Smooth L1 Loss详解1. L1 Loss(Mean Absolute Error,MAE)1.1 数学定义1.2 、使用场景与问题1.3 、如何使用 2. L2 Loss(Mean Squared E…

最流行的开源 LLM (大语言模型)整理

本文对国内外公司、科研机构等组织开源的 LLM 进行了全面的整理。 Large Language Model (LLM) 即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。 所谓"语言模…

MTK平台的SWT异常的简单总结(1)——WatchDog

SWT系列资料很多来源于Google (1)概念相关 SWT是SoftWare Watchdog Timeout的缩写,在Android系统中,为了监控SystemServer是否处于正常运行状态,加入了SWT线程来监控SystemServer中重要线程和Service的运行情况。判断…

多线程-程序、进程、线程与并行、并发的概念

多线程 本章要学习的内容: 专题1:相关概念的理解专题2:多线程创建方式一:继承Thread类专题3:多线程创建方式二:实现Runnable接口专题4:Thread类的常用方法专题5:多线程的优点、使用…

合肥工业大学信息隐藏实验报告

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :信息隐藏实验报告 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台&#xff…

OpenCV基础操作(1)图片及视频基础操作、常用绘图函数

OpenCV基础操作(1)图片、视频、绘图函数 import cv2 as cv import numpy as np1、图像的读取、显示、保存 使用函数 cv2.imread() 读入图像。 第一个参数是幅图路径, 第二个参数是要告诉函数应该如何读取这幅图片。 • cv2.IMREAD_COLOR(1):读入一副彩色…

模板字符串、startsWith()方法和endsWith()方法、repeat()、Set数据结构、Set对象实例方法、遍历Set

模版字符串 ES6新增的创建字符串的方式,使用反引号定义 示例 <script>// 1.模板字符串可以解析变量 ${}显示变量的值let name 张三;let sayHello HEllo,我的名字叫${name};console.log(name);console.log(sayHello);let result {name: "zhangsan",age: 20…

激光切割机在使用过程中常见故障有哪些(一)

由于不少客户在使用光纤激光切割机的过程中&#xff0c;因为操作不当等原因&#xff0c;造成激光切割机出现一些小故障&#xff0c;这些故障虽然不大&#xff0c;但是却会对正常使用工期造成延误&#xff0c;甚至造成损失&#xff0c;所以了解光纤激光切割机的常见故障迫在眉睫…

本地电脑远程服务器,复制大文件报:未指定错误的解决办法

1、本地电脑快捷键WINR 打开运行窗口 2、输入 \\IP地址\磁盘$。如下&#xff1a; 3、上一步点击确定&#xff0c;即远程到了相应的磁盘&#xff0c;可在本地进行复制粘贴。

北京打响大模型地方战第一枪:公布通用人工智能发展21项措施

21项&#xff01;北京就促进AGI创新发展措施征集意见。 作者 | 李水青 来源 | 智东西 ID | zhidxcom 智东西5月16日消息&#xff0c;近日&#xff0c;《北京市促进通用人工智能创新发展的若干措施&#xff08;2023-2025年&#xff09;&#xff08;征求意见稿&#xff09;》…

【C++】基础知识--程序的结构(1)

C简介&#xff1a; C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言&#xff0c;支持过程化编程、面向对象编程和泛型编程。 C 被认为是一种中级语言&#xff0c;它综合了高级语言和低级语言的特点。 C 是由 Bjarne Stroustrup 于 1979 年在新泽西州…

Codeforces Round 873 (Div. 2) 题解

5.18晚VP&#xff0c;共AC三题&#xff0c;ABC题&#xff0c;感觉难度还是挺大的&#xff0c;做起来一点也不顺手。。。A题秒出&#xff0c;卡在了B题&#xff0c;在B题花费了好多时间&#xff0c;还没有C题做得顺利。。。B题开始想错了&#xff0c;思路不对&#xff0c;但确实…

LeetCode225.用队列实现栈

&#x1f4ad;前言&#xff1a; 建议本题和LeetCode232对比实现 syseptember的个人博客&#xff1a;LeetCode232.栈模拟队列http://t.csdn.cn/HCEDg 题目 思路 ❗注意&#xff1a;本题的逻辑结构是栈&#xff0c;物理结构是队列&#xff0c;我们需要通过2个队列模拟栈的操作。…

Doxygen源码分析:构建过程简介,并生成doxygen自身的C++文档

2023-05-19 11:52:17 ChrisZZ imzhuofoxmailcom Hompage https://github.com/zchrissirhcz 文章目录 1. doxygen 版本2. 找出所有的 CMakeLists.txt 和 *.cmake 文件3. cmake 构建目标清单4. 生成 Doxygen 自己的文档 1. doxygen 版本 zzLegion-R7000P% git log …

LabVIEWCompactRIO 开发指南23 Web服务

LabVIEWCompactRIO 开发指南23 Web服务 LabVIEW8.6中引入的LabVIEWWeb服务提供了一种开放的标准方式&#xff0c;可通过Web与VI进行通信。考虑一个部署在分布式系统中的LabVIEW应用程序。LabVIEW提供了网络流等功能来建立通信&#xff0c;但许多开发人员需要一种方式&#xf…

Cy7 NHS ester水溶性七甲川花菁染料标记活性脂477908-53-5

Sulfo-CY7 NHS ester是一种荧光标记试剂&#xff0c;可用于生物分子的荧光标记。它是一种水溶性的N-羟基琥珀酰亚胺酯化合物&#xff0c;具有强烈的荧光信号和高度稳定性。Sulfo-CY7 NHS ester的化学结构为C43H48N3NaO16S2&#xff0c;分子量约为968.98 g/mol。Sulfo-CY7 NHS e…