0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如果在TensorFlow中构建3D-CNN数据集

电子工程师 来源: 深度学习与计算机视觉 作者:磐怼怼 2022-08-10 11:31 次阅读

3D-CNN简介

MNIST数据集分类被认为是计算机视觉领域的 hello world 程序。MNIST数据集帮助初学者理解卷积神经网络(CNN)的概念和实现。

许多人认为图像只是一个普通矩阵,但实际上并非如此。图像拥有所谓的空间信息。考虑如下所示的 3X3 矩阵。

[a b c

d e f

g h i]

在正则矩阵中,矩阵中的值将相互独立。相邻值不会携带矩阵中特定字段的任何关系或信息。例如,在矩阵中代替“e”的值与出现在其他位置的值(如“a”、“b”等)没有任何联系。图像中的情况并非如此。

在图像中,矩阵中的每个位置代表图像中的一个像素,每个位置的值代表该像素的值。像素值可以是 8 位图像中的 [0-255]。每个像素与其相邻像素有某种关系。任何像素的邻域是其周围的一组像素。对于任何像素,有 3 种方法来表示其邻域,称为 N-4、ND 和 N-8。让我们详细了解它们。

N-4:它表示存在于参考像素的顶部、底部、右侧和左侧的像素。对于像素“e”,N-4 包含“b”、“f”、“h”和“d”。

ND:它表示从参考像素对角线可访问的像素。对于像素“e”,ND 包含“a”、“c”、“i”和“g”。

N-8:它代表它周围存在的所有像素。它包括 N-4 和 ND 像素。对于像素“e”,N-8 包含“a”、“b”、“c”、“d”、“f”、“g”、“h”和“i”。

N-4、N-8 和 ND 像素有助于提取有关像素的信息。例如,这些参数可用于将像素分类为边界或内部或外部像素。这是图像的特殊性。人工神经网络(ANN )接收一维数组形式的输入。图像始终存在于具有 1 个或多个通道的 2D 阵列中。当图像数组转换为一维数组时,它会丢失空间信息,因此人工神经网络无法捕获此信息并且在图像数据集上表现不佳。而这就是 CNN 擅长的地方。

CNN 接受 2D 数组作为输入,并使用掩码(或过滤器或内核)执行卷积操作并提取这些特征。执行称为池化的过程,该过程减少了提取的特征数量并降低了计算复杂度。完成这些操作后,我们将提取的特征转换为一个1D数组,并将其提供给学习进行分类的神经网络层。

本文旨在扩展对 3D 数据进行卷积操作的概念。我们将构建一个 3D CNN,它将在 3D MNIST 数据集上执行分类

数据集概述

我们将在数据集中使用fulldatasetvectors.h5文件。该文件具有从所有 3D 点云的体素化 (x:16, y:16, z:16) 获得的 4096-D 向量。该文件包含 10000 个训练样本和 2000 个测试样本。数据集也有可以使用的点云数据。

导入模块

由于数据以h5格式存储,我们将使用h5py模块从 fulldatasetvectors 文件中的数据加载数据集。TensorFlow和Keras将用于构建和训练 3D-CNN。to_categorical函数有助于对 目标变量执行 one-hot 编码。我们还将使用 earlystopping 回调来停止训练并防止模型过度拟合。


	importnumpyasnp importh5py fromtensorflow.keras.utilsimportto_categorical fromtensorflow.kerasimportlayers fromtensorflow.keras.modelsimportSequential fromtensorflow.keras.initializersimportConstant fromtensorflow.keras.optimizersimportAdam fromtensorflow.keras.callbacksimportEarlyStopping 

加载数据集

如前所述,我们将使用 h5py 模块从 fulldatasetvectors.h5 文件中加载数据。

使用 h5py.File(‘。./input/3d-mnist/full_dataset_vectors.h5’, ‘r’) 作为数据集:


	xtrain,xtest=dataset[“X_train”][:],dataset[“X_test”][:] ytrain,ytest=dataset[“y_train”][:],dataset[“y_test”][:] xtrain=np.array(xtrain) xtest=np.array(xtest) print(‘trainshape:’,xtrain.shape) print(‘testshape:’,xtest.shape) xtrain=xtrain.reshape(xtrain.shape[0],16,16,16,1) xtest=xtest.reshape(xtest.shape[0],16,16,16,1) ytrain,ytest=to_categorical(ytrain,10),to_categorical(ytest,10) 我们可以看到训练数据有 10000 个样本,而测试数据有 2000 个样本,每个样本包含 4096 个特征。

	trainshape:(10000,4096) testshape:(2000,4096) 

构建 3D-CNN

3D-CNN,就像任何普通的 CNN 一样,有两部分——特征提取器和 ANN 分类器,并且以相同的方式执行。

与普通 CNN 不同,3D-CNN 执行 3D 卷积而不是 2D 卷积。我们将使用 Keras 的Sequential API 来构建 3D CNN。前 2 层将是具有 32 个过滤器和 ReLU 作为激活函数的 3D 卷积层,然后是用于降维的最大池化层。这些层还添加了一个偏置项,其值为 0.01。默认情况下,偏差值设置为 0。

