Según la documentación de un modelo, existen dos formas equivalentes de crear un modelo: subclasificando la clase Model o usando la API funcional.

Cuando ejecuto el siguiente código a continuación, aparece un error. Por favor, dígame por qué es así. ¿No deberían los dos modelos ser idénticos?

import tensorflow as tf

class MyModel(tf.keras.Model):

  def __init__(self):
    super(MyModel, self).__init__()
    self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu)
    self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax)

  def call(self, inputs):
    #x= tf.keras.layers.Input(shape=(3,))(inputs)
    x = self.dense1(inputs)
    return self.dense2(x)

model = MyModel()

inputs = tf.keras.Input(shape=(3,))
x = tf.keras.layers.Dense(4, activation=tf.nn.relu)(inputs)
outputs = tf.keras.layers.Dense(5, activation=tf.nn.softmax)(x)
model_fun = tf.keras.Model(inputs=inputs, outputs=outputs)

model_fun.summary()
model.build((1,3,))
model.summary()

x= model_fun(tf.constant([[1,2,3]]))
y= model.call(tf.constant([[1,2,3]]))

assert((x.numpy()==y.numpy()).all())
0
user352102 22 ene. 2021 a las 22:54

2 respuestas

La mejor respuesta

Los pesos de las redes neuronales se inicializan al azar, por lo que no hay dos modelos idénticos que hagan la misma predicción exacta. Es decir, a menos que se inicialicen con los mismos pesos. Si establece la semilla aleatoria para la inicialización de pesos, los resultados serán los mismos:

self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu,
                  kernel_initializer=tf.initializers.GlorotUniform(seed=42))

Código completo:

import tensorflow as tf

class MyModel(tf.keras.Model):

  def __init__(self):
    super(MyModel, self).__init__()
    self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu,
                kernel_initializer=tf.initializers.GlorotUniform(seed=42))
    self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax,
                kernel_initializer=tf.initializers.GlorotUniform(seed=42))

  def call(self, inputs):
    x = self.dense1(inputs)
    return self.dense2(x)

model = MyModel()

inputs = tf.keras.Input(shape=(3,))
x = tf.keras.layers.Dense(4, activation=tf.nn.relu,
                kernel_initializer=tf.initializers.GlorotUniform(seed=42))(inputs)
outputs = tf.keras.layers.Dense(5, activation=tf.nn.softmax,
                kernel_initializer=tf.initializers.GlorotUniform(seed=42))(x)
model_fun = tf.keras.Model(inputs=inputs, outputs=outputs)

model_fun.summary()
model.build((1,3,))
model.summary()

x= model_fun(tf.constant([[1,2,3]]))
y= model.call(tf.constant([[1,2,3]]))

assert((x.numpy()==y.numpy()).all())
[[0.74651927 0.00897978 0.04163173 0.00992385 0.1929454 ]]
[[0.74651927 0.00897978 0.04163173 0.00992385 0.1929454 ]]
1
Nicolas Gervais 22 ene. 2021 a las 20:18

Cambia estas líneas:

  def call(self, inputs):
    # x= tf.keras.layers.Input(shape=(3,))(inputs)
    x = self.dense1(inputs)
    return self.dense2(x)
0
Andrey 22 ene. 2021 a las 19:56
65851897