1

我有一个模型函数,它接受特征、目标和模式,但是当我添加 tf.keras 层时,我目前得到的异常 pred 必须是张量、变量或 Python 布尔值。

但是,当我不使用 tf.keras 而是直接从 keras(即来自 keras.layers)运行相同的代码时,它正在工作。

代码 :

def model_fn(features, labels, mode):

if mode == tf.estimator.ModeKeys.TRAIN:
    tf.keras.backend.set_learning_phase(1)
else:
    tf.keras.backend.set_learning_phase(0)

input_feature = features['x']
table = lookup.index_table_from_file(vocabulary_file='vocab.txt', num_oov_buckets=1, default_value=-1)
text = tf.squeeze(input_feature, [1])
words = tf.string_split(text)
densewords = tf.sparse_tensor_to_dense(words, default_value=PADWORD)
numbers = table.lookup(densewords)
padding = tf.constant([[0, 0], [0, MAX_FEATURES]])
padded = tf.pad(numbers, padding)
sliced = tf.slice(padded, [0, 0], [-1, MAX_FEATURES])
print('words_sliced={}'.format(words))

#embeds = tf.keras.layers.Embedding(MAX_FEATURES, 50, input_length=MAX_FEATURES)(sliced)
embeds = tf.contrib.layers.embed_sequence(sliced, vocab_size=MAX_FEATURES, embed_dim=50)
print('words_embed={}'.format(embeds))

f1 = tf.keras.layers.Dropout(0.2)(embeds)
f1 = tf.keras.layers.Conv1D(filters, kernel_size, padding='valid', activation='relu', strides=1)(f1)
f1 = tf.keras.layers.GlobalAveragePooling1D()(f1)
# f1 = layers.BatchNormalization()(f1)
f1 = tf.keras.layers.Dense(hidden_dims)(f1)
f1 = tf.keras.layers.Dropout(0.5)(f1)
f1 = tf.keras.layers.Activation('relu')(f1)
logits = tf.keras.layers.Dense(11)(f1)

predictions_dict = {
    'class': tf.argmax(logits, 1),
    'prob': tf.nn.softmax(logits)
}

prediction_output = tf.estimator.export.PredictOutput({"classes": tf.argmax(input=logits, axis=1),
                                                       "probabilities": tf.nn.softmax(logits,
                                                                                      name="softmax_tensor")})

if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions_dict, export_outputs={
        tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: prediction_output
    })

# one_hot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=11)
loss = tf.losses.sparse_softmax_cross_entropy(labels, logits=logits)

if mode == tf.contrib.learn.ModeKeys.TRAIN:
    train_op = tf.contrib.layers.optimize_loss(loss, tf.contrib.framework.get_global_step(), optimizer='Adam',
                                               learning_rate=0.001)
    return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

eval_metrics_ops = {
    'accuracy': tf.metrics.accuracy(labels=labels, predictions=predictions_dict['class'])
}
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metrics_ops)

当我执行上面的脚本时,我得到一个异常 TypeError: pred must be a Tensor, a Variable, or a Python bool。

但是,当我在没有 tf.keras 的情况下直接使用 keras(来自 keras)时,它也可以正常工作。这里出了什么问题?

4

1 回答 1

0

代码 :

if mode == tf.estimator.ModeKeys.TRAIN:
    tf.keras.backend.set_learning_phase(True)
else:
    tf.keras.backend.set_learning_phase(False)

设置 learning_phase = True 或 False 正在解决问题。

于 2017-12-16T09:08:18.873 回答