【发布时间】:2019-11-19 20:07:51
【问题描述】:
我正在尝试使用 ImageDataGenerator() 构建图像分类模型。 似乎模型训练和表现不佳。训练损失保持在 15 左右,准确率只有 10%,验证大致相同。
为了看看会发生什么,我尝试在不使用 ImageDataGenerator() 的情况下进行训练,并以类似的方式设置数据。它在训练、验证和测试方面的表现要好得多。训练损失为 0.71,准确度为 75%,验证损失为 0.8,准确度为 72%。
我需要用数据生成器找出这个模型,因为我将转移到一个更大的数据集,它不适合内存。
所以,我想我的问题是我在 ImageDataGenerator() 上做错了什么,它的表现如此糟糕,我该如何改善结果?
在设置文件时(在所有 Train、Test、Validation 文件夹中),类都有自己的文件夹,而这些文件夹中是图像所在的位置。
代码如下:
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import pickle
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Flatten, Conv2D, MaxPooling2D, Dropout
data_gen = ImageDataGenerator()
IMG_SIZE = 100
train_it = data_gen.flow_from_directory('D:/.../Train/', class_mode='sparse',
target_size=(IMG_SIZE, IMG_SIZE),color_mode='grayscale', shuffle=True,batch_size=32)
val_it = data_gen.flow_from_directory('D:/.../Validation/', class_mode='sparse',
target_size=(IMG_SIZE, IMG_SIZE),color_mode='grayscale', shuffle=True,batch_size=32)
IMAGE_SIZE = [100, 100]
model=Sequential()
model.add(Conv2D(32,(3,3), input_shape=[*IMAGE_SIZE, 1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))
model.add(Conv2D(32,(3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))
model.add(Conv2D(32,(3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(len(train_it.class_indices), activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit_generator(train_it, epochs=20, validation_data=val_it )
这是我没有 ImageDataGenerator() 的代码: 使用 OpenCV 设置数据
DATADIR='D:\...\Train'
CATEGORIES = pickle.load(open("CATEGORIES.p" , "rb"))
print(len(CATEGORIES))
IMG_SIZE = 100
training_data=[]
def create_training_data():
for category in CATEGORIES:
path = os.path.join(DATADIR,category)
class_num = CATEGORIES.index(category)
for img in os.listdir(path):
try:
img_array = cv2.imread(os.path.join(path,img),cv2.IMREAD_GRAYSCALE)
new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
training_data.append([new_array, class_num])
except:
print(category)
print(img)
create_training_data()
random.shuffle(training_data)
X=[]
y=[]
for features, label in training_data:
X.append(features)
y.append(label)
X=np.array(X).reshape(-1,IMG_SIZE, IMG_SIZE, 1)
X=X/255.0
模型设置:
model=Sequential()
model.add(Conv2D(32,(3,3), input_shape=[*IMAGE_SIZE, 1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))
model.add(Conv2D(32,(3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))
model.add(Conv2D(32,(3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(len(CATEGORIES), activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X,y, epochs=20, batch_size=32, validation_split=0.1)
【问题讨论】:
-
您对训练和验证数据集使用相同的“data_gen”对象。尝试实例化第二个 ImageDataGenerator 进行验证。
-
谢谢,我会试一试并给你更新!
-
@jkjung13 不幸的是,它没有帮助损失或准确性。
-
@jkjung13 如果您有更多见解,请告诉我。谢谢'
-
使用您更新的代码,我无法确定问题出在哪里。我的建议是从您的数据迭代器('train_it')中获取几批数据,绘制它们,并确保它们符合预期。你可以参考下面我的代码和博客文章来了解如何做到这一点。代码示例:github.com/jkjung-avt/keras-cats-dogs-tutorial/blob/master/…。博文:jkjung-avt.github.io/keras-image-cropping.
标签: tensorflow machine-learning keras