Python Tensorflow – tf.keras.layer.Conv3D()函数
在这篇文章中,我们将介绍Tensorflow tf.keras.layer.Conv3D()函数。
TensorFlow是一个免费和开源的机器学习库。TensorFlow是由谷歌大脑团队的研究人员和工程师创建的,作为谷歌机器智能研究小组的一部分,目的是进行机器学习和深度神经网络研究,尽管该技术足够广泛,可用于许多不同学科。
Conv2D和Conv3D的区别
让我们首先研究一下卷积到底是什么。在图像处理中,卷积是通过对整个图片上的每个像素及其局部邻居应用一个核来改变图像的技术。核是一个值矩阵,其大小和数值影响卷积过程的变换效果。然后,输出的大小将取决于以下几点:过滤器的数量、过滤器的空间扩展、跨度和零填充的数量。
卷积滤波器在一张图片上水平和垂直(在x和y方向)拖动,结果是Conv2D ,不管图片是灰度(1通道)、彩色(3通道)还是其他什么。唯一的区别是Conv2D过滤器现在需要在第三维度上有相同数量的内通道,而深度是三维卷积过程中的第三维度,卷积过滤器也是沿着这个维度移动的,因此一个2x2x2的过滤器在x、y和z方向上跨体积移动。在这种情况下,输入有三个以上的维度。
tf.keras.layer.Conv3D()函数用于在数据上应用三维卷积操作。该层通过用卷积核对层的输入进行卷积,生成一个输出的张量。
语法:
tf.keras.layers.Conv3D(
filters, kernel_size, strides=(1, 1, 1), padding='valid', data_format=None,
dilation_rate=(1, 1, 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)
输入形状:一个5+D形状的张量: batch_shape + (channels, conv_dim1, conv_dim2, conv_dim3)
输出形状:一个5+D的形状张量: batch_shape + (filters, new_conv_dim1, new_conv_dim2, new_conv_dim3)
参数:
- filters(整数): 输出空间的维度(即卷积中输出滤波器的数量)。
- kernel_size (Integer | [Integer,Integer,Integer]): 三维卷积窗口的深度、高度和宽度。
- strides (Integer | [Integer,Integer,Integer]): 每个维度上的卷积步长。
- data_format: 数据格式。这指定了输入中各尺寸的顺序。 channels_last是默认值。
- dilation_rate:在每个维度上,用于扩张卷积的扩张率。它应该是一个整数或一个三进制的列表/三元组。
- groups(整数): 一个正整数,表示输入沿通道轴被分成多少组。
- activation: 该层的激活函数。
- use_bias(布尔值): 如果该层有一个偏置向量,或没有。True是默认值。
- kernel_initializer: 卷积核权重矩阵的初始化器。
- bias_initializer: 偏压向量的初始化器。
- kernel_regularizer: 应用于内核权重矩阵的正则函数。
- bias_regularizer: 应用于偏置向量的正则函数。
- activity_regularizer: 应用于激活的正则函数。
- kernel_constraint: 卷积核权重的约束条件。
- bias_constraint: 偏差向量的约束。
返回:一个5+D的张量,代表激活(conv3d(inputs, kernel) + bias)。
示例 1:
在这个例子中,当使用这个层作为模型中的第一层时,提供关键字参数tensor_shape的整数,例如tensor_shape=(4, 28, 28, 28, 1)用于28x28x28的单通道卷,在data_format=”channels_last”。在Cov3D中,我们传递了filters=8,它负责空间维度,而kernel_size负责三维卷积窗口的深度、高度和宽度。之后,我们定义了models.Model函数,可以通过使用Model类,以最简单的方式创建。只有输入层和输出层需要被定义。model.pridict返回一个训练好的模型并预测一组新数据的标签。这个方法接受一个参数,(如model.predict(X)),并返回数组中每个对象的学习标签。
import tensorflow as tf
tensor_shape = (4, 28, 28, 28, 1)
input_shape = tensor_shape[1:]
X = tf.random.normal(tensor_shape)
def model(input_shape):
X_input = tf.keras.layers.Input(shape=input_shape)
X_output = tf.keras.layers.Conv3D(
filters=8, kernel_size=4, strides=2)(X_input)
model = tf.keras.models.Model(inputs=X_input, outputs=X_output)
return model
model = model(input_shape)
Y = model.predict(X, steps=4)
print(Y.shape)
输出:
(4, 13, 13, 13, 8)
示例 2:
在这个例子中,当使用这个层作为模型中的第一层时,提供整数的关键字参数tensor_shape,例如,tensor_shape=(1, 4, 4, 4, 1),用于4x4x4体积的单通道,在 data_format=”channels_last “中。在Cov3D中,我们传递了filters=3,它负责空间维度,而kernel_size负责三维卷积窗口的深度、高度和宽度。之后,我们定义了models.Model函数,可以通过使用Model类,以最简单的方式创建。只有输入层和输出层需要被定义。model.pridict返回一个训练好的模型并预测一组新数据的标签。这个方法接受一个参数,(如model.predict(X)),并返回数组中每个对象的学习标签。
import tensorflow as tf
tensor_shape = (1, 4, 4, 4, 1)
input_shape = tensor_shape[1:]
X = tf.random.normal(tensor_shape)
def model(input_shape):
X_input = tf.keras.layers.Input(shape=input_shape)
X_output = tf.keras.layers.Conv3D(
filters=3, kernel_size=3, strides=1)(X_input)
model = tf.keras.models.Model(inputs=X_input, outputs=X_output)
return model
model = model(input_shape)
Y = model.predict(X, steps=1)
print(Y)
输出:
[[[[[-1.2114613 0.576858 0.29229757]
[ 0.83879304 -0.20926164 0.8637264 ]]
[[ 0.03376093 0.1571547 0.13753639]
[-0.2992745 0.73341274 0.46030152]]]
[[[ 0.61261517 -0.1008687 -0.64397895]
[-0.5964341 -0.9971596 -0.18633988]]
[[ 1.5544158 0.27557844 -1.2441761 ]
[-0.21357535 0.51095605 -1.8175783 ]]]]]
三维MNIST数据集上的CNN
让我们利用上述知识来创建一个卷积神经网络。为此,我们使用了MNIST三维数据集。
第1步:让我们开始导入所有需要的库和数据集。之后我们将打印其中一个数组的形状,我们会注意到此刻的信息是浓缩的。
# Importing libraries
# Importing libraries
import h5py
import numpy as np
import tensorflow as tf
with h5py.File("full_dataset_vectors.h5", "r") as hf:
# Importing MNIST 3D dataset
X_train = hf["X_train"][:]
Y_train = hf["y_train"][:]
X_test = hf["X_test"][:]
Y_test = hf["y_test"][:]
print(X_train.shape)
输出:
(10000, 4096)
第2步:重塑数据集
# Reshaping dataset
X_train = X_train.reshape(X_train.shape[0], 1, 16, 16, 16)
X_test = X_test.reshape(X_test.shape[0], 1, 16, 16, 16)
print(X_train.shape)
print(Y_train.shape)
print(X_test.shape)
print(Y_test.shape)
输出:
(10000, 1, 16, 16, 16)
(10000,)
(2000, 1, 16, 16, 16)
(2000,)
步骤3:现在,在将数据集送入模型之前,我们将做一些数据预处理的步骤,如规范化和单次编码。
def data_preprocessing():
global X_train, X_test, Y_train, Y_test
X_train = X_train/255.0
X_test = X_test/255.0
Y_train = tf.keras.utils.to_categorical(Y_train)
Y_test = tf.keras.utils.to_categorical(Y_test)
num_classes = Y_train.shape[1]
return num_classes
num_classes = data_preprocessing()
第四步:现在,最后我们将创建模型,并将其适合于训练数据集。我在这里使用了一个非常基本的模型进行演示,包括一个Conv3D、MaxPool3D层和两个密集层。
def model(input_shape, num_classes):
X_input = tf.keras.Input(input_shape)
X = tf.keras.layers.Conv3D(filters=32, kernel_size=(
2, 2, 2), activation='relu', data_format='channels_first')(X_input)
X = tf.keras.layers.MaxPool3D(data_format='channels_first')(X)
X = tf.keras.layers.Dropout(rate=0.25)(X)
X = tf.keras.layers.Flatten()(X)
X = tf.keras.layers.Dense(128, activation='softmax')(X)
X = tf.keras.layers.Dropout(rate=0.5)(X)
X_output = tf.keras.layers.Dense(num_classes, activation='softmax')(X)
model = tf.keras.models.Model(inputs=X_input, outputs=X_output)
return model
model = model(X_train.shape[1:], num_classes)
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss='categorical_crossentropy', metrics='accuracy')
print(model.summary())
输出: