Я квантую модель keras h5 до uint8. Чтобы получить полную кватизацию uint8, пользователь dtlam26 сообщил мне в this post, что репрезентативный набор данных уже должен быть в uint8, иначе входной слой все еще находится в float32.
Проблема в том, что если я загружаю данные uint8, я получаю следующую ошибку во время вызова converter.convert()
ValueError: невозможно установить тензор: получен тензор типа INT8, но ожидаемый тип FLOAT32 для входа 178, имя: input_1
Похоже, модель все еще ожидает float32. Итак, я проверил базовую предварительно обученную модель keras_vggface (отсюда) с
from keras_vggface.vggface import VGGFace
import keras
pretrained_model = VGGFace(model='resnet50', include_top=False, input_shape=(224, 224, 3), pooling='avg') # pooling: None, avg or max
pretrained_model.save()
и получившаяся модель h5 имеет входной слой с float32. Затем я изменил определение модели, используя uint8 в качестве входного dtype:
def RESNET50(include_top=True, weights='vggface',
...)
if input_tensor is None:
img_input = Input(shape=input_shape, dtype='uint8')
Но для int разрешен только int32. Однако использование int32 приводит к тому, что следующие уровни ожидают float32.
Кажется, это неправильный способ делать это вручную для всех слоев.
Почему моя модель во время квантования не использует данные uint8 и автоматически меняет вход на uint8?
Что я пропустил? Вы знаете решение? большое спасибо.