Python TF2/Keras:加载自定义模型
我正在不断地训练一个定制的keras模型。我已经像这样覆盖了这个方法Python TF2/Keras:加载自定义模型,python,tensorflow,keras,tensorflow2.0,Python,Tensorflow,Keras,Tensorflow2.0,我正在不断地训练一个定制的keras模型。我已经像这样覆盖了这个方法 class MyModel(keras.models.Model): def train_step(self, data): # doing my magic and returning metrics 训练就像一种魅力,能给你带来高分(是啊!)。然后我通过model.save进入tf文件夹。我想在收集更多数据后继续培训 然后我通过 model = keras.models.load_model(s
class MyModel(keras.models.Model):
def train_step(self, data):
# doing my magic and returning metrics
训练就像一种魅力,能给你带来高分(是啊!)。然后我通过model.save
进入tf文件夹。我想在收集更多数据后继续培训
然后我通过
model = keras.models.load_model(saved_model)
然而,现在的模型是
tensorflow.python.keras.engine.functional.Functional
而不是
MyModel
并且缺少自定义的训练步骤
方法。当然,当我在加载的模型上调用fit
时,一切都会中断。如何在TF2/keras中正确加载自定义模型
//编辑:示例代码
#!/usr/bin/env python3
from tensorflow import keras
from tensorflow.keras import layers
import tensorflow as tf
class MyModel(keras.Model):
def train_step(self, data):
x, y_true = data
with tf.GradientTape() as tape:
y_pred = self(x, training=True)
loss = tf.losses.mean_squared_error(y_true['a'], y_pred['a'])
loss += tf.losses.mean_squared_error(y_true['b'], y_pred['b'])
trainable_vars = self.trainable_variables
gradients = tape.gradient(loss, trainable_vars)
self.optimizer.apply_gradients(zip(gradients, trainable_vars))
return {'loss': loss}
def get_model():
input = layers.Input(shape=(20, 1))
x = layers.Conv1D(10, 3, activation='relu')(input)
x = layers.Conv1D(20, 5, activation='relu')(x)
x = layers.Conv1D(30, 7, activation='relu')(x)
x = layers.GlobalMaxPool1D()(x)
x_a = layers.Dense(2)(x)
x_b = layers.Dense(3)(x)
return MyModel(input, {'a': x_a, 'b': x_b}, name='MyModel')
def data_gen(n=640):
for _ in range(n):
features = tf.random.uniform(shape=(20, 1))
labels = {
'a': tf.random.uniform(shape=(2,), minval=0, maxval=2, dtype=tf.float32),
'b': tf.random.uniform(shape=(3,), minval=-1, maxval=0, dtype=tf.float32),
}
yield features, labels
ds = tf.data.Dataset.from_generator(data_gen, output_types=(tf.float32, {'a': tf.float32, 'b': tf.float32}), output_shapes=((20, 1), {'a': (2,), 'b': (3,)}))
ds = ds.batch(64)
model = get_model()
model.compile('adam')
print(model)
model.summary()
model.fit(ds, epochs=5)
model.save('/tmp/mymodel')
# load
model = keras.models.load_model('/tmp/mymodel')
print(model)
model.summary()
model.fit(ds, epochs=5)
执行此操作时,我可以使用自定义train_步骤训练模型。但加载保存的模型后,列车步骤丢失,无法正确处理输出。因此,它抱怨:
Epoch 1/5
Traceback (most recent call last):
File "./example.py", line 63, in <module>
model.fit(ds, epochs=5)
File "/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 108, in _method_wrapper
return method(self, *args, **kwargs)
File "/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1098, in fit
tmp_logs = train_function(iterator)
File "/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py", line 780, in __call__
result = self._call(*args, **kwds)
File "/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py", line 823, in _call
self._initialize(args, kwds, add_initializers_to=initializers)
File "/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py", line 697, in _initialize
*args, **kwds))
File "/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 2855, in _get_concrete_function_internal_garbage_collected
graph_function, _, _ = self._maybe_define_function(args, kwargs)
File "/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 3213, in _maybe_define_function
graph_function = self._create_graph_function(args, kwargs)
File "/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 3075, in _create_graph_function
capture_by_value=self._capture_by_value),
File "/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/framework/func_graph.py", line 986, in func_graph_from_py_func
func_outputs = python_func(*func_args, **func_kwargs)
File "/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py", line 600, in wrapped_fn
return weak_wrapped_fn().__wrapped__(*args, **kwds)
File "/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/framework/func_graph.py", line 973, in wrapper
raise e.ag_error_metadata.to_exception(e)
ValueError: in user code:
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:806 train_function *
return step_function(self, iterator)
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:796 step_function **
outputs = model.distribute_strategy.run(run_step, args=(data,))
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:1211 run
return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:2585 call_for_each_replica
return self._call_for_each_replica(fn, args, kwargs)
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:2945 _call_for_each_replica
return fn(*args, **kwargs)
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:789 run_step **
outputs = model.train_step(data)
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:757 train_step
self.trainable_variables)
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:2737 _minimize
trainable_variables))
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:562 _aggregate_gradients
filtered_grads_and_vars = _filter_grads(grads_and_vars)
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:1271 _filter_grads
([v.name for _, v in grads_and_vars],))
ValueError: No gradients provided for any variable: ['conv1d/kernel:0', 'conv1d/bias:0', 'conv1d_1/kernel:0', 'conv1d_1/bias:0', 'conv1d_2/kernel:0', 'conv1d_2/bias:0', 'dense/kernel:0', 'dense/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0'].
1/5纪元
回溯(最近一次呼叫最后一次):
文件“/example.py”,第63行,在
模型拟合(ds,历元=5)
文件“/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/keras/engine/training.py”,第108行,在方法包装中
返回方法(self、*args、**kwargs)
文件“/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/keras/engine/training.py”,第1098行
tmp_logs=训练函数(迭代器)
文件“/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/eager/def_function.py”,第780行,在调用中__
结果=自身调用(*args,**kwds)
文件“/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/eager/def_function.py”,第823行,在调用中
self.\u初始化(参数、KWD、添加初始值设定项到=初始值设定项)
文件“/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/eager/def_function.py”,第697行,在
*args,**科威特第纳尔)
文件“/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/eager/function.py”,第2855行,位于“获取”\u具体”\u函数\u内部\u垃圾收集
图函数,自我,可能定义函数(args,kwargs)
文件“/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/eager/function.py”,第3213行,在函数定义中
graph\u function=self.\u create\u graph\u function(args,kwargs)
文件“/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/eager/function.py”,第3075行,在“创建图形”函数中
按值捕获=自身。_按值捕获),
文件“/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/framework/func_graph.py”,第986行,在func_graph_中,从_py_func
func_outputs=python_func(*func_args,**func_kwargs)
文件“/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/eager/def_function.py”,第600行,包装为
返回弱_-wrapped_-fn()
包装器中的文件“/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/framework/func_graph.py”,第973行
将e.ag\u错误\u元数据引发到\u异常(e)
ValueError:在用户代码中:
/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/keras/engine/training.py:806 train_函数*
返回步骤_函数(self、迭代器)
/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/keras/engine/training.py:796 step_函数**
输出=模型。分配策略。运行(运行步骤,参数=(数据,)
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_-lib.py:1211运行
返回self.\u扩展。为每个\u副本调用\u(fn,args=args,kwargs=kwargs)
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_-lib.py:2585为每个_副本调用_
返回自我。为每个副本(fn、ARG、kwargs)调用
/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/distribute/distribute\u lib.py:2945\u调用每个副本
返回fn(*args,**kwargs)
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:789运行步骤**
输出=型号列车步进(数据)
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:757训练步骤
可自我训练的变量)
/home/user/venv/default/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:2737\u
可训练变量)
/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/keras/optimizer\u v2/optimizer\u v2.py:562\u aggregate\u gradients
过滤的梯度和变量=\u过滤梯度(梯度和变量)
/home/user/venv/default/lib/python3.6/site packages/tensorflow/python/keras/optimizer\u v2/optimizer\u v2.py:1271\u filter\u grads
([v.name代表u,v在grads和vars中],)
ValueError:没有为任何变量提供渐变:['conv1d/kernel:0','conv1d/bias:0','conv1d\u 1/kernel:0','conv1d\u 2/kernel:0','conv1d\u 2/bias:0','densite/kernel:0','densite\u 1/kernel 0','densite\u 1/bias:0']。
请显示打印的输出(“加载的型号:,加载的型号)
然后您说所有东西都断了。
请显示断了的,并附加堆栈跟踪。谢谢。请分享错误日志以了解问题。并检查自定义对象保存和加载模型。ThanksI用一个例子更新了这个问题,说明了问题所在。这个例子是否更清楚地显示了错误?@papaya这个例子是否显示了明显的错误?你有什么建议吗?请显示打印的输出(“加载的模型:,加载的模型)
,然后你说所有东西都坏了。
请显示坏了的东西,并附加堆栈跟踪。谢谢。请分享错误日志以了解问题。并检查自定义对象保存和加载模型。ThanksI用一个例子更新了这个问题,说明了问题所在。这个例子是否更清楚地显示了错误?@papaya这个例子是否显示了明显的错误?你有什么建议吗?