- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 android 构建一个离线翻译器。我的模型深受本指南的启发:https://www.tensorflow.org/tutorials/text/nmt_with_attention .我只是做了一些修改以确保模型是可序列化的。 (你可以在最后找到模型的代码)
该模型在我的 jupyter 笔记本上完美运行。我正在使用 Tensorflow 版本:2.3.0-dev20200617,我还能够使用以下代码段生成 tflite 文件:
converter = tf.lite.TFLiteConverter.from_keras_model(partial_model)
tflite_model = converter.convert()
with tf.io.gfile.GFile('goog_nmt_v2.tflite', 'wb') as f:
f.write(tflite_model)
但是,当我使用生成的 tflite 模型在 android 上进行预测时,它会抛出错误
java.lang.IllegalArgumentException: Internal error: Failed to run on the given Interpreter: tensorflow/lite/kernels/concatenation.cc:73 t->dims->data[d] != t0->dims->data[d] (8 != 1) Node number 84 (CONCATENATION) failed to prepare.
这很奇怪,因为我提供的输入尺寸与我在 jupyter notebook 中所做的完全相同。这是用于测试(虚拟输入)模型是否在 android 上运行的 java 代码:
HashMap<Integer, Object> outputVal = new HashMap<>();
for(int i=0; i<2; i++) outputVal.put(i, new float[1][5]);
float[][] inp_test = new float[1][8];
float[][] enc_hidden = new float[1][1024];
float[][] dec_input = new float[1][1];
float[][] dec_test = new float[1][8];
tfLite.runForMultipleInputsOutputs(new Object[] {inp_test,enc_hidden, dec_input, dec_test},outputVal);
这是我的 gradle 依赖项:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly'
// This dependency adds the necessary TF op support.
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
正如错误所指出的,节点 84 处的尺寸有问题。所以我继续使用 Netron 可视化 tflite 文件。我已经放大了连接节点,您可以找到节点的图片以及输入和输出维度
here .您可以找到整个生成的图
here .
t->dims->data[d] != t0->dims->data[d]
的错误是什么意思?什么是d?
Tx = 8
def Partial_model():
outputs = []
X = tf.keras.layers.Input(shape=(Tx,))
partial = tf.keras.layers.Input(shape=(Tx,))
enc_hidden = tf.keras.layers.Input(shape=(units,))
dec_input = tf.keras.layers.Input(shape=(1,))
d_i = dec_input
e_h = enc_hidden
X_i = X
enc_output, e_h = encoder(X, enc_hidden)
dec_hidden = enc_hidden
print(dec_input.shape, 'inp', dec_hidden.shape, 'dec_hidd')
for t in range(1, Tx):
print(t, 'tt')
# passing enc_output to the decoder
predictions, dec_hidden, _ = decoder(d_i, dec_hidden, enc_output)
# outputs.append(predictions)
print(predictions.shape, 'pred')
d_i = tf.reshape(partial[:, t], (-1, 1))
print(dec_input.shape, 'dec_input')
predictions, dec_hidden, _ = decoder(d_i, dec_hidden, enc_output)
d_i = tf.squeeze(d_i)
outputs.append(tf.math.top_k(predictions, 5))
return tf.keras.Model(inputs = [X, enc_hidden, dec_input, partial], outputs = [outputs[0][0], outputs[0][1]])
class Encoder():
def __init__(self, vocab_size, embedding_dim, enc_units, batch_sz):
self.batch_sz = batch_sz
self.enc_units = enc_units
self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)
self.gru = tf.keras.layers.GRU(self.enc_units,
return_sequences=True,
return_state=True,
recurrent_initializer='glorot_uniform')
def __call__(self, x, hidden):
x = self.embedding(x)
output, state = self.gru(x, initial_state = hidden)
print(output.shape, hidden.shape, "out", "hid")
return output, state
def initialize_hidden_state(self):
return tf.zeros((self.batch_sz, self.enc_units))
class BahdanauAttention():
def __init__(self, units):
self.W1 = tf.keras.layers.Dense(units)
self.W2 = tf.keras.layers.Dense(units)
self.V = tf.keras.layers.Dense(1)
def __call__(self, query, values):
# query hidden state shape == (batch_size, hidden size)
# query_with_time_axis shape == (batch_size, 1, hidden size)
# values shape == (batch_size, max_len, hidden size)
# we are doing this to broadcast addition along the time axis to calculate the score
print(query.shape, 'shape')
query_with_time_axis = tf.expand_dims(query, 1)
# score shape == (batch_size, max_length, 1)
# we get 1 at the last axis because we are applying score to self.V
# the shape of the tensor before applying self.V is (batch_size, max_length, units)
print("2")
score = self.V(tf.nn.tanh(
self.W1(query_with_time_axis) + self.W2(values)))
print("3")
# attention_weights shape == (batch_size, max_length, 1)
attention_weights = tf.nn.softmax(score, axis=1)
# context_vector shape after sum == (batch_size, hidden_size)
context_vector = attention_weights * values
context_vector = tf.reduce_sum(context_vector, axis=1)
return context_vector, attention_weights
class Decoder():
def __init__(self, vocab_size, embedding_dim, dec_units, batch_sz):
self.dec_units = dec_units
self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)
self.gru = tf.keras.layers.GRU(self.dec_units,
return_sequences=True,
return_state=True,
recurrent_initializer='glorot_uniform')
self.fc = tf.keras.layers.Dense(vocab_size)
# used for attention
self.attention = BahdanauAttention(self.dec_units)
def __call__(self, x, hidden, enc_output):
# enc_output shape == (batch_size, max_length, hidden_size)
context_vector, attention_weights = self.attention(hidden, enc_output)
print(context_vector.shape, 'c_v', attention_weights.shape, "attention_w")
# x shape after passing through embedding == (batch_size, 1, embedding_dim)
x = self.embedding(x)
# x shape after concatenation == (batch_size, 1, embedding_dim + hidden_size)
print(x.shape, 'xshape', context_vector.shape, 'context')
expanded_dims = tf.expand_dims(context_vector, 1)
x = tf.concat([expanded_dims, x], axis=-1)
# passing the concatenated vector to the GRU
output, state = self.gru(x)
# output shape == (batch_size * 1, hidden_size)
output = tf.reshape(output, (-1, output.shape[2]))
# output shape == (batch_size, vocab)
x = self.fc(output)
return x, state, attention_weights
最佳答案
您可以在 python notebook 中加载生成的 .tflite 文件,并传递与 Keras 模型相同的输入。您必须查看准确的输出,因为在模型转换期间不会损失准确性。如果那里有问题......在android操作过程中会有问题。如果没有……一切都会好起来的。使用 Tensorflow 指南中的以下代码在 Python 中运行推理:
import numpy as np
import tensorflow as tf
# Load the TFLite model and allocate tensors.
interpreter = tf.lite.Interpreter(model_path="converted_model.tflite")
interpreter.allocate_tensors()
# Get input and output tensors.
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# Test the model on random input data.
input_shape = input_details[0]['shape']
input_data = np.array(np.random.random_sample(input_shape), dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
# The function `get_tensor()` returns a copy of the tensor data.
# Use `tensor()` in order to get a pointer to the tensor.
output_data = interpreter.get_tensor(output_details[0]['index'])
print(output_data)
快乐编码!
关于tensorflow - 由于内部错误,无法在解释器上运行 tflite 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62627157/
我正在尝试将我使用 Keras 定义的网络转换为 tflite。网络如下: model = tf.keras.Sequential([ # Embedding tf.k
您使用的模型的顶级目录是什么 :/home/USER/PROJECT/tf-models 我是否编写了自定义代码(而不是使用 TensorFlow 中提供的股票示例脚本) : 否 操作系统平台和发行版
我刚刚使用 Google AutoML 训练了一个单标签图像分类模型,但未能在 Android 手机中使用它。我修改了代码并将我的自定义模型替换为来自 https://github.com/tenso
我正在尝试将经过训练的模型从检查点文件转换为 tflite .我正在使用 tf.lite.LiteConverter .浮点转换顺利进行,推理速度合理。但是INT8的推理速度转换非常慢。我试图通过输入
我试图将 albert 的 .pb 模型转换为 tflite 我使用https://github.com/google-research/albert制作了.pb模型在 tf 1.15 中 我用过tc
我有一个用 Tensorflow.Keras 编写的自定义神经网络,并应用 Hard-swish 函数作为激活(如 MobileNetV3 论文中使用的那样): 实现: def swish(x):
我正在尝试使用来自 TensorFlow for Poets 2 的移动网络传输学习示例进行图像分类的 TFLite 实现 我能够使用代码实验室中的四个花卉样本成功完成迁移学习并获得以下屏幕 这是正在
我是 tensorflow 的新手,我正在尝试将我的 .pb(原型(prototype)缓冲区)文件转换为精简版。但我面临一些问题。import time,sys,warnings,glob,rand
我尝试通过 TFLite 将我的模型 (pb) 转换为精简版。这是我的代码: import tensorflow as tf graph_def_file = "./graph.pb" input_a
有了经过训练的“.h5”Keras 模型文件,我正在尝试优化推理时间: 探索了 2 个选项: 通过 TensorRT 加速推理 'int8' 量化。 此时我可以将模型文件转换为 TensorFlow
我有一个简单的网络,我已经使用 tensorflow 进行了剪枝和量化。我专门按照本教程在我的网络上应用: https://www.tensorflow.org/model_optimization/
我正在加载 this python中的对象检测模型。我可以使用以下代码行加载它: import tflite_runtime.interpreter as tflite model_path = 'p
好的,所以在我的应用程序中,我正在尝试使用人脸网络模型来实现人脸识别,该模型转换为 tflite,平均约为 93 MB, 但是这个模型最终会增加我的 apk 的大小。 所以我正在尝试寻找替代方法来解决
我得到了 MobileNet 的预训练 .pb 文件,发现它没有被量化,而完全量化的模型应该转换成 .tflite 格式。由于我不熟悉移动应用程序开发工具,我如何从 .tflite 文件中获取 M
我想知道是否有办法知道 tflite 中特定节点的输入和输出列表?我知道我可以获得输入/输出详细信息,但这不允许我重建解释器内部发生的计算过程。所以我要做的是: interpreter = tf.li
我对 TensorFlow 和 TensorFlow Lite 相当陌生。我已遵循有关如何使用 toco 量化模型并将模型转换为定点计算的教程。现在我有一个 tflite 文件,它应该只执行定点操作。
我从姿势估计 tflite 模型开始,用于获取人类的关键点。 https://www.tensorflow.org/lite/models/pose_estimation/overview 我开始拟合
我正在使用here中的posenet tflite模型。它接受输入 1*353*257*3 输入图像并返回 4 个尺寸为 1*23*17*17、1*23*17*34、1*23*17*64 和 1*23
我已经阅读了多个代码实验室,在这些代码实验室中,Google 对属于一类的图像进行了分类。如果我需要使用 2 个或更多类怎么办?比如我想对一张图片是水果还是蔬菜进行分类,然后分类是水果还是蔬菜。 最佳
目前,我正在尝试制作一个 Android 食品识别应用程序。我设法构建了一个应用程序来处理图像并在“mobilenet_quant_v1_224.tflite”预训练模型上运行。一切正常,现在我想将自
我是一名优秀的程序员,十分优秀!