Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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 Can';t将带有特征列的keras.models.Model转换为估计模型。TypeError:缺少参数:';功能列'&引用;_Python_Tensorflow_Keras - Fatal编程技术网

Python Can';t将带有特征列的keras.models.Model转换为估计模型。TypeError:缺少参数:';功能列'&引用;

Python Can';t将带有特征列的keras.models.Model转换为估计模型。TypeError:缺少参数:';功能列'&引用;,python,tensorflow,keras,Python,Tensorflow,Keras,使用TF1.14.0 我正在尝试将带有特征列的keras模型转换为估计模型。 但它不起作用,我如何解决它? 我的代码是: import tensorflow as tf from tensorflow import keras from tensorflow.keras.layers import Input, Dense, Lambda from tensorflow.keras.models import Model from tensorflow.keras.layers import d

使用TF1.14.0 我正在尝试将带有特征列的keras模型转换为估计模型。 但它不起作用,我如何解决它? 我的代码是:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Input, Dense, Lambda
from tensorflow.keras.models import Model
from tensorflow.keras.layers import dot
from tensorflow import feature_column

numerical_columns = ['age','fare']
feature_columns = []

def make_feature_column(numerical_columns):
    feature_columns = []
    feature_layer_inputs = {}
    # numeric cols
    for header in numerical_columns:
        header_str = str(header)
        feature_columns.append(feature_column.numeric_column(header_str))
        feature_layer_inputs[header_str] = tf.keras.Input(shape=(1,), name=header_str)
    return feature_columns,feature_layer_inputs

feature_columns,feature_layer_inputs = make_feature_column(numerical_columns)

feature_layer = tf.keras.layers.DenseFeatures(feature_columns,trainable=False)(feature_layer_inputs)
x = Dense(units=2048, activation='relu')(feature_layer)
x = Dense(units=1024, activation='relu')(x)
x = Dense(units=512, activation='relu')(x)
x = Dense(units=200, activation='relu',name='user_vec')(x)
item_input = Input((200,), name='item_vec')
x = Lambda(lambda t: t / tf.linalg.norm(t, ord=1))(x)

x = dot([x, item_input], axes=-1)
main_output = Dense(1, activation='sigmoid', name='main_output')(x)

feature_layers = feature_layer_inputs.values()
inputs = [v for v in feature_layers]
inputs.append(item_input)

model = Model(inputs=inputs, outputs=main_output)
model.compile(optimizer='rmsprop', loss={'main_output': 'binary_crossentropy'}, loss_weights={'main_output': 1.})

estimator = tf.keras.estimator.model_to_estimator(model)
但是它返回了一个类型错误,我不能理解这个错误。 错误是:

Traceback (most recent call last):
  File "/Users/lideyang/PycharmProjects/NewUserSort/test.py", line 42, in <module>
    estimator = tf.keras.estimator.model_to_estimator(model)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/keras/estimator/__init__.py", line 73, in model_to_estimator
    config=config)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py", line 450, in model_to_estimator
    config)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py", line 318, in _save_first_checkpoint
    custom_objects)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py", line 201, in _clone_and_build_model
    optimizer_iterations=global_step)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/keras/models.py", line 538, in clone_and_build_model
    clone = clone_model(model, input_tensors=input_tensors)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/keras/models.py", line 326, in clone_model
    model, input_tensors=input_tensors, layer_fn=clone_function)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/keras/models.py", line 154, in _clone_functional_model
    new_layer = layer_fn(layer)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/keras/models.py", line 54, in _clone_layer
    return layer.__class__.from_config(layer.get_config())
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer.py", line 446, in from_config
    return cls(**config)
TypeError: __init__() missing 1 required positional argument: 'feature_columns'
回溯(最近一次呼叫最后一次):
文件“/Users/lideyang/PycharmProjects/NewUserSort/test.py”,第42行,在
估计器=tf.keras.estimator.model_to_估计器(model)
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/tensorflow/Python/keras/estimator/__init____;.py”,第73行,在model_to_uestimator中
config=config)
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/tensorflow_-estimator/Python/estimator/keras.py”,第450行,模型_-to_-estimator
配置)
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/tensorflow\u estimator/Python/estimator/keras.py”,第318行,保存第一个检查点
自定义对象)
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/tensorflow\u estimator/Python/estimator/keras.py”,第201行,在克隆和构建模型中
优化器_迭代次数=全局_步)
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/tensorflow/Python/keras/models.py”,第538行,在clone_和_build_模型中
克隆=克隆\模型(模型,输入\张量=输入\张量)
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/tensorflow/Python/keras/models.py”,第326行,在clone_模型中
模型,输入\张量=输入\张量,层\ fn=克隆\函数)
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/tensorflow/Python/keras/models.py”,第154行,在克隆功能模型中
新层=层层(层)
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/tensorflow/Python/keras/models.py”,第54行,在克隆层
返回层。来自层配置的层类(layer.get\u config())
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/tensorflow/Python/keras/engine/base_layer.py”,第446行,from_config
返回cls(**配置)
TypeError:\uuuu init\uuuuu()缺少1个必需的位置参数:“feature\u columns”

如果我不使用功能列,而是使用Inputlayer,比如“user\u input=input((300),,name='user\u input'),它就可以工作了。如何解决此问题。

一旦将tensorflow升级到
1.15
2.x
,您的问题就可以得到解决

%tensorflow_version 2.x
import tensorflow as tf
print(tf.__version__)
from tensorflow import keras
from tensorflow.keras.layers import Input, Dense, Lambda
from tensorflow.keras.models import Model
from tensorflow.keras.layers import dot
from tensorflow import feature_column

numerical_columns = ['age','fare']
feature_columns = []

def make_feature_column(numerical_columns):
    feature_columns = []
    feature_layer_inputs = {}
    # numeric cols
    for header in numerical_columns:
        header_str = str(header)
        feature_columns.append(feature_column.numeric_column(header_str))
        feature_layer_inputs[header_str] = tf.keras.Input(shape=(1,), name=header_str)
    return feature_columns,feature_layer_inputs

feature_columns,feature_layer_inputs = make_feature_column(numerical_columns)

feature_layer = tf.keras.layers.DenseFeatures(feature_columns,trainable=False)(feature_layer_inputs)
x = Dense(units=2048, activation='relu')(feature_layer)
x = Dense(units=1024, activation='relu')(x)
x = Dense(units=512, activation='relu')(x)
x = Dense(units=200, activation='relu',name='user_vec')(x)
item_input = Input((200,), name='item_vec')
x = Lambda(lambda t: t / tf.linalg.norm(t, ord=1))(x)

x = dot([x, item_input], axes=-1)
main_output = Dense(1, activation='sigmoid', name='main_output')(x)

feature_layers = feature_layer_inputs.values()
inputs = [v for v in feature_layers]
inputs.append(item_input)

model = Model(inputs=inputs, outputs=main_output)
model.compile(optimizer='rmsprop', loss={'main_output': 'binary_crossentropy'}, loss_weights={'main_output': 1.})

estimator = tf.keras.estimator.model_to_estimator(model)
输出:

2.4.0
INFO:tensorflow:Using default config.
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpwa8ialaq
INFO:tensorflow:Using the Keras model provided.
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/backend.py:434: UserWarning: `tf.keras.backend.set_learning_phase` is deprecated and will be removed after 2020-10-11. To update it, simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.
  warnings.warn('`tf.keras.backend.set_learning_phase` is deprecated and '
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpwa8ialaq', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}