Python TensorFlow Extended |培训师未使用General Executor&;暖启动;凯拉斯模型

Python TensorFlow Extended |培训师未使用General Executor&;暖启动;凯拉斯模型,python,machine-learning,keras,tensorflow2.0,tfx,Python,Machine Learning,Keras,Tensorflow2.0,Tfx,我目前正在尝试让TFX管道的培训师组件从同一管道的上一次运行开始。用例是: 运行管道一次,生成一个模型 当新数据出现时,用新数据训练现有模型 我知道ResolverNode组件就是为此而设计的,因此您可以在下面看到我是如何使用它的: # detect the previously trained model latest_model_resolver = ResolverNode( instance_name='latest_model_resolver', resolver_class

我目前正在尝试让TFX管道的培训师组件从同一管道的上一次运行开始。用例是:

  • 运行管道一次,生成一个模型
  • 当新数据出现时,用新数据训练现有模型
  • 我知道
    ResolverNode
    组件就是为此而设计的,因此您可以在下面看到我是如何使用它的:

    # detect the previously trained model
    latest_model_resolver = ResolverNode(
      instance_name='latest_model_resolver',
      resolver_class=latest_artifacts_resolver.LatestArtifactsResolver,
      latest_model=Channel(type=Model))
    context.run(latest_model_resolver)
    
    # set prior model as base_model
    train_file = 'tfx_modules/recommender_train.py'
    trainer = Trainer(
        module_file=os.path.abspath(train_file),
        custom_executor_spec=executor_spec.ExecutorClassSpec(GenericExecutor),
        transformed_examples=transform.outputs['transformed_examples'],
        transform_graph=transform.outputs['transform_graph'],
        schema=schema_gen.outputs['schema'],
        train_args=trainer_pb2.TrainArgs(num_steps=10000),
        eval_args=trainer_pb2.EvalArgs(num_steps=5000),
        base_model=latest_model_resolver.outputs['latest_model'])
    
    上面的组件成功运行,
    ResolverNode
    能够从以前的管道运行中检测到最新的模型。没有抛出错误-但是,当运行
    context.run(trainer)
    时,模型丢失基本上从第一次开始的地方开始。模型第一次运行后,完成训练损失约为0.1,但在第二次运行(假设为热启动)时,它重新启动约18.2

    这让我相信所有的权重都被重新初始化了,我认为这不应该发生。以下是相关的模型构造功能:

    def build_keras_model():
        """build keras model"""
        embedding_max_values = load(open(os.path.abspath('tfx-example/user_artifacts/embedding_max_dict.pkl'), 'rb'))
        embedding_dimensions = dict([(key, 20) for key in embedding_max_values.keys()])
        embedding_pairs = [recommender.EmbeddingPair(embedding_name=feature,
                                                     embedding_dimension=embedding_dimensions[feature],
                                                     embedding_max_val=embedding_max_values[feature])
                           for feature in recommender_constants.univalent_features]
    
        numeric_inputs = []
        for num_feature in recommender_constants.numeric_features:
            numeric_inputs.append(keras.Input(shape=(1,), name=num_feature))
    
        input_layers = numeric_inputs + [elem for pair in embedding_pairs for elem in pair.input_layers]
        pre_concat_layers = numeric_inputs + [elem for pair in embedding_pairs for elem in pair.embedding_layers]
    
        concat = keras.layers.Concatenate()(pre_concat_layers) if len(pre_concat_layers) > 1 else pre_concat_layers[0]
        layer_1 = keras.layers.Dense(64, activation='relu', name='layer1')(concat)
        output = keras.layers.Dense(1, kernel_initializer='lecun_uniform', name='out')(layer_1)
        model = keras.models.Model(input_layers, outputs=output)
        model.compile(optimizer='adam', loss='mean_squared_error')
        return model
    
    def run_fn(fn_args: TrainerFnArgs):
        """function for the Trainer component"""
        tf_transform_output = tft.TFTransformOutput(fn_args.transform_output)
    
        train_dataset = _input_fn(fn_args.train_files, fn_args.data_accessor,
                                  tf_transform_output, 40)
        eval_dataset = _input_fn(fn_args.eval_files, fn_args.data_accessor,
                                 tf_transform_output, 40)
    
        model = build_keras_model()
        tensorboard_callback = tf.keras.callbacks.TensorBoard(
            log_dir=fn_args.model_run_dir, update_freq='epoch', histogram_freq=1,
            write_images=True)
        model.fit(train_dataset, steps_per_epoch=fn_args.train_steps, validation_data=eval_dataset,
                  validation_steps=fn_args.eval_steps, callbacks=[tensorboard_callback],
                  epochs=5)
    
        signatures = {
            'serving_default':
                _get_serve_tf_examples_fn(model, tf_transform_output).get_concrete_function(tf.TensorSpec(
                        shape=[None],
                        dtype=tf.string,
                        name='examples')
                )
        }
        model.save(fn_args.serving_model_dir, save_format='tf', signatures=signatures)
    
    为了研究这个问题,我仔细阅读了:

    来自TFX的热启动示例

    但是,本指南使用
    估计器
    组件而不是Keras组件。该组件有一个
    warm\u start\u from
    初始化参数,我找不到与Keras等效的参数

    我怀疑:

  • 热启动功能仅适用于
    Estimator
    组件,即使为Keras组件设置了
    base\u model
    ,也不会生效

  • 我会告诉模型重新初始化权重,即使在成功加载之前的模型之后也是如此——在这种情况下,我希望有一个指针来指示发生的位置

  • 任何帮助都会很好!非常感谢