根据the documentation for a model,有两种等效的创建模型的方法:通过子类化 Model 类或使用函数式 API。
当我运行以下代码时,出现错误。请告诉我为什么会这样。两个模型不应该是一样的吗?
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 :(得分:1)
神经网络权重是随机初始化的,因此没有两个相同的模型可以做出相同的准确预测。也就是说,除非它们使用相同的权重进行初始化。如果为权重初始化设置随机种子,结果将是相同的:
self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu,
kernel_initializer=tf.initializers.GlorotUniform(seed=42))
完整代码:
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 :(得分:0)
更改这些行:
def call(self, inputs):
# x= tf.keras.layers.Input(shape=(3,))(inputs)
x = self.dense1(inputs)
return self.dense2(x)