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

    文章

    4771

    浏览量

    100743
  • 数据集
    +关注

    关注

    4

    文章

    1208

    浏览量

    24694

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

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

收藏 人收藏

    评论

    相关推荐

    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

    如何利用PyTorch API构建CNN?

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

    如果在序列模式中使用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块来有效学习和表征视频内容的时
    发表于 01-03 10:18 2次下载

    谷歌AI研发TensorFlow3D操作速度竟提高二十倍

    Google AI发布了TensorFlow 3D,将3D深度学习能力引入TensorFlow,加入3D稀疏卷积网络,在Waymo Open
    的头像 发表于 03-12 09:33 2267次阅读

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

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

    3D点云数据3D数字化技术的应用

    随着计算机视觉技术的不断发展,3D 数字化技术已经成为了当今工业制造领域和三维医学影像领域的关键技术。然而,构建高精度、高分辨率的 3D 点云数据
    的头像 发表于 05-06 16:46 1433次阅读

    如何在TensorFlow构建并训练CNN模型

    TensorFlow构建并训练一个卷积神经网络(CNN)模型是一个涉及多个步骤的过程,包括数据预处理、模型设计、编译、训练以及评估。下面
    的头像 发表于 07-04 11:47 924次阅读