📅  最后修改于: 2023-12-03 15:35:17.436000             🧑  作者: Mango
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,并在每个周期结束后对测试数据集进行验证。 最后,代码输出了测试集上的模型准确性。