Функциональный API модели Keras не работает с нетерпением - PullRequest
0 голосов
/ 26 марта 2020

У меня есть модель Keras, которую я хотел бы запустить с нетерпеливым исполнением в TensorFlow 2.0. Я считаю, что это означает, что, как только моя модель будет определена, строка print (model (input)) напечатает тензор с реальными значениями в нем. Мне нужно это, чтобы я мог использовать tf.GradientTape (). Градиент ()

import tensorflow as tf
from keras import layers
from keras.models import Model
from keras.regularizers import l2
import keras.backend as K
import keras.losses as losses
import numpy as np
def init_model(num_people):
        I = layers.Input(shape=(128,), name='classifier_input')
        h1 = layers.Dense(500, activation='relu', kernel_regularizer=l2(0.0001))(I)
        h2 = layers.BatchNormalization()(h1)
        d1 = layers.Dropout(.2)(h2)
        h3 = layers.Dense(500, activation='relu', kernel_regularizer=l2(0.0001))(d1)
        h4 = layers.BatchNormalization()(h3)
        d2 = layers.Dropout(.2)(h4)
        O = layers.Dense(num_people, activation='softmax', kernel_regularizer=l2(0.0001))(d2)
        model = Model(inputs=I,outputs=O)
        model.compile("Adam",
            loss="categorical_crossentropy",
            metrics = ['accuracy'])
        model.run_eagerly = True #a solution I found on github that didn't work

        print(model(tf.random.uniform((1,128))))
        return model

печатает "Тензор (" модель_1 / плотность_3 / Softmax: 0 ", форма = (1, 6), dtype = float32) "

Если я изменю код на

def init_model(num_people):
    I = tf.keras.layers.Input(shape=(128,), name='classifier_input')
    h1 = tf.keras.layers.Dense(500, activation='relu', kernel_regularizer=l2(0.0001))(I)
    h2 = tf.keras.layers.BatchNormalization()(h1)
    d1 = tf.keras.layers.Dropout(.2)(h2)
    h3 = tf.keras.layers.Dense(500, activation='relu', kernel_regularizer=l2(0.0001))(d1)
    h4 = tf.keras.layers.BatchNormalization()(h3)
    d2 = tf.keras.layers.Dropout(.2)(h4)
    O = tf.keras.layers.Dense(num_people, activation='softmax', kernel_regularizer=l2(0.0001))(d2)
    model = tf.keras.Model(inputs=I,outputs=O)
    model.compile("Adam",
        loss="categorical_crossentropy",
        metrics = ['accuracy'])
    model.run_eagerly = True

    print(model(tf.random.uniform((1,128))))
    return model

, он напечатает" tf.Tensor ([[6.0861025e-14 2.5630855e-11 7.6983024e-16 9.0180088e-13 1.0000000 e + 00 4.4134412e-20]], shape = (1, 6), dtype = float32) ", который можно дифференцировать с помощью tf.GradientTape (). градиент ()

К сожалению, это один из двух нейронных сетей, которые я использую, а другой - OpenFace, который я нашел вес и определение для онлайн (это с открытым исходным кодом). Он определен в Keras, а не в tf.keras, и кажется, что когда я делаю изменения в tf.keras, я больше не могу загружать сохраненные веса, но у меня нет возможности переучивать OpenFace. Итак, как я могу определить модель keras из keras.Model, которая сможет работать с большим энтузиазмом, в частности, чтобы я мог использовать tf.GradientTape (). Градиент ()? Я считаю, что если мне удастся запустить этот оператор print, то градиент тоже сработает.

Застрял ли я писать все по-старому с помощью сессий и заполнителей? Я не думаю, что смогу понять, как заставить OpenFace использовать tf.keras вместо Keras.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...