1

以下代码创建了一个连接 2 个输入的虚拟模型。一个输入与输出大小为 5 的 Embedding 层一起使用,而第二个输入仅与 Embedding 层的输出合并:

import tensorflow as tf
import numpy as np
from tensorflow.keras.layers import Input, Embedding, Concatenate, Dense
from tensorflow.keras.models import Model
import keras

x = np.random.randint(0 ,50, size = (10,5,1))
y = np.random.randint(0 ,1, size = (10,1) )

def get_model():
  input1 = Input( shape =(None,11), name='timeseries_input' )
  input2 = Input( shape = (None,1) ,name='embedding_input')
  emb = Embedding(input_dim= len(np.unique(x)) , output_dim= 5)(input2)
  emb = keras.layers.Reshape( target_shape=( -1,5) )(emb)
  merged = Concatenate(axis =2 )([emb,input1])
  out = Dense(1)(merged)
  model = Model([input1,input2],out)
  model.summary()
  return model


m = get_model()
tf.keras.utils.plot_model(
    m,
    show_shapes=True,
    show_dtype=True,
    show_layer_names=True,
    rankdir="TB",
)

该代码有效并产生以下结构:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
embedding_input (InputLayer)    [(None, None, 1)]    0                                            
__________________________________________________________________________________________________
embedding_17 (Embedding)        (None, None, 1, 5)   155         embedding_input[0][0]            
__________________________________________________________________________________________________
tf.compat.v1.shape_15 (TFOpLamb (4,)                 0           embedding_17[0][0]               
__________________________________________________________________________________________________
tf.__operators__.getitem_12 (Sl ()                   0           tf.compat.v1.shape_15[0][0]      
__________________________________________________________________________________________________
tf.reshape_12 (TFOpLambda)      (None, None, 5)      0           embedding_17[0][0]               
                                                                 tf.__operators__.getitem_12[0][0]
__________________________________________________________________________________________________
timeseries_input (InputLayer)   [(None, None, 11)]   0                                            
__________________________________________________________________________________________________
concatenate_11 (Concatenate)    (None, None, 16)     0           tf.reshape_12[0][0]              
                                                                 timeseries_input[0][0]           
__________________________________________________________________________________________________
dense_10 (Dense)                (None, None, 1)      17          concatenate_11[0][0]             
==================================================================================================
Total params: 172
Trainable params: 172
Non-trainable params: 0
__________________________________________________________________________________________________

在此处输入图像描述

但是,当添加ragged=True到我的输入时:

  input1 = Input( shape =(None,11), name='timeseries_input',ragged=True )
  input2 = Input( shape = (None,1) ,name='embedding_input',ragged=True)

代码因以下错误而中断:

TypeError: Failed to convert object of type <class 'tensorflow.python.ops.ragged.ragged_tensor.RaggedTensor'> to Tensor. Contents: tf.RaggedTensor(values=Tensor("Placeholder:0", shape=(None, 1, 5), dtype=float32), row_splits=Tensor("Placeholder_1:0", shape=(None,), dtype=int64)). Consider casting elements to a supported type.

如何连接参差不齐的输入?我错过了什么?

4

1 回答 1

1

使用tf.concat而不是tf.keras.layers.Concatenate解决了这个问题,因为Ragged Tensor不支持Concatenate Layer但它支持tf.concat.

请在下面找到工作代码:

import tensorflow as tf
import numpy as np
from tensorflow.keras.layers import Input, Embedding, Concatenate, Dense
from tensorflow.keras.models import Model
import keras

x = np.random.randint(0 ,50, size = (10,5,1))
y = np.random.randint(0 ,1, size = (10,1) )

def get_model():
  input1 = Input( shape =(None,11), name='timeseries_input', ragged = True )
  input2 = Input( shape = (None,1) ,name='embedding_input', ragged = True)
  emb = Embedding(input_dim= len(np.unique(x)) , output_dim= 5)(input2)
  emb = keras.layers.Reshape( target_shape=( -1,5) )(emb.to_tensor())
  merged = tf.concat([emb,input1], axis = 2)
  out = Dense(1)(merged.to_tensor())
  model = Model([input1,input2],out)
  model.summary()
  return model


m = get_model()
tf.keras.utils.plot_model(
    m,
    show_shapes=True,
    show_dtype=True,
    show_layer_names=True,
    rankdir="TB",
)
于 2021-07-29T16:37:22.830 回答