当前位置: 首页 > 知识库问答 >
问题:

ValueError:只有第1维度支持无。张量“flatbuffer_data”的形状“[None,None,1,512]”无效

翁烨霖
2023-03-14

我正在尝试将我的ensorflow模型(2.0)转换为ensorflow lite格式。我的模型有两个输入层,如下所示:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import load_model
from tensorflow.keras.layers import Lambda, Input, add, Dot, multiply, dot 
from tensorflow.keras.backend import dot, transpose, expand_dims
from tensorflow.keras.models import Model

r1 = Input(shape=[None, 1, 512], name='flatbuffer_data') # I want to take a variable amount of 
# 512 float embeddings from my flatbuffer, if the flatbuffer has 4, embeddings then it would
# be inferred as shape=[4, 1, 512], if it has a 100 embeddings, then it is [100, 1, 512].
r2 = Input(shape=[1, 512], name='query_embedding')

#Example code

minus_r1 = Lambda(lambda x: -x, name='invert_value')(r1)
subtracted = add([r2, minus_r1], name='embeddings_diff')

out1 = tf.argsort(subtracted)
out2 = tf.sort(subtracted)

model = Model([r1, r2], [out1, out2])

然后,我在层上执行一些张量操作,并将模型保存如下(没有训练,因此没有可训练的参数,只有一些线性代数操作,我想移植到android)

model.save('combined_model.h5')

我得到了我的tensorflow.h5模型,因此,当我尝试将其转换为tensorfflow lite时,我得到了以下错误:

import tensorflow as tf
model = tf.keras.models.load_model('combined_model.h5')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

#Error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/aspiring1/.virtualenvs/faiss/lib/python3.6/site-packages/tensorflow_core/lite/python/lite.py", line 446, in convert
    "invalid shape '{1}'.".format(_get_tensor_name(tensor), shape_list))
ValueError: None is only supported in the 1st dimension. Tensor 'flatbuffer_data' has invalid shape '[None, None, 1, 512]'.

我知道,在张量流1.x中,我们使用张量流占位符进行了动态和静态形状推断。张量流2.x中有类似的东西吗?另外,我也很欣赏张量流1.x中的解。

我读过的一些答案和博客可能会有所帮助:Tensorflow:如何保存/恢复模型?

了解张量流中的动态和静态形状

了解张量流形状

使用上面的第一个链接,我还尝试创建张量流1.x图,并尝试使用保存的模型格式保存它,但我没有得到所需的结果。

你可以在这里找到我的代码:ensorflow 1. x主旨代码

共有1个答案

帅雅逸
2023-03-14

完整代码: https://drive.google.com/file/d/1MN4-FX_-hz3y-UAuf7OTj_XYuVTlsSTP/view?usp=sharing

我知道我们在张量流1.x中使用张量流占位符进行了动态和静态形状推断。在张量流2.x中是否有类似物

这一切仍然有效。我认为问题在于tf。lite不处理动态形状。我认为它预先定位了所有张量,一次,然后重新使用它们(我可能错了)。

首先,这个额外的维度:

[无,无,1,512]

凯拉斯。输入始终包含一个批处理维度,tf.lite 可以处理未知的维度(此限制在 tf-nightly 中似乎很宽松)。

但是< code>lite似乎更喜欢批处理维度为1。如果您切换到:

r1 = Input(shape=[4], batch_size=None, name='flatbuffer_data')
r2 = Input(shape=[4], batch_size=1, name='query_embedding')

通过转换,但当您尝试执行 tflite 模型时仍然失败,因为该模型希望所有未知维度为 1

converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

i = tf.lite.Interpreter(model_content=tflite_model)
i.allocate_tensors()
i.get_input_details()

i.set_tensor(0, tf.constant([[0.,0,0,0],[1,1,1,1],[2,2,2,2]]))
i.set_tensor(1, tf.constant([[0.,0,0,0]]))
ValueError: Cannot set tensor: Dimension mismatch. Got 3 but expected 1 for dimension 0 of input 0.

使用< code>tf-nightly,您可以像编写时一样转换模型,但是由于未知维度被假定为1:

r1 = Input(shape=[None, 4], name='flatbuffer_data') 
r2 = Input(shape=[1, 4], name='query_embedding')

...

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

