【发布时间】:2021-07-15 11:50:30
【问题描述】:
编辑 使用图形模型格式和更新的代码示例,我设法让它返回一个预测。问题是现在它总是返回 1,无论我输入哪个图像,所以想知道我是否没有传递正确的图像数据?
第二次编辑:改变了我传递 img 对象的方式,但我输入的每张图片仍然得到 1。
我才刚刚开始研究 tensorflowjs,并且正在使用我已经获得访问权限的预构建 keras 模型。该模型是一个二元分类器。该模型已保存为.h5 文件,我被要求使用 tensorflowjs 在浏览器中运行它并做出反应。本质上,我想从本地存储或 sd 卡中选择图像并将其提供给模型以获得 yes 或 no 分类。
我已按照 tensorflowjs docs 将 keras 模型转换为 TF.js 层格式,但无法加载模型。我收到关于 unknown layer: RandomFlip 的错误。因此,我尝试将模型转换为图形模型,因为我找不到错误的解决方案,并想尝试一下。这加载了模型,但是在给它提供图像时出现了更多问题。 The shape of dict['image_tensor'] provided in model.execute(dict) must be [-1,380,380,1], but was [380, 380] 。然后我搜索了它并将其调整为 [-1,380,380,1] ,但后来它抱怨尺寸不是预期的,所以我想我可能在前面的一些步骤中搞砸了。
为了转换为图形模型,我使用了以下命令:tensorflowjs_converter --input_format keras --output_format tfjs_layers_model /Users/myUser/Documents/save_at_45.h5 /Users/myUser/Documents/convert-keras-model,并在我的代码中使用loadGraphModel 方法加载它。遵循这条路径至少允许我加载模型。
我还尝试使用tensorflowjs_converter --input_format keras --output_format tfjs_layers_model /Users/myUser/Documents/save_at_45.h5 /myUser/mariomendes/Documents/convert-keras-model 将其转换为图层格式,并在我的代码中使用loadLayersModel 加载它。这将返回错误 Unknown layer: RandomFlip。我已经尝试寻找解决方案,但一直找不到。
知道它是.h5 文件是否意味着我应该知道它是否需要转换为 tf Graph 格式或 Layers 格式,或者是否有其他东西可以确定它应该转换为哪种格式?
我已将转换后的模型以两种格式存储,它的权重在 S3 中,并从那里获取。
对于我的反应代码,我做了以下事情:
import React, { useState, useEffect } from "react";
import "./index.css";
import * as tf from "@tensorflow/tfjs";
function ImgImporter() {
const [file, setFile] = useState(null);
const [model, setModel] = useState(null);
const [processing, setProcessing] = useState(false);
const [prediction, setPrediction] = useState(null);
const [imageLoaded, setImageLoaded] = useState(false);
function readImage(file) {
return new Promise((rs, rj) => {
const fileReader = new FileReader();
fileReader.onload = () => rs(fileReader.result);
fileReader.onerror = () => rj(fileReader.error);
fileReader.readAsDataURL(file);
});
}
async function handleImgUpload(event) {
const {
target: { files },
} = event;
const _file = files[0];
const fileData = await readImage(_file);
setFile(fileData);
setProcessing(true);
}
useEffect(() => {
async function loadModel() {
if (!model) {
const _model = await tf.loadGraphModel("/model.json");
setModel(_model);
}
}
loadModel();
});
useEffect(() => {
async function predict() {
if (imageLoaded && file) {
const imageElement = document.createElement("img");
imageElement.src = file;
imageElement.onload = async () => {
const tensor = tf.browser
.fromPixels(imageElement, 1)
.resizeNearestNeighbor([380, 380])
.expandDims()
.toFloat();
const prediction = await model.predict(tensor).data();
setPrediction(parseInt(prediction, 10));
setProcessing(false);
setImageLoaded(false);
};
}
}
predict();
}, [imageLoaded, model, file]);
return (
<div className="File-input-container">
<form className="Form">
<label htmlFor="upload-image">Upload image</label>
<input
id="image-selector"
type="file"
name="upload-image"
accept="image/*"
className="File-selector"
onChange={handleImgUpload}
disabled={!model || processing}
/>
</form>
<div className="Img-display-container">
<img
onLoad={() => {
setImageLoaded(true);
}}
alt=""
src={file}
/>
</div>
<div className="Img-processing-container">
{processing ? (
<p>Loading ...</p>
) : prediction !== null ? (
<div>
<p>{prediction === 1 ? "Yes" : "No"}</p>
</div>
) : null}
</div>
</div>
);
}
export default ImgImporter;
当我上传图片时,这将在控制台中返回以下结果作为预测值:
dataId: {id: 195}
dtype: "float32"
id: 94
isDisposedInternal: false
kept: false
rankType: "2"
scopeId: 6
shape: (2) [1, 1]
size: 1
strides: [1]
如果有人能对此有所了解或帮助我找到正确的方向,那就太好了。
【问题讨论】:
标签: reactjs tensorflow keras tensorflow.js