📜  TensorFlow.js 层卷积完整参考(1)

📅  最后修改于: 2023-12-03 15:35:18.160000             🧑  作者: Mango

TensorFlow.js 层卷积完整参考

TensorFlow.js 是一个强大的JavaScript库,它允许您使用JavaScript构建和训练深度学习模型。 它提供了许多不同类型的层,其中包括卷积层。 在本文中,我们将提供有关如何使用TensorFlow.js卷积层的完整参考。

引入TensorFlow.js

在使用TensorFlow.js之前,您需要将其引入到您的HTML文件中。 唯一的方法是通过scripts标签加载TensorFlow.js库:

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.9.0/dist/tf.js"></script>
创建一个卷积层

在TensorFlow.js中,创建卷积层可以通过使用tf.layers.conv2d()函数来完成。 它接受一个对象作为参数,该对象描述了卷积层的配置。 下面是一个卷积层对象的示例,其中包含了一些最常见的配置选项:

const conv2dLayer = tf.layers.conv2d({
  inputShape: [28, 28, 1],
  kernelSize: 5,
  filters: 8,
  strides: 1,
  activation: 'relu',
  kernelInitializer: 'varianceScaling'
});
卷积层配置选项

让我们仔细看看卷积层对象中的一些配置选项:

  • inputShape: 输入张量的形状。 它的格式是 [height, width, channels],其中 height 和 width 是输入图像的高度和宽度,channels 是输入特征图(或通道)的数量。 在本例中,它是一个28x28像素的黑白图像,因此它只有一个通道。
  • kernelSize: 图像内卷积核的大小(或窗口大小)。 它提供了一个形如 [height, width] 的数组,表示内核的高度和宽度。 在本例中,它是5x5像素的窗口。
  • filters: 卷积层中的过滤器数量。 它实际上是指卷积层中卷积核的数量,使用不同的过滤器可以提高模型的模式识别能力。
  • strides: 在图像上沿水平和垂直方向移动卷积核的步幅。 它提供了一个形如 [strideHeight, strideWidth] 的数组,它代表了内核在图像上沿高度和宽度方向移动的距离。 在本例中,它是1x1。
  • activation: 卷积层的激活函数。 在这个例子中,我们使用了ReLU作为激活函数。
  • kernelInitializer:内核权重的初始化方法。在这里,我们使用方差缩放(variance scaling)方法。
将卷积层应用于输入

在创建完卷积层对象之后,您需要将其应用于输入张量。 这可以通过使用layer.apply()函数完成。 下面是可以将卷积层应用于输入的示例代码:

const input = tf.ones([1, 28, 28, 1]); // 创建一个1x28x28x1的张量
const output = conv2dLayer.apply(input); // 将卷积层应用于输入

在这个例子中,我们创建了一个1x28x28x1的张量,代表一个28x28像素的黑白图像。然后我们将卷积层应用于输入。 卷积层将输出一个张量,代表加工后的特征。

卷积层输出张量的形状

卷积层输出张量的形状取决于输入张量的形状和卷积层的配置。 我们可以使用tensor.shape函数来查看张量的形状,如下所示:

console.log(output.shape); // 输出 [1, 24, 24, 8]

在这个例子中,输出张量的形状是 [1, 24, 24, 8]。 这里解释一下各个维度代表的含义:

  • 第一个维度是批量大小(batch size),在这个例子中是1。
  • 接下来的两个维度是输出特征图的高度和宽度,比输入图像的高度和宽度小了4个像素,这是由于我们使用的5x5卷积核的相应缘故。
  • 最后一个维度是输出通道数,它等于卷积层中过滤器(或卷积核)的数量。
卷积层示例代码

下面是一个完整的可以使用TensorFlow.js创建卷积层的示例代码。该代码首先创建了一个3层的CNN架构,用于对MNIST数据集进行分类。 它的架构如下:

  • 第一层:卷积层,16个卷积核,窗口大小为5x5像素,ReLU激活函数。
  • 第二层:最大池层,大小为2x2像素。
  • 第三层:卷积层,32个卷积核,窗口大小为5x5像素,ReLU激活函数。
  • 第四层:最大池层,大小为2x2像素。
  • 第五层:密集层,128个神经元,ReLU激活函数。
  • 第六层:密集层,10个神经元,softmax激活函数,用于输出分类预测结果。
// 加载MNIST数据集
const data = await tf.data.csv('https://storage.googleapis.com/tfjs-examples/mnist/data/train.csv');
const flattenedData = await data.map(record => {
  const cleaned = record.map(x => +x);
  return {
    xs: tf.tensor1d(cleaned.slice(1), 'float32').div(255),
    ys: tf.oneHot(cleaned[0], 10) 
  }
})
.repeat(10)
.shuffle(1000)
.batch(32);

// 创建CNN模型
const model = tf.sequential()
model.add(tf.layers.conv2d({
  inputShape: [28, 28, 1],
  kernelSize: 5,
  filters: 16,
  strides: 1,
  activation: 'relu',
  kernelInitializer: 'varianceScaling'
}));
model.add(tf.layers.maxPooling2d({poolSize: [2, 2], strides: [2, 2]}));
model.add(tf.layers.conv2d({
  kernelSize: 5, 
  filters: 32, 
  strides: 1, 
  activation: 'relu',
  kernelInitializer: 'varianceScaling'
}));
model.add(tf.layers.maxPooling2d({poolSize: [2, 2], strides: [2, 2]}));
model.add(tf.layers.flatten());
model.add(tf.layers.dense({
  units: 128, 
  activation: 'relu', 
  kernelInitializer: 'varianceScaling'
}));
model.add(tf.layers.dense({
  units: 10, 
  activation: 'softmax', 
  kernelInitializer: 'varianceScaling'
}));

// 训练模型
model.compile({
  optimizer: 'adam',
  loss: 'categoricalCrossentropy',
  metrics: ['accuracy']
});
await model.fitDataset(flattenedData, {
  epochs: 10,
  callbacks: {
    onEpochEnd: async (epoch, logs) => {
      console.log(`Epoch ${epoch}: loss = ${logs.loss.toFixed(4)}, accuracy = ${logs.acc.toFixed(4)}`);
    }
  }
})
结论

这篇完整的TensorFlow.js卷积层参考希望为您提供有关如何使用TensorFlow.js创建卷积层以及如何使用这些卷积层来构建深度学习模型的详细信息。 通过这篇指南,您将能够更好地理解TensorFlow.js的工作原理,并为您的下一个深度学习项目做好准备。