‘Ошибка значения: to_quantize может быть только последовательной или функциональной моделью tf.keras

#python #tensorflow #keras #tensorflow-lite #quantization

Вопрос:

Я попробовал реализовать QAT в своем сценарии обучения модели. Я использую функциональный API для создания модели.

Шаги, которые я выполнил для реализации QAT API,

  1. Постройте архитектуру модели
  2. Вставлена соответствующая функция quantize_model
  3. Обучите модель

Позвольте мне предоставить вам фрагмент кода для получения дополнительной информации

 from tensorflow.keras import regularizers
import numpy as np
from tensorflow.keras.models import Model
from tensorflow.keras.layers import TimeDistributed,SeparableConv1D,Dense,Embedding,Conv1D
from tensorflow.keras.layers import Input, Dropout, MaxPooling1D,Flatten, concatenate, BatchNormalization, AveragePooling1D
from tensorflow.keras.layers import LeakyReLU
from tensorflow.keras.utils import Progbar
from tensorflow.keras.constraints import non_neg , min_max_norm, max_norm , unit_norm
from tensorflow.keras.optimizers import Nadam
import tensorflow_model_optimization as tfmot
from tensorflow_model_optimization.python.core.quantization.keras import quantize


 words_input = Input(shape=(None,),dtype='int32',name='words_input')
 words = Embedding(input_dim=wordEmbeddings.shape[0], output_dim=wordEmbeddings.shape[1],  weights=[wordEmbeddings], trainable=False)(words_input)    
 ............
 convd_output= SeparableConv1D(kernel_size=4, filters=128, padding='same', activation='relu', strides=1, depth_multiplier=3, bias_regularizer=regularizers.l2(0.0001), kernel_constraint =min_max_norm(0.4,0.9))(output)

 convd_output=AveragePooling1D(pool_size=2, strides=1, padding='same')(convd_output)
 convd_output=Dropout(0.1)(convd_output)      
 flatten_output=TimeDistributed(Flatten())(convd_output)          
 
 output = TimeDistributed(Dense(len(label2Idx), activation='softmax'))(flatten_output)

 inputs_list=[words_input, casing_input,newline_input]
 model = Model(*inputs_list, output)
 q_aware_model = tfmot.quantization.keras.quantize_model(model)
 opt = Nadam(lr=0.0005)       
 q_aware_model.compile(loss='sparse_categorical_crossentropy', optimizer=opt,metrics = ['sparse_categorical_accuracy'])
 print(q_aware_model.summary())
 

Подробная информация о версии

тензорный поток==2.3.0

тензорный поток-модель-оптимизация==0.5.0

Проблема : Я использую функциональный API, который поддерживается в QAT API, но все равно получаю ошибку значения

quantize_model » to_quantize может быть только последовательной моделью tf.keras или ошибкой значения: to_quantize может быть только последовательной или функциональной моделью tf.keras.

Не смог разобраться в этой проблеме. Будет полезно, если кто-нибудь поможет преодолеть это. Заранее спасибо

Комментарии:

1. Добавьте импорт в свой вопрос.

2. @Dr. Snoopy Я добавил импорт

3. Не видя вашей полной модели, трудно отлаживать-возможно, что один из ваших входных данных не является входным слоем слоев keras, или у вас есть некоторая обработка тензора, не относящаяся к keras, в определении графика. Попробуйте распечатать свойство model._is_graph_network сразу после инициализации модели. Если это правда, то здесь есть ошибка в TFMOT.