我发现我可以在tensorflow.js中使用python训练的tensorflow
模型。
我用tensorflowjs_wizard
转换模型,并按照他们的指示。
结果,我得到了json
文件和bin
文件(这是js使用的模型文件)。
但是当我尝试使用这个模型时,我被一些逻辑命中卡住了。我使用pandas
数据框架来训练模型,并使用pandas
进行了一些测试和预测,但是如何在js中做到这一点?我自己做的,但有一些错误。
简而言之,我有这些问题。
-
如何在js中使用
model.predict()
?可以这样用吗?result = model.predict([1,2,3,4,5,6,7,8,9]);
-
.bin文件在这里做什么?删除这个可以吗?
-
我发现
loadLayerModel()
或loadGraphModel()
用于从文件加载模型,什么时候使用?
这里是HTML和js文件(如tensorflow.js教程)。
index . html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TensorFlow</title>
<!-- Import TensorFlow.js -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@2.0.0/dist/tf.min.js"></script>
<!-- Import the main script file -->
<script src="script.js" type="module"></script>
</head>
<body>
</body>
</html>
script.js
async function getData() {
const a = tf.tensor2d([1, 3, 0, 3, 3, 1, 2, 3, 2]);
return a;
}
async function run() {
const model = await tf.loadGraphModel('/json/model.json');
const tensor = getData();
const result = model.predict(tensor);
console.log(result);
}
document.addEventListener('DOMContentLoaded', run)
这是控制台错误信息。
tensor_ops.js:209 Uncaught (in promise) Error: tensor2d() requires shape to be provided when `values` are a flat/TypedArray
at Object.uy [as tensor2d] (tensor_ops.js:209)
at getData (script.js:3)
at HTMLDocument.run (script.js:9)
graph_executor.js:119 Uncaught (in promise) Error: Cannot compute the outputs [Identity] from the provided inputs []. Missing the following inputs: [dense_21_input]
at t.e.compile (graph_executor.js:119)
at t.e.execute (graph_executor.js:152)
at t.e.execute (graph_model.js:288)
at t.e.predict (graph_model.js:242)
at HTMLDocument.run (script.js:10)
文件夹树:
index.html
script.js
json/model.json
json/group1-shard1of1.bin
为了完成@Nikita的回答:
- 由于您的训练数据都是整型,因此模型期望整型数字。最好在训练时将它们转换为浮动。例如:
train = np.array(train).astype('float32')
train_labels = np.array(train_labels).astype('float32')
model.fit(train ,train_labels , epochs=20)
- 另一件可能很重要的事情是,由于您没有为最后一层定义激活函数,因此您可以在任何范围内进行预测,甚至是负数。最好将
from_logits=True
从损失函数中删除,并将activation=softmax
添加到最后一层:
model = tf.keras.Sequential([
tf.keras.layers.Dense(1,activation="relu"),
tf.keras.layers.Dense(100, activation="relu"),
tf.keras.layers.Dense(4,activation="softmax")
])
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
- 您将得到4个数字作为输出,如果您想获得类别索引,您可以在预测后使用
argmax
。修改代码可能是这样的:
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"> </script>
<script>
async function run(){
const MODEL_URL = 'http://127.0.0.1:8887/model.json';
const model = await tf.loadLayersModel(MODEL_URL);
console.log(model.summary());
const input = tf.tensor2d([1, 3, 0, 3, 3, 1, 2, 3, 2], [1,9]);
const result = await model.predict(input);
const res = await result.argMax(axis=1);
alert(res)
}
run();
</script>
</head>
<body></body>
</html>
.json
文件存储您的模型架构,.bin
文件存储您的模型的训练权值。你不能删除它。tf.loadLayersModel()
加载一个由层对象组成的模型,包括其拓扑结构和可选的权重。它的局限性是,这不适用于TensorFlowSavedModel
s或其转换形式。对于这些模型,您应该使用tf.loadGraphModel()
。
经过几个小时的社交,我发现这两个就是原因。
const a = tf.tensor2d([1, 3, 0, 3, 3, 1, 2, 3, 2],[1,9],'int32');
和
const tensor = await getData();
前者重塑输入数据。后者很重要,等待数据被读取。