如何创建具有多个目标的TensorSliceDataset?

时间:2019-07-19 19:15:45

标签: python keras tensorflow2.0

我有一个数据框,该数据框由一列文本和三个要基于此文本预测的目标列组成。

我可以使用以下代码轻松预测其中一个目标:

a == a.min()

如何更改tf.data.Dataset.from_tensor_slices以具有多个目标?

类似的东西:

dataset = tf.data.Dataset.from_tensor_slices((df['text'],
                                              df['feature1'].values.astype(int)
                                              ))

tokenizer = tfds.features.text.Tokenizer()

vocabulary_set = set()
for text_tensor, _ in dataset:
  some_tokens = tokenizer.tokenize(text_tensor.numpy())
  vocabulary_set.update(some_tokens)

vocab_size = len(vocabulary_set)

encoder = tfds.features.text.TokenTextEncoder(vocabulary_set)

def encode(text_tensor, label):
    encoded_text = encoder.encode(text_tensor.numpy())
    return encoded_text, label

def encode_map_fn(text, label):
    return tf.py_function(encode, inp=[text, label], Tout=(tf.int64, tf.int64))

encoded_dataset = dataset.map(encode_map_fn)

BUFFER_SIZE = 50000
BATCH_SIZE = 64
TAKE_SIZE = 500

train_data = encoded_dataset.shuffle(BUFFER_SIZE).skip(TAKE_SIZE)
train_data = train_data.padded_batch(BATCH_SIZE, padded_shapes=([-1],[]))

test_data = encoded_dataset.take(TAKE_SIZE)
test_data = test_data.padded_batch(BATCH_SIZE, padded_shapes=([-1],[]))

vocab_size += 1


model = tf.keras.Sequential()
model.add(tf.keras.layers.Embedding(vocab_size, 2048))
model.add(tf.keras.layers.GlobalAveragePooling1D())
model.add(tf.keras.layers.Dense(2048, activation='tanh'))
model.add(tf.keras.layers.Dropout(.2))
model.add(tf.keras.layers.Dense(2048, activation='tanh'))
model.add(tf.keras.layers.Dropout(.2))
model.add(tf.keras.layers.Dense(16, activation='softmax'))

model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(train_data, epochs=50, validation_data=test_data)

似乎不起作用。

我希望在模型的末尾具有三个独立的softmax输出,分别与我要预测的三个功能相对应。

0 个答案:

没有答案