javascript - WebWorker 中的 TensorflowJS 通用句子编码器
问题描述
尝试在 webworker 中运行 USE 以避免性能问题,但它缺少 embed() 方法。
网络工作者
importScripts('https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.2.9/dist/tf.min.js');
importScripts('https://cdn.jsdelivr.net/npm/@tensorflow-models/universal-sentence-encoder@1.1.1/dist/universal-sentence-encoder.min.js');
tf.setBackend('cpu');
onmessage = message => {
use.load().then(model => {
const sentences = [
'I like my phone.',
'Your cellphone looks great.'
];
/**
model = { model, tokenizer }
*/
model.embed(sentences).then(async embeddings => {
const vec = await embeddings.array();
const cosine = tf.losses.cosineDistance(vec[0], vec[1], 0);
const result = await cosine.data();
console.log(`${Math.round((1 - result) * 100)}%`);
});
});
}
模型内部没有 embed() 主线程
就是这种情况 甚至可以在 webworkers 中运行 USE 吗?
解决方案
通用句子编码器 (USE) 可用于网络工作者。请参阅下面的此工作片段,其中包含从工作线程发送到主线程的结果
<head>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.14.2/dist/tf.min.js"></script>
<script>
const worker_function = () =>
{
importScripts('https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.2.9/dist/tf.min.js');
importScripts('https://cdn.jsdelivr.net/npm/@tensorflow-models/universal-sentence-encoder@1.1.1/dist/universal-sentence-encoder.min.js');
tf.setBackend('cpu');
onmessage = message =>
{
console.log("from worker")
use.load().then(model =>
{
const sentences = [
'I like my phone.',
'Your cellphone looks great.'
];
model.embed(sentences).then(async embeddings =>
{
console.log(await embeddings)
const vec = await embeddings.array();
const cosine = tf.losses.cosineDistance(vec[0], vec[1], 0);
const result = await cosine.data();
console.log(`${Math.round((1 - result) * 100)}%`);
postMessage({res: cosine.dataSync(), shape: cosine.shape})
});
});
};
}
if (window != self)
worker_function();
</script>
<script>
const worker = new Worker(URL.createObjectURL(new Blob(["(" + worker_function.toString() + ")()"], { type: 'text/javascript' })));
worker.postMessage({});
worker.onmessage = (message) => {
console.log('from main thread')
const {data} = message
tf.tensor(message.data.res, message.data.shape).print()
}
</script>
</head>
推荐阅读
- python - uWSGI-tasks spooler 无法导入我的应用程序
- opencv - 将点从地图 A 转换为地图 B
- javascript - 如果数据很小,有没有办法缩放 c3.js 图?
- r - 在 R 中对多个编号的表进行操作
- python - 避免 OSError:[Errno 22] 读取()大文件时参数无效
- django - 创建并保存对象 IntegrityError django
- javascript - Javascript 仅在 MS Edge 上导致多个语法错误
- bash - Bash 波浪号在某些参数中没有扩展,例如 --home_dir=~
- c# - Sprache 中的递归表达式解析
- sql - 在 Case When Function 中具有非布尔结果