我目前正在使用tf.data.Dataset
API来构建用于文本分类的CNN。我从预处理文本开始(将其从字符串转换为
成整数的numpy数组),因此电影评论如下:
"terrible movie", "negative"
将在我的tf.data.Dataset
(称为dataset
)中这样表示:
({"review": [93, 21]}, 0)
我的模型开始像这样:
`sequence_input = tf.keras.layers.Input(shape=(100,),name='review', dtype='int32')
x = tf.keras.layers.Embedding(input_dim=10000,
output_dim=50,
input_length=100,
trainable=True,
embeddings_initializer='glorot_uniform',
mask_zero=False)(sequence_input)
x = tf.keras.layers.SpatialDropout1D(0.5)(x)
...
现在我可以这样做:
model.fit(dataset, steps_per_epoch=10, epochs=20, validation_data=val_dataset,
validation_steps=3)
一切正常。但是,现在我也想包括非文本功能。所以也许会有一个新的例子:
"terrible movie", 207, 3.4
其中207是看过电影的人数,平均评论得分是3.4。所以这是我的问题
如何设置dataset
来适应数据的新形状?
我当时以为我可以拥有一个看起来像这样的dataset
:
({"review": [[93, 21], 207, 3.4}, 0)
但是我只想将[93, 21]
传递到我的Embedding
层,然后很久以后将[207, 3.4]
发送到我的网络中。如果我不使用tf.data.Dataset
API,我可以做类似的事情(假设rev
是[93, 21]
,而struct
是[207, 3.4]
:
input_train = {'review': rev, 'structured': struct}
review_input = Input(shape=(100,), name='review', dtype='int32')
structured_input = Input(shape=(2,),
name='structured',
dtype='float32')
x = Embedding(input_dim=10000,
output_dim=50,
input_length=100,
trainable=True,
embeddings_initializer='glorot_uniform',
mask_zero=False)(review_input)
merged = concatenate([x, structured_input])
使用两个 tf.data.Dataset
对象的想法似乎很笨拙,而且几乎肯定不是最佳解决方案。
关于如何完成此操作的任何建议都很棒!