再次使用同一组图层,但使用 64 个过滤器。然后是 dropout 层和 flatten 层。flatten 层有助于将特征重塑为可由人工神经网络处理的一维阵列,即密集层。ANN部分由 2 层组成,分别有 256 和 128 个神经元,以 ReLU 作为激活函数。然后是具有 10 个神经元的输出层,因为数据集中存在 10 个不同的类别或标签


	model=Sequential() model.add(layers.Conv3D(32,(3,3,3),activation='relu',input_shape=(16,16,16,1),bias_initializer=Constant(0.01))) model.add(layers.Conv3D(32,(3,3,3),activation='relu',bias_initializer=Constant(0.01))) model.add(layers.MaxPooling3D((2,2,2))) model.add(layers.Conv3D(64,(3,3,3),activation='relu')) model.add(layers.Conv3D(64,(2,2,2),activation='relu')) model.add(layers.MaxPooling3D((2,2,2))) model.add(layers.Dropout(0.6)) model.add(layers.Flatten()) model.add(layers.Dense(256,'relu')) model.add(layers.Dropout(0.7)) model.add(layers.Dense(128,'relu')) model.add(layers.Dropout(0.5)) model.add(layers.Dense(10,'softmax')) model.summary() 这是 3D-CNN 的架构。

	Model:"sequential_2" _________________________________________________________________ Layer(type)OutputShapeParam# ================================================================= conv3d_5(Conv3D)(None,14,14,14,32)896 _________________________________________________________________ conv3d_6(Conv3D)(None,12,12,12,32)27680 _________________________________________________________________ max_pooling3d_2(MaxPooling3(None,6,6,6,32)0 _________________________________________________________________ conv3d_7(Conv3D)(None,4,4,4,64)55360 _________________________________________________________________ conv3d_8(Conv3D)(None,3,3,3,64)32832 _________________________________________________________________ max_pooling3d_3(MaxPooling3(None,1,1,1,64)0 _________________________________________________________________ dropout_4(Dropout)(None,1,1,1,64)0 _________________________________________________________________ flatten_1(Flatten)(None,64)0 _________________________________________________________________ dense_3(Dense)(None,256)16640 _________________________________________________________________ dropout_5(Dropout)(None,256)0 _________________________________________________________________ dense_4(Dense)(None,128)32896 _________________________________________________________________ dropout_6(Dropout)(None,128)0 _________________________________________________________________ dense_5(Dense)(None,10)1290 ================================================================= Totalparams:167,594 Trainableparams:167,594 Non-trainableparams:0 

训练 3D-CNN

我们将使用 Adam 作为优化器。分类交叉熵将用作训练模型的损失函数,因为它是一个多类分类。准确率将用作训练的损失指标。

如前所述,在训练模型和 dropout 层时,将使用 Earlystopping 回调。一旦任何参数(如损失或准确性)在一定数量的时期内没有改善,Earlystopping 回调有助于停止训练过程,这反过来又有助于防止模型的过度拟合。

Dropout 通过在训练时随机关闭一些神经元并使模型学习而不是记忆,来帮助防止模型的过度拟合。dropout 值不宜过高,否则可能导致模型欠拟合,并不理想。


	model.compile(Adam(0.001),'categorical_crossentropy',['accuracy']) model.fit(xtrain,ytrain,epochs=200,batch_size=32,verbose=1,validation_data=(xtest,ytest),callbacks=[EarlyStopping(patience=15)]) 这些是训练 3D-CNN 的一些时期。

	Epoch1/200 313/313[==============================]-39s123ms/step-loss:2.2782-accuracy:0.1237-val_loss:2.1293-val_accuracy:0.2235 Epoch2/200 313/313[==============================]-39s124ms/step-loss:2.0718-accuracy:0.2480-val_loss:1.8067-val_accuracy:0.3395 Epoch3/200 313/313[==============================]-39s125ms/step-loss:1.8384-accuracy:0.3382-val_loss:1.5670-val_accuracy:0.4260 ... ... Epoch87/200 313/313[==============================]-39s123ms/step-loss:0.7541-accuracy:0.7327-val_loss:0.9970-val_accuracy:0.7061 

测试 3D-CNN

3D-CNN在训练数据上达到了73.3%的准确率,在测试数据上达到了70.6%的准确率。由于数据集非常小且不平衡,因此准确性可能略低。


	_,acc=model.evaluate(xtrain,ytrain) print('trainingaccuracy:',str(round(acc*100,2))+'%') _,acc=model.evaluate(xtest,ytest) print('testingaccuracy:',str(round(acc*100,2))+'%') 

	313/313[==============================]-11s34ms/step-loss:0.7541-accuracy:0.7327 trainingaccuracy:73.27% 63/63[==============================]-2s34ms/step-loss:0.9970-accuracy:0.7060 testingaccuracy:70.61% 

