【发布时间】:2018-01-17 07:32:11
【问题描述】:
我想使用tf.keras.application 中包含的预构建 keras 模型之一(vgg、inception、resnet 等)进行特征提取,以节省我一些训练时间。
在估算器模型函数中执行此操作的正确方法是什么?
这是我目前拥有的。
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)
但是,此代码会引发错误:
TypeError: unsupported operand type(s) for /: 'Dimension' and 'float'
在线resnet_features = base_model.predict(features['x'])
我认为这是因为 keras 模型需要一个 numpy 数组,但估计器传入的是 tf.Tensor。
那么,在估算器中使用 keras 模型的正确方法是什么。而且,如果您不打算这样做,那么在 TF 中利用预训练模型进行迁移学习的最简单方法是什么?
【问题讨论】:
标签: python tensorflow keras