在TF估计器中使用Keras模型

在TF估计器中使用Keras模型

本文介绍了在TF估计器中使用Keras模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用tf.keras.application中包含的预构建的keras模型(vgg,inception,resnet等)进行特征提取,以节省一些时间.

I want to use one of the pre-built keras' models (vgg, inception, resnet, etc) included in tf.keras.application for feature extraction to save me some time training.

在估算器模型函数中执行此操作的正确方法是什么?

What is the correct way to do this inside of an estimator model function?

这是我目前拥有的.

import tensorflow as tf

def model_fn(features, labels, mode):

    # Import the pretrained model
    base_model = tf.keras.applications.InceptionV3(
            weights='imagenet',
            include_top=False,
            input_shape=(200,200,3)
    )

    # get the output features from InceptionV3
    resnet_features = base_model.predict(features['x'])

    # flatten and feed into dense layers
    pool2_flat = tf.layers.flatten(resnet_features)

    dense1 = tf.layers.dense(inputs=pool2_flat, units=5120, activation=tf.nn.relu)

    # ... Add in N number of dense layers depending on my application

    logits = tf.layers.dense(inputs=denseN, units=5)

    # Calculate Loss
    onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=5)

    loss = tf.losses.softmax_cross_entropy(
    onehot_labels=onehot_labels, logits=logits)

    optimizer = tf.train.AdamOptimizer(learning_rate=1e-3)
    train_op = optimizer.minimize(
        loss=loss,
        global_step=tf.train.get_global_step()
    )

    return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

if __name__ == "__main__":

    # import Xtrain and Ytrain

    classifier = tf.estimator.Estimator(
        model_fn=model_fn, model_dir="/tmp/conv_model")

    train_input_fn = tf.estimator.inputs.numpy_input_fn(
        x={'x': Xtrain},
        y=Ytrain,
        batch_size=100,
        num_epochs=None,
        shuffle=True)

    classifier.train(
        input_fn=train_input_fn,
        steps=100)

但是,此代码引发错误:

However, this code throws the error:

TypeError: unsupported operand type(s) for /: 'Dimension' and 'float'

在线resnet_features = base_model.predict(features['x'])

我认为这是因为keras模型期望的是numpy数组,但是估计器传递的是tf.Tensor.

I think this is because the keras model is expecting a numpy array, but the estimator is passing in a tf.Tensor.

那么,在估算器内部使用keras模型的正确方法是什么.而且,如果您不打算这样做,那么利用预训练模型进行TF中的转移学习的最简单方法是什么?

So, what is the correct way to use a keras model inside of an estimator. And, if you're not suppose to do this, what is the simplest way to leverage a pre-trained model for transfer learning in TF?

推荐答案

我不知道有任何可用的方法可以让您从预先训练的keras模型创建自定义 model_fn.一种更简单的方法是使用tf.keras.estimator.model_to_estimator()

I am not aware of any available method allowing you to create custom model_fn from pretrained keras model. An easier way is to use tf.keras.estimator.model_to_estimator()

model = tf.keras.applications.ResNet50(
    input_shape=(224, 224, 3),
    include_top=False,
    pooling='avg',
    weights='imagenet')
logits =  tf.keras.layers.Dense(10, 'softmax')(model.layers[-1].output)
model = tf.keras.models.Model(model.inputs, logits)
model.compile('adam', 'categorical_crossentropy', ['accuracy'])

# Convert Keras Model to tf.Estimator
estimator = tf.keras.estimator.model_to_estimator(keras_model=model)
estimator.train(input_fn=....)

但是,如果您想创建自定义的model_fn来添加更多操作(例如摘要操作),则可以编写如下内容:

However, if you would like to create custom model_fn to add more ops (e.g. Summary ops), you can write as following:

import tensorflow as tf

_INIT_WEIGHT = True

def model_fn(features, labels, mode, params):
  global _INIT_WEIGHT

  # This is important, it allows keras model to update weights
  tf.keras.backend.set_learning_phase(mode == tf.estimator.ModeKeys.TRAIN)

  model = tf.keras.applications.MobileNet(
      input_tensor=features,
      include_top=False,
      pooling='avg',
      weights='imagenet' if _INIT_WEIGHT else None)

  # Only init weights on first run
  if _INIT_WEIGHT:
    _INIT_WEIGHT = False

  feature_map = model(features)
  logits = tf.keras.layers.Dense(units=params['num_classes'])(feature_map)

  # loss
  loss = tf.losses.softmax_cross_entropy(labels=labels, logits=logits)
  ...

这篇关于在TF估计器中使用Keras模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-28 21:41