Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TF2/Keras:加载自定义模型_Python_Tensorflow_Keras_Tensorflow2.0 - Fatal编程技术网

Python TF2/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

我正在不断地训练一个定制的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(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这个例子是否显示了明显的错误?你有什么建议吗?