Tensorflow.js tf.conv2d()函数
Tensorflow.js 是 Google 开发的一个 JavaScript 库,用于在浏览器或 Node.js 中运行和训练机器学习模型。
tf.conv2d()函数用于计算给定输入的二维卷积。在深度神经网络中,我们使用这个卷积层创建一个卷积核,当应用于输入层时会产生一个输出张量。
句法:
tf.conv2d (x, filter, strides, pad, dataFormat?,
dilations?, dimRoundingMode?)
参数:
- x:给出了一个 rank 3 和 rank 4 的张量,形状为 [batch, height, width, inChannels]。它可以是 3D 张量、4D 张量或类型化数组。
- 过滤器:过滤器等级为 4,形状参数 [filterHeight, filterWidth, inDepth, outDepth] 被传递。它需要是 4D 张量、嵌套数组或类型化数组。
- strides ([number, number]|number) :卷积的步幅:[strideHeight, strideWidth]。
- pad:填充算法的类型。
- 相同:无论过滤器大小如何,输出都将与输入大小相同。
- 有效:如果过滤器大于 1×1,输出将小于输入。
- 它也可以是一个数字或 conv_util.ExplicitPadding。
- dataFormat:在两个字符串中,它可以是:“NHWC”、“NCHW”。使用默认格式“NHWC”,数据存储顺序为:[batch, height, width, channels]。需要指定输入和输出数据的数据格式。这是可选的。
- dilations:膨胀率是两个整数元组,用于检查卷积的速率。[dilationHeight ,dilationWidth] 作为参数传递。这是可选的。
- dimRoundingMode:字符串格式将是“ceil”或“round”或“floor”。这是可选的。
示例 1:这里我们采用 4 维张量输入和另一个 4 维内核,然后应用卷积得到输出张量。形状也与输出张量一起打印。
Javascript
// Importing the tensorflow.js library
import * as tf from "@tensorflow/tfjs"
// Input tensor
const x = tf.tensor4d([[
[[2], [1], [2], [0], [1]],
[[1], [3], [2], [2], [3]],
[[1], [1], [3], [3], [0]],
[[2], [2], [0], [1], [1]],
[[0], [0], [3], [1], [2]], ]]);
console.log('Shape of the input:',x.shape);
// Kernel has been set
const kernel = tf.tensor4d([
[ [[2, 0.1]], [[3, 0.2]] ],
[ [[0, 0.3]], [[1, 0.4]] ],
]);
console.log('Shape of the kernel:',kernel.shape);
// Output tensor after convolution
let out = tf.conv2d(x, kernel,
strides = [1, 1, 1, 1], 'same');
out.print();
console.log('Shape of the output:',out.shape)
Javascript
// Define the model architecture
function buildModel() {
const model = tf.sequential();
// Add the model layers starting
// with convolution layers
model.add(tf.layers.conv2d({
inputShape: [28, 28, 1],
filters: 8,
kernelSize: 5,
padding: 'same',
activation: 'relu'
}));
model.add(tf.layers.maxPooling2d({
poolSize: 2,
strides: 2
}));
// Again we set another convolution layer
model.add(tf.layers.conv2d({
filters: 16,
kernelSize: 5,
padding: 'same',
activation: 'relu'
}));
model.add(tf.layers.maxPooling2d({
poolSize: 3,
strides: 3
}));
const numofClasses = 10;
model.add(tf.layers.flatten());
model.add(tf.layers.dense({
units: numofClasses,
activation: 'softmax'
}));
// Compile the model
model.compile({
optimizer: 'adam',
loss: 'categoricalCrossentropy',
metrics: ['accuracy']
});
return model;
}
const jsmodel = buildModel()
jsmodel.summary()
输出:
Shape of the input: 1,5,5,1
Shape of the kernel: 2,2,1,2
Tensor
[[[[10, 1.9000001],
[10, 2.2 ],
[6 , 1.6 ],
[6 , 2 ],
[2 , 1 ]],
[[12, 1.4 ],
[15, 2.2 ],
[13, 2.7 ],
[13, 1.7 ],
[6 , 0.3 ]],
[[7 , 1.7 ],
[11, 1.3 ],
[16, 1.3000001],
[7 , 1 ],
[0 , 0.3 ]],
[[10, 0.6 ],
[7 , 1.4 ],
[4 , 1.5 ],
[7 , 1.4000001],
[2 , 0.7 ]],
[[0 , 0 ],
[9 , 0.6 ],
[9 , 0.5 ],
[8 , 0.5 ],
[4 , 0.2 ]]]]
Shape of the output: 1,5,5,2
示例 2:卷积在设计深度学习模型的架构中起着重要作用。在此示例中,我们创建一个函数并在其中定义一个顺序模型。在此之后,我们使用tf.layers.conv2d()添加模型层,输入形状、过滤器、内核、填充作为其参数。然后在随后的最大池化、展平和编译之后,我们返回模型。
Javascript
// Define the model architecture
function buildModel() {
const model = tf.sequential();
// Add the model layers starting
// with convolution layers
model.add(tf.layers.conv2d({
inputShape: [28, 28, 1],
filters: 8,
kernelSize: 5,
padding: 'same',
activation: 'relu'
}));
model.add(tf.layers.maxPooling2d({
poolSize: 2,
strides: 2
}));
// Again we set another convolution layer
model.add(tf.layers.conv2d({
filters: 16,
kernelSize: 5,
padding: 'same',
activation: 'relu'
}));
model.add(tf.layers.maxPooling2d({
poolSize: 3,
strides: 3
}));
const numofClasses = 10;
model.add(tf.layers.flatten());
model.add(tf.layers.dense({
units: numofClasses,
activation: 'softmax'
}));
// Compile the model
model.compile({
optimizer: 'adam',
loss: 'categoricalCrossentropy',
metrics: ['accuracy']
});
return model;
}
const jsmodel = buildModel()
jsmodel.summary()
输出:
_________________________________________________________________
Layer (type) Output shape Param #
=================================================================
conv2d_Conv2D1 (Conv2D) [null,28,28,8] 208
_________________________________________________________________
max_pooling2d_MaxPooling2D1 [null,14,14,8] 0
_________________________________________________________________
conv2d_Conv2D2 (Conv2D) [null,14,14,16] 3216
_________________________________________________________________
max_pooling2d_MaxPooling2D2 [null,4,4,16] 0
_________________________________________________________________
flatten_Flatten1 (Flatten) [null,256] 0
_________________________________________________________________
dense_Dense1 (Dense) [null,10] 2570
=================================================================
Total params: 5994
Trainable params: 5994
Non-trainable params: 0
_________________________________________________________________
参考: https://js.tensorflow.org/api/3.6.0/#layers.conv2d