1D CNN、2D CNN 和 3D CNN 的输入形状之间的差异 内核在空间维度上移动相同的内核,所有通道操作是点积

如何解决1D CNN、2D CNN 和 3D CNN 的输入形状之间的差异 内核在空间维度上移动相同的内核,所有通道操作是点积

我是第一次为图像分类构建 CNN 模型,我对每种类型(1D CNN、2D CNN、3D CNN)的输入形状以及如何固定数量有点困惑卷积层中的过滤器。我的数据是 100x100x30,其中 30 个是特征。 这是我使用 Functional API Keras 为 1D CNN 撰写的文章:

library(shiny)
library(networkD3)
library(htmlwidgets)
library(tibble)
library(dplyr)
library(ggplot2)
library(ggforce)


ui <- fluidPage(
  fluidRow(sankeyNetworkOutput("plot"))
)

server <- function(input,output,session) {
  session$onSessionEnded(stopApp)

  URL <- paste0(
    "https://cdn.rawgit.com/christophergandrud/networkD3/","master/JSONdata/energy.json"
  )
  energy <- jsonlite::fromJSON(URL)
  
  output$plot <- renderSankeyNetwork({
    sn <- sankeyNetwork(
      Links = energy$links,Nodes = energy$nodes,Source = "source",Target = "target",Value = "value",NodeID = "name",units = "TWh",fontSize = 12,nodeWidth = 30,nodePadding = 0,width = "100%",sinksRight = FALSE
    )

    update_diagr <-
      'function(el,x) {
          d3.select(el)
          .selectAll(".node rect")
          .filter(function(d) { return d.name.startsWith("National"); })
          .attr("transform","translate(0 100) rotate(90)");
          
        }'
    onRender(sn,update_diagr)
  })
}

shinyApp(ui,server)

但是,在通过将 Conv1D、Maxpooling1D 更改为 Conv2D 和 Maxpooling2D 来尝试 2D CNN 模型时,出现以下错误:

def create_CNN1D_model(pool_type='max',conv_activation='relu'):
    input_layer = (30,1)
    conv_layer1 = Conv1D(filters=16,kernel_size=3,activation=conv_activation)(input_layer)
    max_pooling_layer1 = MaxPooling1D(pool_size=2)(conv_layer1)

    conv_layer2 = Conv1D(filters=32,activation=conv_activation)(max_pooling_layer1)
    max_pooling_layer2 = MaxPooling1D(pool_size=2)(conv_layer2)

    flatten_layer = Flatten()(max_pooling_layer2)
    dense_layer = Dense(units=64,activation='relu')(flatten_layer)

    output_layer = Dense(units=10,activation='softmax')(dense_layer)
    CNN_model = Model(inputs=input_layer,outputs=output_layer)
    return CNN_model
CNN1D = create_CNN1D_model()
CNN1D.compile(loss = 'categorical_crossentropy',optimizer = "adam",metrics = ['accuracy'])
Trace = CNN1D.fit(X,y,epochs=50,batch_size=100)

谁能告诉我 2D CNN 和 3D CNN 的输入形状如何?输入数据预处理可以做什么?

解决方法

TLDR; 您的 X_train 可以被视为(批量、空间暗淡...、通道)。内核并行地应用于所有通道的空间维度。因此,2D CNN 将需要两个空间维度 (batch,dim 1,dim 2,channels)

因此,对于 (100,100,3) 形状的图像,您将需要一个 2D CNN,在所有 3 个通道上卷积超过 100 个高度和 100 个宽度。

让我们理解上面的陈述。


首先,您需要了解 CNN(一般而言)在做什么。

内核在执行简单的矩阵运算(如点product) 到相应的值。

内核在空间维度上移动

现在,假设您有 100 张图像(称为批次)。每张图像都是 28 x 28 像素,有 3 个通道 R、G、B(在 CNN 的上下文中也称为特征图)。如果我将此数据存储为张量,则形状将为 (100,28,3)

但是,我可以拥有没有任何高度的图像(可能像信号),或者,我可以拥有具有额外空间维度的数据,例如视频(高度、宽度和时间)。

一般来说,以下是基于 CNN 的神经网络的输入的样子。

enter image description here

相同的内核,所有通道

您需要知道的第二个关键点是,2D 内核将在 2 个空间维度上进行卷积,但同一个内核将在所有特征图/通道上执行此操作。所以,如果我有一个 (3,3) 内核。相同的内核将应用于 R、G、B 通道(并行)并在图像的 HeightWidth 上移动。

操作是点积

最后,操作(对于单个特征图/通道和单个卷积窗口)可以如下所示进行可视化。

enter image description here

因此,简而言之 -

  1. 内核被应用于数据的空间维度
  2. 核形状等于空间维度的数量
  3. 一个内核同时应用于所有的特征图/通道
  4. 操作是内核和窗口之间的简单点积

让我们以具有单个特征图/通道的张量为例(因此,对于图像,它会被灰度化)-

enter image description here

因此,凭直觉,我们看到如果我想使用 1D CNN,您的数据必须具有 1 个空间维度,这意味着每个样本都需要是 2D(空间维度和通道) ,这意味着 X_train 必须是 3D 张量 (batch,spatial dimensions,channels)

同样,对于 2D CNN,您将有 2 个空间维度(例如 H、W)并且是 3D 样本 (H,W,Channels)X_train 将是 {{ 1}}

让我们用代码试试这个 -

(Samples,H,Channels)

用于应用一维 CNN -

import tensorflow as tf
from tensorflow.keras import layers

X_2D = tf.random.normal((100,7,3))   #Samples,width/time,channels (feature maps)
X_3D = tf.random.normal((100,5,3)) #Samples,height,width,channels (feature maps)
X_4D = tf.random.normal((100,6,2,time,channels (feature maps)

用于应用 2D CNN -

#With padding = same,the edge pixels are padded to not skip a few

#Out featuremaps = 10,kernel (3,)
cnn1d = layers.Conv1D(10,3,padding='same')(X_2D) 
print(X_2D.shape,'->',cnn1d.shape)

#(100,3) -> (100,10)

对于 3D CNN -

#Out featuremaps = 10,3)
cnn2d = layers.Conv2D(10,(3,3),padding='same')(X_3D) 
print(X_3D.shape,cnn2d.shape)

#(100,10)
,

对于 100x100x30 的输入形状,您是说批量大小是 100?或者每个数据都是 100x100x30 的形状?在第二种情况下,您必须改用 Conv2D 层。每层的输入形状应该是:

Conv1D: (size1,channel_number),Conv2D: (size1,size2,Conv3D: (size1,size3,channel_number)

1DCNN2DCNN3DCNN表示卷积层的每个内核和通道的维度。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-