i = tf.lite.Interpreter(model_content=tflite_model)
i.allocate_tensors()
print(i.get_input_details())

i.set_tensor(0, tf.constant([[[0.,0,0,0],[1,1,1,1],[2,2,2,2]]]))
i.set_tensor(1, tf.constant([[[0.,0,0,0]]]))
ValueError: Cannot set tensor: Dimension mismatch. Got 3 but expected 1 for dimension 1 of input 0.

我认为您需要给数组一个比预期大的大小,并传递一个int值,告诉您的模型要分割多少个元素:

n = Input(shape=(), dtype=tf.int32, name='num_inputs')
r1 = Input(shape=[1000, 4], name='flatbuffer_data')
r2 = Input(shape=[4], name='query_embedding')

#Example code
x = tf.reshape(r1, [1000,4])
x = tf.gather(x, tf.range(tf.squeeze(n)))
minus_r1 = Lambda(lambda x: -x, name='invert_value')(x)
subtracted = add([r2, minus_r1], name='embeddings_diff')

out1 = tf.argsort(subtracted, name='argsort')
out2 = tf.sort(subtracted, name="sorted")

model = Model([r1, r2, n], [out1, out2])

然后它起作用了:

converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

i = tf.lite.Interpreter(model_content=tflite_model)
i.allocate_tensors()

for d in i.get_input_details():
  print(d)

a = np.zeros([1000, 4], dtype=np.float32)
a[:3] = [
          [0.,0,0,0],
          [1,1,1,1],
          [2,2,2,2]]

i.set_tensor(0, tf.constant(a[np.newaxis,...], dtype=tf.float32))
i.set_tensor(1, tf.constant([[0.,0,0,0]]))
i.set_tensor(2, tf.constant([3], dtype=tf.int32))

i.invoke()

print()
for d in i.get_output_details():
  print(i.get_tensor(d['index']))
[[ 0.  0.  0.  0.]
 [-1. -1. -1. -1.]
 [-2. -2. -2. -2.]]
[[0 1 2 3]
 [0 1 2 3]
 [0 1 2 3]]

OP在java解释器中尝试了这个,得到了:

java.lang.IllegalArgumentException: Internal error: Failed to apply delegate: Attempting to use a delegate that only supports static-sized tensors with a graph that has dynamic-sized tensors.

因此,我们还没有完全完成。

 类似资料:
  • 我培训了一个用于对象检测的定制MobileNetV2 SSD模型。我保存了.pb文件,现在我想将其转换为.tflite文件,以便与Coral edge tpu一起使用。 我在CPU上的Windows 10上使用Tensorflow 2.2。 我使用的代码是: 我尝试了其他线程提出的几个解决方案,也用tf-nightly,tf2.3进行了尝试 因为我是Tensorflow的新手,所以我有几个问题:输

  • 我是张量流和机器学习的新手。我正在尝试创建一个具有张量流的情感分析 NN。 我已经建立了我的体系结构,并试图训练模型,但我遇到了错误 ValueError:无法为具有形状'(?,100)'的张量'InputData/X: 0'提供形状(32,2)的值 我认为错误与我的输入“layer net=tflearn.input_data([None,100])”有关。我正在学习的教程建议使用这种输入形状,

  • 我正在尝试实现tensorflow回归模型,我的数据形状是train_X=(200,4)和train_Y=(200,)。我得到的形状错误,这是我的一段代码,请任何人都能提到我在哪里做错了。 df=pd。读取\u csv('all.csv') df=df。下降(“时间”,轴=1) 打印(df.descripe())#以了解数据集 列车Y=df[“功率”] 列车X=df。下降('功率',轴=1) 列车

  • 我完成了对我的模型的培训,该模型由20个类组成,精度达到0.9993,目前正在进行测试。我正在学习本教程,但我在 培训数据定义为: 这就是我对cnn的定义 这里也是我对我的模型的总结 我得到的错误是 ---------------------------------------------------------------------------中的ValueError回溯(最近一次调用)---

  • 我正在尝试对血液的图像数据及其spo2值(血液中的氧气百分比)进行分类,spo2值有4类 模型的输出将是spo2的百分比 模型架构 拟合模型时出现错误

  • Checks whether NO elements in this sequence satisfy the given predicate (the opposite of Sequence#all, basically). Signature Sequence.none = function(predicate) { /*...*/ } Sequence.none = function no