如何“压缩” Tensorflow数据集并在Keras中正确训练?

时间:2019-02-23 16:10:25

标签: python tensorflow keras

我有一个train_x.csv和一个train_y.csv,我想使用Dataset API和Keras接口来训练模型。我正在尝试做的事情:

import numpy as np
import pandas as pd
import tensorflow as tf

tf.enable_eager_execution()

N_FEATURES = 10
N_SAMPLES = 100
N_OUTPUTS = 2
BATCH_SIZE = 8
EPOCHS = 5

# prepare fake data
train_x = pd.DataFrame(np.random.rand(N_SAMPLES, N_FEATURES))
train_x.to_csv('train_x.csv', index=False)
train_y = pd.DataFrame(np.random.rand(N_SAMPLES, N_OUTPUTS))
train_y.to_csv('train_y.csv', index=False)

train_x = tf.data.experimental.CsvDataset('train_x.csv', [tf.float32] * N_FEATURES, header=True)
train_y = tf.data.experimental.CsvDataset('train_y.csv', [tf.float32] * N_OUTPUTS, header=True)
dataset = ...  # What to do here?

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(N_OUTPUTS, input_shape=(N_FEATURES,)),
    tf.keras.layers.Activation('linear'),
])
model.compile('sgd', 'mse')
model.fit(dataset, steps_per_epoch=N_SAMPLES/BATCH_SIZE, epochs=EPOCHS)

实施此dataset的正确方法是什么?

我尝试使用dataset = tf.data.Dataset.zip((train_x, train_y))之类的Dataset.zip API,但似乎无法正常工作(代码here和错误here)。我还阅读了this的答案,它可以正常工作,但是我想使用一种非功能性的模型声明方式。

1 个答案:

答案 0 :(得分:1)

问题出在您的密集层的输入形状中。它应该与输入张量的形状匹配,即1。 tf.keras.layers.Dense(N_OUTPUTS, input_shape=(features_shape,))

另外,您可能会遇到定义model.fit() steps_per_epoch parameter的问题,它应该是int类型。 model.fit(dataset, steps_per_epoch=int(N_SAMPLES/BATCH_SIZE), epochs=EPOCHS)

编辑1: 如果需要多个标签,可以

def parse_f(data, labels):
    return data, tf.stack(labels, axis=0)

dataset = tf.data.Dataset.zip((train_x, train_y))
dataset = dataset.map(parse_func)
dataset = dataset.batch(BATCH_SIZE)
dataset = dataset.repeat()