У меня есть модель 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.