gpt4 book ai didi

tensorflow - 为什么 ImageDataGenerator() 表现不佳?

转载 作者:行者123 更新时间:2023-11-30 08:42:10 24 4
gpt4 key购买 nike

我正在尝试使用 ImageDataGenerator() 构建图像分类模型。该模型的训练和表现似乎很差。训练损失保持在 15 左右,准确率只有 10%,验证也差不多。

为了看看会发生什么,我尝试在不使用 ImageDataGenerator() 的情况下进行训练,并以类似的方式设置数据。它在训练、验证和测试方面表现得更好。训练损失为 0.71,准确度为 75%;验证损失为 0.8,准确度为 72%。

我需要使用数据生成器计算出这个模型,因为我将转向更大的数据集,而该数据集无法装入内存。

所以,我想我的问题是我对 ImageDataGenerator() 做错了什么,它的性能如此糟糕,我该如何改善结果?

设置文件时(在所有“训练”、“测试”、“验证”文件夹中),有些类拥有自己的文件夹,这些文件夹中就是图像所在的位置。

这是代码:

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)

最佳答案

@acho,

提及您在评论中引用的此问题的解决方案,以造福社区。

问题的原因是输入数据未通过将每个像素值除以 255 进行标准化。由于以下原因,它对训练有影响:

  1. 它将像素值从整数转换为 float ,范围为 0.0-1.0,其中 0.0 表示 0 (0x00),1.0 表示 255 (0xFF)。与整数值相比,卷积网络在浮点值上效果更好,并且通过将其标准化在 0-1 范围内,可以减少计算量。
  2. 标准化将帮助您消除图像中灯光和阴影造成的扭曲。

关于tensorflow - 为什么 ImageDataGenerator() 表现不佳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58562089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com