奇怪的维度行为:需要维度 2 和维度 3 不确定为什么
Strange dimension behaviour: needs both dimension 2 and 3 unsure why
我正在尝试将一个简单的模型转换为 TFLite 并 运行 转换为以下尺寸问题。
我已经尝试过使用 perm=[1,0] 和 perm=[0,2,1],第一个将生成一个需要 3 个维度的错误,第二个将生成一个需要 2 个维度的错误。
import tensorflow as tf
captions = tf.keras.layers.Input(shape=[5,1024], name='captions')
cap_i = tf.keras.layers.Lambda(lambda q: q[0][:5,:])([captions])
cap_iT = tf.keras.layers.Lambda(lambda query:tf.transpose(query,
perm=[0,2,1]))(cap_i)
model = tf.keras.models.Model(inputs=[captions], outputs=[cap_iT])
model.save('my_model.hd5')
converter =
tf.lite.TFLiteConverter.from_keras_model_file('my_model.hd5')
tflite_model = converter.convert()
open("converted_modelfile.tflite", "wb").write(tflite_model)
ValueError: Dimension must be 2 but is 3 for 'lambda_1/transpose' (op: 'Transpose') with input shapes: [5,1024], [3].
您可能在两个不同的地方遇到错误。
您正在丢弃第一个 Lambda
和 q[0]
中的批量大小维度。你不应该这样做,你将需要 Keras 模型末尾的批次维度(可能是另一个错误的位置)。尽管您在列表中传递 [captions]
,但它可能会自动获取列表中的元素,因为它是单个张量。
你问题中的消息肯定在第二个 Lambda
中,你有一个二维张量 [5,1024]
(因为你在第一个 Lambda
中丢弃了批量大小) 并且您正在尝试使用 [0,2,1]
排列 3 个维度。
找到了一种使用 TFLite 中的兼容操作修复输入的好方法。
import tensorflow.compat.v1 as tf
import numpy as np
tf.disable_v2_behavior()
initial_input = tf.placeholder(dtype=tf.float32, shape=(None,5,1024))
cap_i = tf.strided_slice(initial_input, [0,0,0], [0,5,1024], [1,1,1], shrink_axis_mask=1)
cap_i_reshaped =tf.reshape(cap_i,[1,5,1024])
cap_iT = tf.transpose(cap_i_reshaped, perm=[0,2,1])
sess = tf.Session()
sess.run(tf.global_variables_initializer())
tf.io.write_graph(sess.graph_def, '', 'train.pbtxt')
converter = tf.lite.TFLiteConverter.from_session(sess, [initial_input], [cap_iT])
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS,
tf.lite.OpsSet.SELECT_TF_OPS]
tflite_model = converter.convert()
open('converted_model.tflite', "wb").write(tflite_model)
sess.close()
我正在尝试将一个简单的模型转换为 TFLite 并 运行 转换为以下尺寸问题。
我已经尝试过使用 perm=[1,0] 和 perm=[0,2,1],第一个将生成一个需要 3 个维度的错误,第二个将生成一个需要 2 个维度的错误。
import tensorflow as tf
captions = tf.keras.layers.Input(shape=[5,1024], name='captions')
cap_i = tf.keras.layers.Lambda(lambda q: q[0][:5,:])([captions])
cap_iT = tf.keras.layers.Lambda(lambda query:tf.transpose(query,
perm=[0,2,1]))(cap_i)
model = tf.keras.models.Model(inputs=[captions], outputs=[cap_iT])
model.save('my_model.hd5')
converter =
tf.lite.TFLiteConverter.from_keras_model_file('my_model.hd5')
tflite_model = converter.convert()
open("converted_modelfile.tflite", "wb").write(tflite_model)
ValueError: Dimension must be 2 but is 3 for 'lambda_1/transpose' (op: 'Transpose') with input shapes: [5,1024], [3].
您可能在两个不同的地方遇到错误。
您正在丢弃第一个 Lambda
和 q[0]
中的批量大小维度。你不应该这样做,你将需要 Keras 模型末尾的批次维度(可能是另一个错误的位置)。尽管您在列表中传递 [captions]
,但它可能会自动获取列表中的元素,因为它是单个张量。
你问题中的消息肯定在第二个 Lambda
中,你有一个二维张量 [5,1024]
(因为你在第一个 Lambda
中丢弃了批量大小) 并且您正在尝试使用 [0,2,1]
排列 3 个维度。
找到了一种使用 TFLite 中的兼容操作修复输入的好方法。
import tensorflow.compat.v1 as tf
import numpy as np
tf.disable_v2_behavior()
initial_input = tf.placeholder(dtype=tf.float32, shape=(None,5,1024))
cap_i = tf.strided_slice(initial_input, [0,0,0], [0,5,1024], [1,1,1], shrink_axis_mask=1)
cap_i_reshaped =tf.reshape(cap_i,[1,5,1024])
cap_iT = tf.transpose(cap_i_reshaped, perm=[0,2,1])
sess = tf.Session()
sess.run(tf.global_variables_initializer())
tf.io.write_graph(sess.graph_def, '', 'train.pbtxt')
converter = tf.lite.TFLiteConverter.from_session(sess, [initial_input], [cap_iT])
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS,
tf.lite.OpsSet.SELECT_TF_OPS]
tflite_model = converter.convert()
open('converted_model.tflite', "wb").write(tflite_model)
sess.close()