【问题标题】:keras model fit: ValueError: Failed to find data adapter that can handle input: <class 'method'>, <class 'NoneType'>keras 模型拟合:ValueError:找不到可以处理输入的数据适配器:<class 'method'>,<class 'NoneType'>
【发布时间】:2020-12-08 21:44:08
【问题描述】:

我正在为多类分类构建一个简单的 CNN 模型。根据ImageDataGenerator的flow_from_directory函数所要求的classes子目录,训练和测试数据在data_path。

这是我根据数据构建和训练模型的代码:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dropout, Flatten, Dense, Conv2D, MaxPooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# Build Model

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(40, 24, 1)))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(12, activation='softmax'))

model.compile('binary_crossentropy', 'SGD', ['accuracy'])

# Init Generators

generator = ImageDataGenerator(rescale=1./255,
                               horizontal_flip=True,
                               fill_mode='nearest',
                               validation_split=0.2)

def get_train_images():
    train_images = generator.flow_from_directory(os.path.join(data_path, 'train'),
                                                 target_size=(40, 24, 1),
                                                 batch_size=32,
                                                 color_mode='grayscale',
                                                 class_mode='categorical',
                                                 subset='training',
                                                 shuffle=True)

def get_validation_images():
    validation_images = generator.flow_from_directory(os.path.join(data_path, 'train'),
                                                      target_size=(40, 24, 1),
                                                      batch_size=32,
                                                      color_mode='grayscale',
                                                    class_mode='categorical',
                                                      subset='validation',
                                                      shuffle=True)

# Train Model

model.fit(get_train_images, validation_data=get_validation_images, epochs=20)

拟合函数给出以下错误:

File "C:\Python38\lib\site-packages\tensorflow\python\keras\engine\training.py", line 108, in _method_wrapper
    return method(self, *args, **kwargs)
  File "C:\Python38\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1049, in fit
    data_handler = data_adapter.DataHandler(
  File "C:\Python38\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 1104, in __init__
    adapter_cls = select_data_adapter(x, y)
  File "C:\Python38\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 968, in select_data_adapter
    raise ValueError(
ValueError: Failed to find data adapter that can handle input: <class 'method'>, <class 'NoneType'>

看起来是某种兼容性问题。我正在使用 tensorflow 2.3.1 版。有人可以指出我做错了什么并帮助我解决这个问题吗?

谢谢!

【问题讨论】:

  • 我相信,提供给fit() 的参数之一是无。

标签: tensorflow machine-learning keras deep-learning conv-neural-network


【解决方案1】:

你执行了吗

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

对于 flow_from_directory 中的 validation_images 设置 shuffle=False ,这样验证数据在每个 epoch 中以相同的顺序呈现给模型。

【讨论】:

  • 是的,我忘了提。我确实使用model.compile('binary_crossentropy', 'SGD', ['accuracy']) 编译了模型
  • 您应该在 model.compile 中使用 categorical_crossentropy,因为生成器使用它,并且您的分类层中有 12 个神经元。
【解决方案2】:

为了解决这个问题,我必须改变两件事:

  • flow_from_directory 的目标大小应该是 (40, 24) 而不是 (40, 24, 1)
  • 我有函数包装器来获取 flow_from_directory 生成器,并且我将这些函数作为参数传递给 fit 函数。相反,我不得不将这些包装器的返回值传递给 fit 函数

正确的做法应该是:

model.fit(get_train_images(), validation_data=get_validation_images(), epochs=20)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-22
    • 2021-10-29
    • 1970-01-01
    • 2020-10-14
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多