Недостающие веса в преобразованной модели

#python #tensorflow #keras #tensorflow.js #tensorflowjs-converter

Вопрос:

Я пытаюсь преобразовать модель Keras в модель tensorflow, а затем загрузить ее в собственное приложение React. Однако после преобразования часть веса, по-видимому, отсутствует. Создание модели и сохранение кода:

 import os
#from face_recognition import FaceRecognition
import keras_vggface
from mtcnn.mtcnn import MTCNN
from PIL import Image
from keras_vggface.utils import preprocess_input
from matplotlib import pyplot
from numpy import asarray
from keras_vggface.vggface import VGGFace
from scipy.spatial.distance import cosine
from tensorflow.keras.models import load_model


def get_embeddings(filenames):
    # extract faces
    faces = [extract_face(f) for f in filenames]
    # convert into an array of samples
    samples = asarray(faces, 'float32')
    # prepare the face for the model, e.g. center pixels
    samples = preprocess_input(samples, version=2)
    # create a vggface model
    model = VGGFace(model='resnet50', include_top=False, input_shape=(224, 224, 3), pooling='avg')
    # perform prediction
    yhat = model.predict(samples)
    return yhat, model

def is_match(known_embedding, candidate_embedding, thresh=0.5):
    # calculate distance between embeddings
    score = cosine(known_embedding, candidate_embedding)
    if score <= thresh:
        print('>face is a Match' % (score, thresh))
    else:
        print('>face is not a match' % (score, thresh))

if __name__ == '__main__':
    filenames = ["test1.jpg", "test2.jpg", "test3.jpg", "test4.jpg"]
    embeddings, model = get_embeddings(filenames);
    ahmed_id = embeddings[1];
    is_match(embeddings[0], embeddings[1])
    is_match(embeddings[2], embeddings[3])
    is_match(embeddings[1], embeddings[2])
    model.save("model", include_optimizer=True)
 

Модель хорошо работает на Python и точно предсказывает. Затем я использую tensorflowjs_wizard, чтобы преобразовать его в Javascript. Команда такова:

 tensorflowjs_converter --input_format=keras_saved_model --metadata= --quantize_uint8=* C:UsersuserDocumentsFace_Recognition_Tensorflowmodel .
 

В результирующей модели отсутствуют веса для определенных слоев. Когда я пытаюсь загрузить его в приложение React Native, я получаю следующую ошибку:

 [Unhandled promise rejection: Error: 212 of 265 weights are not set: conv1/7x7_s2/bn/gamma,conv1/7x7_s2/bn/beta, ...
 

Если я действительно открою файл model.json, я увижу, что в разделе определено 265 слоев model_config , но в разделе представлены только метаданные, относящиеся к 53 из них weightsManifest .

Есть какие-нибудь идеи о том, что я здесь делаю не так? Thanls

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

1. Для всех, кто попадает на этот пост, я не полностью решил проблему, но мне удалось проследить ее до того факта, что resnet50 модель содержит некоторые пользовательские слои, которые, похоже, не сохраняются должным образом. Возможно, информация на этой странице может быть использована для правильного сохранения модели. Я обошел проблему, используя вместо этого модель vgg16.