我写了一个简单的程序,用Tensorflow计算二次方程。现在,我想通过使用Tensorflow lite来转换在Coral开发板上运行的代码。
下面的代码显示了tflite-file的生成:
# Define and compile the neural network
model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')
# Provide the data
xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)
# Generation TFLite Model
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
# Save the TFLite-Model
with open('mobilenet_v2_1.0_224.tflite', 'wb') as f:
f.write(tflite_model)
这段代码运行在Coral Dev Board上:
# Load TFLite model and allocate tensors.
interpreter = tflite.Interpreter(model_path="mobilenet_v2_1.0_224.tflite")
interpreter.allocate_tensors()
# Get input and output tensors.
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# Test model on random input data.
xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=np.float32)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], xs, ys)
...
最后一行代码运行错误:
TypeError: set_tensor()接受3个位置参数,但是给出了4个
input_details[0]['index']'的输出:
{'name': 'serving_default_dense_input:0',
'index': 0,
'shape': array([1, 1], dtype=int32),
'shape_signature': array([-1, 1], dtype=int32),
'dtype': <class 'numpy.float32'>,
'quantization': (0.0, 0),
'quantization_parameters':
{'scales': array([], dtype=float32),
'zero_points': array([], dtype=int32),
'quantized_dimension': 0},
'sparsity_parameters': {}
}
我不明白错误的原因。有人知道吗?
您的错误如下。你正在传递一个字典给set_tensor方法。这意味着当python读取这行代码时。它会给你一个TypeError,因为你正在传递一个具有2个并发值的可交互对象。这就是你犯错的原因!
现在修复你的代码。首先,您需要理解set_tensor方法需要给定张量的索引。你目前在input_details[0]['index']
中传递的是完全不同的东西。你想传递的是张量的指标。正如你所显示的interpreter.get_input_details()
给出的数据显示的是0
。此外,您应该只定义给定数据中的一个的索引。要么是测试数据,要么是训练数据,两者不能同时使用。因此,消除xs
或ys
变量中的任何一个。重写这一行,像这样
interpreter.set_tensor(0, ys)
我希望这是正确的,通常也看一下文档是好的。因此,您了解了每个方法的期望https://www.tensorflow.org/api_docs/python/tf/lite/Interpreter#set_tensor
我的方法是错误的。x表示二次方程的x值,y表示二次方程的y值(结果值)。我不知道你不能在提弗莱特训练。不过还是谢谢你的努力。