почему тензор потока TFLiteConverter.from_session требует одинакового размера для ввода и вывода - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь использовать TFLiteConverter для преобразования моей сети.Поэтому я сначала попробовал пример кода.Оно работает.Но после некоторой модификации он отправляет обратно ошибку.Кажется, что input_array и output_array должны быть одинакового размера.Я просто не понимаю почему.Кто-нибудь может мне помочь?

Я изменил размер img с и размер var с [1,64,64,3 до [1,64,3,1]), полный код вставлен ниже enter code here

import tensorflow as tf

img = tf.placeholder(name="img", dtype=tf.float32, shape=(1, 64, 64, 1))
var = tf.get_variable("weights", dtype=tf.float32, shape=(1, 64, 3, 1))
val = tf.matmul(img,var)
out = tf.identity(val, name="out")

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(val.shape)
    converter = tf.lite.TFLiteConverter.from_session(sess, [img], [out])
    tflite_model = converter.convert()
    open("converted_model.tflite", "wb").write(tflite_model)

Сообщение об ошибке: ValueError: Размеры должны быть равны, но равны 1 и 3 для 'MatMul' (op: 'BatchMatMulV2') с входными формами: [1,64,64,1], [1,64,3,1].

1 Ответ

0 голосов
/ 26 сентября 2019

Проблема не в преобразовании TFLite, а в том, чтобы сначала построить граф.

tf.matmul работает с самыми внутренними двумерными матрицами в ваших тензорах.Таким образом, в вашем случае вы пытаетесь умножить матрицу матрицы формы 64x1 на матрицу размера 3x1, что недопустимо.Умножение матриц требует, чтобы столбцы первого операнда были равны строкам во втором операнде, но здесь 1 != 3, поэтому он не работает.

Например, замените 3 на 1тогда это будет работать:

import tensorflow as tf

img = tf.placeholder(name="img", dtype=tf.float32, shape=(1, 64, 64, 1))
var = tf.get_variable("weights", dtype=tf.float32, shape=(1, 64, 3, 1))
val = tf.matmul(img,var)
out = tf.identity(val, name="out")
...