我已经建立了我的模型,但不知道如何拟合它。有没有人可以给我一些建议,这样我就可以在处理图像时在我的模型中使用ImageDataGenerator,或者最好使用其他方法,比如使用Dataset
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'>我的目录架构:
data-
|-images-
|-train-
|-cats
|-dogs
|-val-
|-cats
|-dogsPS:
我发现article使用了相同的方法,一切似乎都正常,但在我的例子中并非如此
发布于 2020-12-04 09:42:10
你的问题是你有代码
train_generator.flow_from_directory(
directory=train_dir,
target_size=(IMG_WIDTH, IMG_HEIGHT)您需要将其更改为
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‘。顺便说一句,我认为你的模型可能表现不是很好,因为处理数据的特征可能有点简单。我建议添加更多的卷积层和更多的滤波器。下面显示了一个更复杂模型的示例
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')
])发布于 2020-12-04 03:06:53
history = model.fit(train_generator,
validation_data=validation_generator,
steps_per_epoch=100,
epochs=15,
validation_steps=50,
verbose=2)您可以按照colab上的示例进行操作
https://stackoverflow.com/questions/65131908
复制相似问题