结论

综上所述,本文涵盖了以下主题:

图像中像素的邻域

为什么 ANN 在图像数据集上表现不佳

CNN 和 ANN 的区别

CNN的工作

在 TensorFlow 中构建和训练 3D-CNN

为了进一步继续这个项目,可以尝试通过将像素值投影到另一个轴上,从 MNIST 数据集创建一个新的自定义 3D 数据集。x 轴和 y 轴将与任何图像中的相同,但像素值将投影在 z 轴上。这种从 2D 数据创建 3D 数据的转换可以在执行图像增强之后应用,这样我们就有了一个平衡且通用的数据集,可用于训练 3D-CNN 并获得更好的准确性。

审核编辑:郭婷


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4558

    浏览量

    98605
  • 数据集
    +关注

    关注

    4

    文章

    1176

    浏览量

    24315

原文标题:在 TensorFlow 中构建 3D-CNN

文章出处:【微信号:3D视觉工坊,微信公众号:3D视觉工坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    在PROTRL 99 SE如果在调用某个元器件时,屏幕提示该元...

    在PROTRL 99 SE如果在调用某个元器件时,屏幕提示该元器件不存在,可能的原因是什么?应如何解决?新手入门求指导{:23:}{:22:}{:22:}
    发表于 06-04 20:27

    TF之CNNCNN实现mnist数据预测

    TF之CNNCNN实现mnist数据预测 96%采用placeholder用法+2层C及其max_pool法+隐藏层dropout法+输出层softmax法+目标函数cross_e
    发表于 12-19 17:02

    TF之CNNTensorflow构建卷积神经网络CNN的嘻嘻哈哈事之详细攻略

    TF之CNNTensorflow构建卷积神经网络CNN的嘻嘻哈哈事之详细攻略
    发表于 12-19 17:03

    TensorFlowCNN文本分类

    TensorFlow实现CNN进行文本分类(译)
    发表于 10-31 09:27

    如果在微秒延时的时候事件发生更高优先级任务运行会失败吗?

    关于原子哥freertos例程的微秒延时,这个freertos微秒延时不像uocs关闭了调度器,那么如果在微秒延时的时候事件发生更高优先级任务运行,例如中断
    发表于 06-16 03:37

    如何利用PyTorch API构建CNN?

    ?方式有哪些?今天本文将以一个简单的指南,将帮助您构建和了解构建简单的CNN的概念。通过阅读本文之后,将能够基于PyTorch API构建一个简单的CNN,并使用FashionMNIS
    发表于 07-16 18:13

    浅谈深度学习之TensorFlow

    TensorFlow 实现所有这些。数据DNN 依赖于大量的数据。可以收集或生成数据,也可
    发表于 07-28 14:34

    如果在序列模式中使用XADC它如何利用ADC?

    嗨,如果在序列模式中使用XADC它如何利用ADC?例如,如果我有3个频道; 2个Aux和1个温度?这些如何在ADC之间划分? AUX频道的采样率是多少?我可以使用独立的ADC模式,其中2aux将在一
    发表于 08-06 10:21

    TensorFlow逻辑回归处理MNIST数据

    本节基于回归学习对 MNIST 数据进行处理,但将添加一些 TensorBoard 总结以便更好地理解 MNIST 数据。MNIST由https://www.
    发表于 08-11 19:36

    TensorFlow逻辑回归处理MNIST数据

    本节基于回归学习对 MNIST 数据进行处理,但将添加一些 TensorBoard 总结以便更好地理解 MNIST 数据。MNIST由https://www.
    发表于 08-11 19:36

    高阶API构建模型和数据使用

    能拟合或逼近现实世界事物或现象的数学模型,故样本数据大,可以覆盖事物或现象所有特征时,可以越准确的识别事物,这也是大数据时代,数据是燃料的观点。T
    发表于 11-04 07:49

    如何用TensorFlow导入MNIST数据

    TensorFlow导入MNIST数据
    发表于 11-11 07:33

    如果在CAN高线或CAN低线中出现开路,为什么驱动系统数据总线会完全中断?

    如果在CAN高线或CAN低线中出现开路,为什么驱动系统数据总线会完全中断?
    发表于 05-09 10:55

    基于3D-CNN的无参考视频质量评价方法

    神经网络(3D-CNN)引入到了视频质量评价中,提出了一种基于3D-CNN的无参考视频质量评价方法,可以适用于非特定失真类型的NR-VQA.首先,通过3D块来有效学习和表征视频内容的时空特征,其次对常规的3D卷积网络模型进行改进,使其适用于视频质量评价
    发表于 01-03 10:18 2次下载

    如果在Zephyr内如何使用ESP32蓝牙

    在Zephyr ESP32 蓝牙驱动简析一文中简要分析了esp32 蓝牙如何集成进Zephyr,本文接着说明如果在Zephyr内使用ESP32蓝牙。 在Zepher中使用ESP32蓝牙比WIFI还要
    的头像 发表于 06-07 16:42 3168次阅读