Tensorflow:将tf.data.Dataset与嵌入层和其他功能一起使用

时间:2018-12-08 07:52:37

标签: python tensorflow tensorflow-datasets

我目前正在使用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对象的想法似乎很笨拙,而且几乎肯定不是最佳解决方案。

关于如何完成此操作的任何建议都很棒!

0 个答案:

没有答案