使用tf.TensorSpec函数保存输入来自多个位置的Keras模型

使用tf.TensorSpec函数保存输入来自多个位置的Keras模型,keras,tensorflow2.0,Keras,Tensorflow2.0,我正在处理一些演示数据来构建一个二进制分类器。有8个分类变量(假设这8个分类变量已经是整数编码的)以及14个数值变量 我将分类输入和数字输入分开,并创建两部分输入:8个分类输入首先进入嵌入层。嵌入层将连接到14维数字输入层 因此,整个模型的实际(一条记录/一行)/输入如下: [1,2,3,4,5,6,7,8,[1,2,3,4,…,14]] 我的模型结构是这样的 cat_inputs = [] embeddings = [] for col in encoded_vars: #

我正在处理一些演示数据来构建一个二进制分类器。有8个分类变量(假设这8个分类变量已经是整数编码的)以及14个数值变量

我将分类输入和数字输入分开,并创建两部分输入:8个分类输入首先进入嵌入层。嵌入层将连接到14维数字输入层

因此,整个模型的实际(一条记录/一行)/输入如下: [1,2,3,4,5,6,7,8,[1,2,3,4,…,14]]

我的模型结构是这样的

cat_inputs = []
embeddings = []

for col in encoded_vars:
    
    # find the cardinality of each categorical column:
    cardinality = int(np.ceil(d[col].nunique() + 2))
    
    # set the embedding dimension:
    # at least 2, at most 50, otherwise cardinality//2
    embedding_dim = max(min((cardinality)//2, 50),2)
    print(cardinality, embedding_dim)
    
    col_inputs = Input(shape=(1,))
    
    # Specify the embedding
    embedding = Embedding(cardinality, embedding_dim,
                          input_length=1, name=col+"_embed")(col_inputs)
    
    # Add a but of dropout to the embedding layers to regularize:
    embedding = SpatialDropout1D(0.1)(embedding)
    
    # Flatten out the embeddings:
    embedding = Reshape(target_shape=(embedding_dim,))(embedding)
    
    # Add the input shape to inputs
    cat_inputs.append(col_inputs)
    
    # add the embeddings to the embeddings layer
    embeddings.append(embedding)

num_inputs = Input(shape=(len(num_vars), ))


## Concatenate the cat_merged layer to the numerical input layer
x = Concatenate(axis = 1)(embeddings + [num_inputs])

## batch-norm layer
x = Dense(128, activation='relu')(x)
x = BatchNormalization()(x)
x = Dropout(0.3)(x)
x = Dense(64, activation='relu')(x)
outputs = Dense(1, activation = 'sigmoid')(x)



model = Model( [num_inputs] + cat_inputs, outputs)
model.summary()


代码是可运行的,并获得了预期的结果

但是,我想知道是否有人可以指导我如何保存模型规格

我试过这个

model_inputs = [model.inputs[i].shape for i in range(len(model.inputs))]
full_model = full_model.get_concrete_function(x=tf.TensorSpec(model_inputs, model.inputs[0].dtype))
但是,它给了我一个错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-104-f29daca70586> in <module>
      1 model_inputs = [model.inputs[i].shape for i in range(len(model.inputs))]
----> 2 full_model = full_model.get_concrete_function(x=tf.TensorSpec(model_inputs, model.inputs[0].dtype))

/opt/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_core/python/framework/tensor_spec.py in __init__(self, shape, dtype, name)
     52         not convertible to a `tf.DType`.
     53     """
---> 54     self._shape = tensor_shape.TensorShape(shape)
     55     try:
     56       self._shape_tuple = tuple(self.shape.as_list())

/opt/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_core/python/framework/tensor_shape.py in __init__(self, dims)
    774       else:
    775         # Got a list of dimensions
--> 776         self._dims = [as_dimension(d) for d in dims_iter]
    777 
    778   @property

/opt/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_core/python/framework/tensor_shape.py in <listcomp>(.0)
    774       else:
    775         # Got a list of dimensions
--> 776         self._dims = [as_dimension(d) for d in dims_iter]
    777 
    778   @property

/opt/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_core/python/framework/tensor_shape.py in as_dimension(value)
    716     return value
    717   else:
--> 718     return Dimension(value)
    719 
    720 

/opt/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_core/python/framework/tensor_shape.py in __init__(self, value)
    191       raise TypeError("Cannot convert %s to Dimension" % value)
    192     else:
--> 193       self._value = int(value)
    194       if (not isinstance(value, compat.bytes_or_text_types) and
    195           self._value != value):

TypeError: int() argument must be a string, a bytes-like object or a number, not 'TensorShape'
我的理解是,这是一个多输入案例(具有不同的输入维度),如果有人能提供帮助,我将不胜感激

谢谢大家!

model_inputs

[TensorShape([None, 14]),
 TensorShape([None, 1]),
 TensorShape([None, 1]),
 TensorShape([None, 1]),
 TensorShape([None, 1]),
 TensorShape([None, 1]),
 TensorShape([None, 1]),
 TensorShape([None, 1]),
 TensorShape([None, 1])]