首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何适应tensorflow ImageDataGenerator

如何适应tensorflow ImageDataGenerator
EN

Stack Overflow用户
提问于 2020-12-04 02:25:28
回答 2查看 72关注 0票数 0

我已经建立了我的模型,但不知道如何拟合它。有没有人可以给我一些建议,这样我就可以在处理图像时在我的模型中使用ImageDataGenerator,或者最好使用其他方法,比如使用Dataset

代码语言:javascript
复制
import tensorflow as tf
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
import numpy as np
import matplotlib.pyplot as plt
import cv2
import os

# const
IMG_HEIGHT = 150
IMG_WIDTH  = 150
BATCH = 32
EPOCHS = 5
train_dir = "data/images/train"
val_dir = "data/images/val"


# train image data generator
train_generator = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1./255,
    horizontal_flip=True,
    dtype=tf.float32
)
train_generator.flow_from_directory(
    directory=train_dir,
    target_size=(IMG_WIDTH, IMG_HEIGHT)
)

# validation image data generator
val_generator = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1./255,
    horizontal_flip=False
)
val_generator.flow_from_directory(
    directory = val_dir,
    target_size=(IMG_WIDTH, IMG_HEIGHT)
)

# count train cats & dogs
train_cats_len = len(os.listdir(os.path.join(train_dir, "cats")))
train_dogs_len = len(os.listdir(os.path.join(train_dir, "dogs")))
train_len = train_cats_len + train_dogs_len

# count validation cats & dogs
val_cats_len = len(os.listdir(os.path.join(val_dir, "cats")))
val_dogs_len = len(os.listdir(os.path.join(val_dir, "dogs")))
val_len = val_cats_len + val_dogs_len

# build a model
model = tf.keras.Sequential([
    Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH , 3)),
    MaxPooling2D(),
    Dropout(0.2),
    Flatten(),
    Dense(128, activation='relu'),
    Dense(64, activation='relu'),
    Dense(2, activation='sigmoid')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# fit?

# history = model.fit_generator(
#     train_generator,
#     steps_per_epoch=train_len // BATCH,
#     epochs=EPOCHS,
#     validation_data=val_generator,
#     validation_steps=val_len // BATCH,
#     verbose=True
# )

# raises error:
# ValueError: Failed to find data adapter that can handle input: <class 'tensorflow.python.keras.preprocessing.image.ImageDataGenerator'>, <class 'NoneType'>

我的目录架构:

代码语言:javascript
复制
data-
    |-images-
            |-train-
                   |-cats
                   |-dogs
            |-val-
                  |-cats
                  |-dogs

PS:

我发现article使用了相同的方法,一切似乎都正常,但在我的例子中并非如此

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-04 09:42:10

你的问题是你有代码

代码语言:javascript
复制
train_generator.flow_from_directory(
    directory=train_dir,
    target_size=(IMG_WIDTH, IMG_HEIGHT)

您需要将其更改为

代码语言:javascript
复制
train_generator=train_generator.flow_from_directory( directory=train_dir,
    target_size=(IMG_WIDTH, IMG_HEIGHT)

对val_generator执行相同的操作。此外,ImageDataGenerator的默认class_mode是“分类的”。因此,在model.compile中,您应该将损失指定为'categorical_crossentropy‘。在包含2个节点的模型层中,激活函数应该是'softmax‘。顺便说一句,我认为你的模型可能表现不是很好,因为处理数据的特征可能有点简单。我建议添加更多的卷积层和更多的滤波器。下面显示了一个更复杂模型的示例

代码语言:javascript
复制
model = tf.keras.Sequential([
    Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH , 3)),
    MaxPooling2D(),
    Conv2D(32, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH , 3)),
    MaxPooling2D(),
    Conv2D(64, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH , 3)),
    MaxPooling2D(),
    Conv2D(128, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH , 3)),
    MaxPooling2D(),
    Flatten(),
    Dense(128, activation='relu'),
    Dropout(.3),
    Dense(64, activation='relu'),
    Dropout(.3),
    Dense(2, activation='softmax')
])
票数 1
EN

Stack Overflow用户

发布于 2020-12-04 03:06:53

代码语言:javascript
复制
history = model.fit(train_generator,
                    validation_data=validation_generator,
                    steps_per_epoch=100,
                    epochs=15,
                    validation_steps=50,
                    verbose=2)

您可以按照colab上的示例进行操作

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65131908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档