猿问

此错误的含义:使用 python 生成器作为输入时不支持 `y` 参数

我尝试开发一个网络,并使用 python 生成器作为数据提供者。一切看起来都很好,直到模型开始适合,然后我收到此错误:


ValueError: `y` argument is not supported when using dataset as input.

我校对了每一行,我认为问题出在网络的格式x_test和y_test馈送上。经过数小时的谷歌搜索并多次更改格式后,错误仍然存在。


你能帮我修一下吗?您可以在下面找到完整的代码:


import os

import numpy as np

import pandas as pd

import re  # To match regular expression for extracting labels


import tensorflow as tf


print(tf.__version__)



def xfiles(filename):

    if re.match('^\w{12}_x\.csv$', filename) is None:

        return False

    else:

        return True



def data_generator():

    folder = "i:/Stockpred/csvdbase/datasets/DS0002"

    file_list = os.listdir(folder)

    x_files = list(filter(xfiles, file_list))

    x_files.sort()

    np.random.seed(1729)

    np.random.shuffle(x_files)


    for file in x_files:

        filespec = folder + '/' + file

        xs = pd.read_csv(filespec, header=None)


        yfile = file.replace('_x', '_y')

        yfilespec = folder + '/' + yfile

        ys = pd.read_csv(open(yfilespec, 'r'), header=None, usecols=[1])


        xs = np.asarray(xs, dtype=np.float32)

        ys = np.asarray(ys, dtype=np.float32)


        for i in range(xs.shape[0]):

            yield xs[i][1:169], ys[i][0]



dataset = tf.data.Dataset.from_generator(

    data_generator,

    (tf.float32, tf.float32),

    (tf.TensorShape([168, ]), tf.TensorShape([])))

dataset = dataset.shuffle(buffer_size=16000, seed=1729)

# dataset = dataset.batch(4000, drop_remainder=True)

dataset = dataset.cache('R:/Temp/model')



def is_test(i, d):

    return i % 4 == 0



def is_train(i, d):

    return not is_test(i, d)



recover = lambda i, d: d


test_dataset = dataset.enumerate().filter(is_test).map(recover)

train_dataset = dataset.enumerate().filter(is_train).map(recover)


x_test = test_dataset.map(lambda x, y: x)

y_test = test_dataset.map(lambda x, y: y)


x_train = train_dataset.map(lambda x, y: x)

y_train = train_dataset.map(lambda x, y: y)


在模型开始适合之前,一切看起来都很好。我收到这个错误:


ValueError: `y` argument is not supported when using dataset as input.

你能帮忙修一下吗?


九州编程
浏览 256回答 3
3回答

慕仙森

正如文档所说:y - 目标数据。与输入数据 x 一样,它可以是 Numpy 数组或 TensorFlow 张量。它应该与 x 一致(你不能有 Numpy 输入和张量目标,反之亦然)。如果 x 是数据集、生成器或 keras.utils.Sequence 实例,则不应指定 y(因为目标将从 x 获得)。所以,我想你应该有一个生成器服务样本和标签的元组。

慕标5832272

如果您提供数据集作为输入,那么type(train_dataset)应该tensorflow.python.data.ops.dataset_ops.BatchDataset如果是这样,只需将此数据集(包括您的 X 和 y 包)提供给模型,model.fit(train_dataset, batch_size=32, epochs=100)(是的,这与我们在 sklearn 中的做法略有不同——X 和 y 分别。)同时,如果你想tensorflow显式地使用一个单独的数据集进行验证,你必须像这样使用 kwarg:model.fit(train_dataset, validation_data=val_dataset, batch_size=32, epochs=100)哪里val_dataset是您在模型训练期间为验证而保留的单独数据集。(未测试)。

侃侃尔雅

使用model.fit_generator,并使用(x,y)输入数据和标签的元组。总而言之:model.fit_generator(train_dataset.as_numpy_iterator(),epochs=100)
随时随地看视频慕课网APP

相关分类

Python
我要回答