Tensorflow 将自定义输入管道连接到tf模型

Tensorflow 将自定义输入管道连接到tf模型,tensorflow,autoencoder,tensorflow-datasets,Tensorflow,Autoencoder,Tensorflow Datasets,我目前正试图获得一个简单的tensorflow模型,通过自定义输入管道提供的数据进行训练。它应该尽可能高效地工作。虽然我读了很多教程,但我无法让它工作 数据 我将我的培训数据拆分为几个csv文件。文件“a.csv”中分别有20个样本,“b.csv”中有30个样本。它们具有相同的结构和相同的标题: feature1; feature2; feature3; feature4 0.1; 0.2; 0.3; 0.4 ... (与自动编码器一样,没有标签。) 代码 我已经编写了一个输入管道,并希望将数

我目前正试图获得一个简单的tensorflow模型,通过自定义输入管道提供的数据进行训练。它应该尽可能高效地工作。虽然我读了很多教程,但我无法让它工作

数据

我将我的培训数据拆分为几个csv文件。文件“a.csv”中分别有20个样本,“b.csv”中有30个样本。它们具有相同的结构和相同的标题:

feature1; feature2; feature3; feature4
0.1; 0.2; 0.3; 0.4
...
(与自动编码器一样,没有标签。)

代码

我已经编写了一个输入管道,并希望将数据从它提供给模型。我的代码如下所示:

import tensorflow as tf

def input_pipeline(filenames, batch_size):
    dataset = tf.data.Dataset.from_tensor_slices(filenames)

    dataset = dataset.flat_map(
        lambda filename: (
                tf.data.TextLineDataset(filename)
                 .skip(1)
                 .shuffle(10)
                 .map(lambda csv_row: tf.decode_csv(
                         csv_row, 
                         record_defaults=[[-1.0]]*4,
                         field_delim=';'))
                 .batch(batch_size)     
        )
    )

    return dataset.make_initializable_iterator()


iterator = input_pipeline(['/home/sku/data/a.csv', 
                           '/home/sku/data/b.csv'], 
                           batch_size=5)

next_element = iterator.get_next()


# Build the autoencoder
x = tf.placeholder(tf.float32, shape=[None, 4], name='in')

z = tf.contrib.layers.fully_connected(x, 2, activation_fn=tf.nn.relu)

x_hat = tf.contrib.layers.fully_connected(z, 4)

# loss function with epsilon for numeric stability
epsilon = 1e-10
loss = -tf.reduce_sum(
    x * tf.log(epsilon + x_hat) + (1 - x) * tf.log(epsilon + 1 - x_hat))

train_op = tf.train.AdamOptimizer(learning_rate=1e-3).minimize(loss)

with tf.Session() as sess:
    sess.run(iterator.initializer)
    sess.run(tf.global_variables_initializer())

for i in range(50):
    batch = sess.run(next_element)
    sess.run(train_op, feed_dict={x: batch, x_hat: batch})
问题

尝试将数据馈送到模型时,出现错误:

ValueError: Cannot feed value of shape (4, 5) for Tensor 'in:0', which has shape '(?, 4)'
打印批处理数据的形状时,我得到以下示例:

(array([ 4.1,  5.9,  5.5,  6.7, 10. ], dtype=float32), array([0.4, 7.7, 0. , 3.4, 8.7], dtype=float32), array([3.5, 4.9, 8.3, 7.2, 6.4], dtype=float32), array([-1. , -1. ,  9.6, -1. , -1. ], dtype=float32))
这是有道理的,但我必须在哪里以及如何重塑这一点?此外,此附加信息数据类型仅在批处理时显示

我还认为我喂错了。我需要输入或类似的东西吗?我记得喂食dicts是一种放慢速度的方法。如果有人能给我一个有效的方法来准备和提供数据,我将非常感激


关于,

我找到了一个解决方案,它需要第二个映射函数。必须在输入函数中添加以下行:

def input_pipeline(filenames, batch_size):
    dataset = tf.data.Dataset.from_tensor_slices(filenames)

    dataset = dataset.flat_map(
        lambda filename: (
                tf.data.TextLineDataset(filename)
                 .skip(1)
                 .shuffle(10)
                 .map(lambda csv_row: tf.decode_csv(
                         csv_row, 
                         record_defaults=[[-1.0]]*4,
                         field_delim=';'))
                 .map(lambda *inputs: tf.stack(inputs))  # <-- mapping required
                 .batch(batch_size)     
        )
    )

    return dataset.make_initializable_iterator()
def输入管道(文件名、批大小):
dataset=tf.data.dataset.from_tensor_切片(文件名)
dataset=dataset.flat\u映射(
lambda文件名:(
tf.data.TextLineDataset(文件名)
.skip(1)
.洗牌(10)
.map(lambda csv_行:tf.decode_csv(
第二排,
记录_默认值=[-1.0]]*4,
字段_delim=';'))
.map(lambda*输入:tf.stack(输入))#