📜  Tensorflow.js tf.layers.timeDistributed()函数(1)

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

TensorFlow.js 中的 tf.layers.timeDistributed() 函数

tf.layers.timeDistributed() 函数是 TensorFlow.js 中的一个函数,用于在一个层上应用一个时间分布的层函数。 它可用于处理序列数据,其中每个时间步骤都需要相同的处理过程。

这个函数的输入是嵌入了时间维度的 3D 张量。它会在输入张量的第一维(时间维度)上应用传入的层,并返回一个相同形状的 3D 张量。它对于处理序列数据特别有用,例如处理视频或文本。

以下是一个示例代码,演示如何使用 tf.layers.timeDistributed() 函数:

const inputLayer = tf.layers.input({batchShape: [null, 7, 10]}); // 7个时间步骤,每个时间步输入张量形状为10 
const timeDistributedLayer = tf.layers.timeDistributed({ 
   layer: tf.layers.dense({units: 5, activation: 'relu'}), // 一个稠密层 
});
const output = timeDistributedLayer.apply(inputLayer); // 应用函数到输入张量

在上面的示例代码中,我们创建了一个输入层 inputLayer,这个层的形状为 (null, 7, 10),其中 null 表示任意的批次大小。我们接下来定义了一个 timeDistributedLayer,它包含一个稠密层 dense,这个稠密层有 5 个输出单元,且激活函数为 relu。我们然后通过调用 timeDistributedLayer.apply(inputLayer) 来将 timeDistributedLayer 应用到输入张量 inputLayer 上。

最终,output 张量的形状与 inputLayer 张量的形状相同 (null, 7, 5),其中 null 表示任意批次大小。output 张量的第一维代表时间步长(第二维长度为7),第三维长度为5表示每个时间步长的输出有5个值。

需要注意的是,输入层的时间步长(第一维)必须预先定义好,不过批次大小是动态的,并且在训练和推断时会改变。

下面是一个完整的实例代码,演示如何使用 tf.layers.timeDistributed() 函数对 MNIST 数据集进行训练和测试:

// 导入训练数据集与测试数据集
const [xTrain, yTrain] = getData();
const [xTest, yTest] = splitData(xTrain, yTrain);

// 创建模型
const model = tf.sequential();
model.add(tf.layers.input({batchShape: [null, 28, 28]})); // 28 * 28的输入张量,可训练
model.add(tf.layers.timeDistributed({ 
   layer: tf.layers.dense({units: 32, activation: 'relu', trainable: true}),
}));
model.add(tf.layers.timeDistributed({
  layer: tf.layers.dropout({rate: 0.5, trainable: true}),
}));
model.add(tf.layers.flatten()); // 所有时间步长的输出张量做扁平化
model.add(tf.layers.dense({units: 10, activation: 'softmax', trainable: true})); // 10个输出单元

// 定义损失函数和优化器
const loss = 'categoricalCrossentropy';
const optimizer = tf.train.adam();

// 编译与训练模型
model.compile({optimizer, loss, metrics: ['accuracy']});
await model.fit(xTrain, yTrain, {
    epochs: 20,
    batchSize: 128,
    validationData: [xTest, yTest],
});
console.log("Training complete.");

// 在测试集上评估模型
const evalOutput = model.evaluate(xTest, yTest);

console.log("Test set accuracy:", evalOutput[1]);

在上面的代码中,我们首先使用 getData() 函数和 splitData() 函数加载和处理 MNIST 数据集,然后构建了一个包括三个 timeDistributed() 层的模型。这个模型会对每个像素上的通道进行 32 通道输出的卷积操作,接着进行 50% 的丢弃,最后通过全连接层将输出映射到 10 个输出单元以给出分类结果。

我们接下来使用 adam 优化器和交叉熵损失函数编译模型,训练了 20 个周期,并在训练中设定了批次大小为 128,并在每个周期结束后对测试数据集进行验证。 最后,代码输出了测试集上的模型准确性。