【问题标题】:`y` argument is not supported when using `keras.utils.Sequence` as input. error使用 `keras.utils.Sequence` 作为输入时,不支持 `y` 参数。错误
【发布时间】:2020-05-31 13:01:25
【问题描述】:
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import os
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.layers import Flatten, Dropout, Conv2D, MaxPool2D
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
from tensorflow.keras.callbacks import EarlyStopping

train_path = "D:\python_scripts\garbage/garbage/"
img_shape = (437, 694, 3)
df = pd.read_csv("mpd.csv")
scaler = MinMaxScaler()
earlyStopping = EarlyStopping(monitor="val_loss", mode="min", patience=2)

y = df[["methane", "plastic", "dsci"]].values

imgGen = ImageDataGenerator(rotation_range=(20), width_shift_range=(
    0.1), height_shift_range=(0.1), zoom_range=(0.2), shear_range=(0.1), fill_mode="nearest")
imgGen.flow_from_directory(train_path)
x = imgGen.flow_from_directory(train_path, class_mode=None,
                               color_mode="rgb", batch_size=16, target_size=(img_shape)[:0])

model = Sequential()

model.add(Conv2D(filters=128, kernel_size=(3, 3),
                 input_shape=img_shape, activation="relu"))
model.add(MaxPool2D(pool_size=(4, 4)))
model.add(Conv2D(filters=256, kernel_size=(3, 3),
                 input_shape=img_shape, activation="relu"))
model.add(MaxPool2D(pool_size=(4, 4)))
model.add(Conv2D(filters=512, kernel_size=(3, 3),
                 input_shape=img_shape, activation="relu"))
model.add(MaxPool2D(pool_size=(4, 4)))
model.add(Conv2D(filters=1024, kernel_size=(3, 3),
                 input_shape=img_shape, activation="relu"))
model.add(MaxPool2D(pool_size=(4, 4)))

model.add(Flatten())

model.add(Dense(128, activation="relu"))
model.add(Dropout(0.5))
model.add(Dense(256, activation="relu"))
model.add(Dropout(0.5))
model.add(Dense(512, activation="relu"))
model.add(Dropout(0.5))
model.add(Dense(1024, activation="relu"))
model.add(Dropout(0.5))

model.add(Dense(3))

model.compile(optimizer="adam", loss="mse", metrics=["accuracy"])

model.fit(x=x, y=y, epochs=500, verbose=1, callbacks=[earlyStopping])
model.save("deep.h5")

注意:垃圾/垃圾/包含图像 mpd.csv是一个CSV文件,对应garbage/garbage/中的图片

这是输出-

File "D:\python_scripts\garbage\deep.py", line 54, in <module>
    model.fit(x=x, y=y, epochs=500, verbose=1, callbacks=[earlyStopping],batch_size=16)
  File "C:\Python38\lib\site-packages\tensorflow\python\keras\engine\training.py", line 66, in _method_wrapper
    return method(self, *args, **kwargs)
  File "C:\Python38\lib\site-packages\tensorflow\python\keras\engine\training.py", line 802, in fit
    data_handler = data_adapter.DataHandler(
  File "C:\Python38\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 1100, in __init__
    self._adapter = adapter_cls(
  File "C:\Python38\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 891, in __init__
    raise ValueError("`y` argument is not supported when using "
ValueError: `y` argument is not supported when using `keras.utils.Sequence` as input.

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    您使用的数据生成器会返回图像及其标签,标签是从目录名称中提取的。如果你有以下目录结构

    • 数据
      • 甲烷
        • image1.jpg
      • 塑料
        • image2.jpg
      • dsci
        • image3.jpg

    模型将理解 image1 属于甲烷类,image2 属于塑料类,image3 属于 dsci 类,因此无需传递标签。
    如果您没有该目录结构,那么您可能需要基于tf.keras.utils.Sequence 类定义您自己的生成器类。你可以阅读更多关于here

    【讨论】:

    • 您觉得这篇文章有用吗?
    • 我的项目很成功
    • 很高兴听到这个消息,如果您与您的朋友和网络分享,我将不胜感激
    最近更新 更多