📜  Tensorflow.js tf.conv2d()函数

📅  最后修改于: 2022-05-13 01:56:28.511000             🧑  作者: Mango

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