我有一个 300*300 图像的数据集以及其中的对象框和标签。我想使用 SSD 网络来检测图像上的这些对象。我也想在移动设备上做到这一点,所以我需要最终的模型与 TF Mobile/Lite 兼容。问题是:我应该从哪里开始?
我知道 TF Mobile/Lite 支持 SSD(参见https://github.com/tensorflow/tensorflow/issues/15633例如,我认为 TF 不应该有经过训练的 SSD 模型,我只需要在我自己的数据集上进行训练。但我只能找到预先训练过的。我也找不到任何教程来解释如何在自己的数据集上训练现有模型。
所以,更准确地说:
如何在 tflite 模型中提供 2 个输入。
我建立了一个 tf 模型 => 转换为 tflite
text = tf.keras.Input((64), name="text")
intent = tf.keras.Input(shape=(25,), name="intent")
layer = tf.keras.layers.Embedding(dataset.vocab_size, 128, name="embedding_layer")(text)
layer = tf.keras.layers.LocallyConnected1D(256, kernel_size=1, strides=1, padding="valid", activation="relu")(layer)
layer = tf.keras.layers.SpatialDropout1D(0.1)(layer)
layer = tf.keras.layers.GlobalAveragePooling1D()(layer)
layer = tf.keras.layers.Dense(512, activation="relu")(layer)
layer = tf.keras.layers.Dropout(0.1)(layer)
layer = tf.keras.layers.concatenate([layer, intent])
output_layer = tf.keras.layers.Dense(units=dataset.max_labels, activation="softmax")(layer)
model = tf.keras.models.Model(inputs=[text, intent], outputs=[output_layer])
Run Code Online (Sandbox Code Playgroud)
我的模型有 2 个输入。
interpreter.get_input_details():
[{'name': 'text',
'index': 0,
'shape': array([ 1, 64], dtype=int32),
'shape_signature': array([ 1, 64], dtype=int32),
'dtype': numpy.float32,
'quantization': (0.0, 0), …Run Code Online (Sandbox Code Playgroud) 我从各种来源(主要来自官方文档)听说 Tensorflow Lite(针对 ARM)使用这三个库 - Ruy、Eigen、XNNPACK - 进行操作。
我知道它们以某种方式加速了 TF Lite 中的计算(主要是卷积),但我不确定每个库的用途是什么。我知道 Eigen 是一个 BLAS 库,但我不确定其他库是什么以及它们在 TF Lite 中如何相互关联。
有人愿意解释一下它们有哪些不同的用途以及它们如何在 TF Lite 中结合使用吗?(也许是调用堆栈?)
我一直在查看每个库的官方文档,但找不到 Ruy 和 XNNPACK 的更多详细信息。Ruy 说它提供了高效的矩阵乘法,但这不是 BLAS 库所做的吗?
目前,我在使用 C API 加载 tflite 模型时遇到以下错误:
错误:尝试将仅支持静态大小张量的委托与具有动态大小张量的图一起使用。
tflite 模型可以在此处找到。它是LEAF 模型的 tflite 转换。
经过检查,输入和输出张量似乎具有静态大小。我已经用 Netron 检查了模型,但找不到任何动态张量,但我可能忽略了。有没有办法查看哪些张量具体导致其动态张量出现问题?
我在模块 build.gradle 中的 gradle android 项目中有以下行
dependencies {
// a lot of dependencies
implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly-SNAPSHOT'
}
Run Code Online (Sandbox Code Playgroud)
并导致 gradle 构建失败并出现以下错误
Null extracted folder for artifact: ResolvedArtifact(componentIdentifier=org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly-SNAPSHOT:20210331.060351-75, variantName=null, artifactFile=C:\Users\USER\.gradle\caches\modules-2\files-2.1\org.tensorflow\tensorflow-lite-select-tf-ops\0.0.0-nightly-SNAPSHOT\b03a88bda4ad93e6fefe285f9ea303d28433eacc\tensorflow-lite-select-tf-ops-0.0.0-nightly-SNAPSHOT.aar, extractedFolder=null, dependencyType=ANDROID, isWrappedModule=false, buildMapping={__current_build__=C:\Users\USER\Desktop\Myapp2}, mavenCoordinatesCache=com.android.build.gradle.internal.ide.dependencies.MavenCoordinatesCacheBuildService$Inject@5c4450a)
Run Code Online (Sandbox Code Playgroud)
我在一个不同的项目中有相同的实现并且它有效,但在这个项目中这个错误不断出现。
是什么导致了这个错误?我该如何解决?
珍贵的是,我在 config.yaml 中设置了 EfficientDetLite4 模型“grad_checkpoint=true”。并且它已经成功生成了一些检查点。但是,当我想继续基于这些检查点进行训练时,我不知道如何使用这些检查点。
每次我训练模型时,它都会从头开始,而不是从检查点开始。
下图是我的colab文件系统结构:
下图显示了我的检查点存储的位置:
以下代码显示了我如何配置模型以及如何使用模型进行训练。
import numpy as np
import os
from tflite_model_maker.config import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import object_detector
import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')
from absl import logging
logging.set_verbosity(logging.ERROR)
train_data, validation_data, test_data =
object_detector.DataLoader.from_csv('csv_path')
spec = object_detector.EfficientDetLite4Spec(
uri='/content/model',
model_dir='/content/drive/MyDrive/MathSymbolRecognition/CheckPoints/',
hparams='grad_checkpoint=true,strategy=gpus',
epochs=50, batch_size=3,
steps_per_execution=1, moving_average_decay=0,
var_freeze_expr='(efficientnet|fpn_cells|resample_p6)',
tflite_max_detections=25, strategy=spec_strategy
)
model = object_detector.create(train_data, model_spec=spec, batch_size=3,
train_whole_model=True, validation_data=validation_data)
Run Code Online (Sandbox Code Playgroud) 我得到了MobileNet的经过预训练的.pb文件,发现它没有被量化,而完全量化的模型应该转换为.tflite格式。由于我不熟悉用于移动应用程序开发的工具,因此如何从.tflite文件中获得MobileNet的完全量化的权重。更准确地说,如何提取量化参数并查看其数值?
所以我用假量化训练了一个 tensorflow 模型,并用 .pb 文件作为输出将其冻结。现在我想将此 .pb 文件提供给 tensorflow lite toco 以进行完全量化并获取 .tflite 文件。
我正在使用这个 tensorflow 示例:https : //github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/experimental/micro/examples/micro_speech
我有疑问的部分:
bazel run tensorflow/lite/toco:toco -- \
--input_file=/tmp/tiny_conv.pb --output_file=/tmp/tiny_conv.tflite \
--input_shapes=1,49,43,1 --input_arrays=Reshape_1 --output_arrays='labels_softmax' \
--inference_type=QUANTIZED_UINT8 --mean_values=0 --std_values=2 \
--change_concat_input_ranges=false
Run Code Online (Sandbox Code Playgroud)
上面的部分调用 toco 并进行转换。请注意,Google 将 mean_values 设置为 0,std_values 设置为 2。他们是如何计算这两个值的?对于这个特定的模型,它被训练来识别单词“是”和“否”。如果我想识别 10 位数字,在这种情况下是否需要更改均值和标准值?我没有找到任何说明这部分的官方文档。任何帮助,将不胜感激。
我尝试将 TensorflowLite 与来自https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md 的ssdlite_mobilenet_v2_coco 模型一起使用,该模型转换为 tflite 文件,以从我的 Android 应用程序(java )。我执行
interpreter.run(input, output);
Run Code Online (Sandbox Code Playgroud)
其中输入是转换为 ByteBuffer 的图像,输出是浮点数组 - 大小 [1][10][4] 以匹配张量。
如何将此浮点数组转换为一些可读的输出?- 例如获取边界框坐标、对象名称、概率。
在转换和执行 keras 模型的 8 位量化时,我遇到了图像数据集没有发生的奇怪错误。
import tensorflow.python.keras.backend as K
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import load_model
import numpy as np
x_train = np.array([[0.6171875 0.59791666],[0.6171875 0.59791666],[0.6171875 0.59791666]])
y_train = np.array([[0.6171875 0.59791666],[0.6171875 0.59791666],[0.6171875 0.59791666]])
def representative_dataset_gen():
for i in range(1):
# Get sample input data as a numpy array in a method of your choosing.
sample = np.array([0.5,0.6])
sample = np.expand_dims(sample, axis=0)
yield [sample]
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(2,)),
tf.keras.layers.Dense(12, activation='relu'),
tf.keras.layers.Dense(2, activation='softmax')
])
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, …Run Code Online (Sandbox Code Playgroud) tensorflow-lite ×10
tensorflow ×8
python ×2
quantization ×2
android ×1
eigen ×1
google-coral ×1
gradle ×1
keras ×1