我目前正在使用我自己的数据集,该数据集有4类(猫,狗,老鼠,金枪鱼),到目前为止,我能够在这4类之间进行相当好的分类。
我现在想把这个问题改成"哺乳动物和非哺乳动物的分类"。但是我找不到一种不改变每个文件夹中图像存储方式的方法。
我想出了这个不是很有效的方法:
def to2Clases(image_generator,batch_size):
noMammal= (0,0,0,1,)
for x, y in image_generator:
for i in range(len(y)):
if all(y[i]==noMammal): y[i] = (0,1,0,0,)
else: y[i] = (1,0,0,0,)
yield x, y
例如,我可以使用原始类进行预测,并在需要时转换预测,但我认为这将是我从一开始就在处理的相同问题
有人知道更好的方法吗?
另一种方法
唯一的"解决方案"我能够找到使用Mnist数据集并将问题转换为二进制分类(偶数/奇数)
even=[0,2,4,6,8]
#Converting Train labels from numbers to even/odd
Y_trainbinary= np.empty(Y_train.shape[0],dtype=object)
for idx, item in enumerate(Y_train):
if np.nonzero(item)[0] in even:
Y_trainbinary[idx] = 0 # even number
else:
Y_trainbinary[idx] = 1 # odd number
Y_trainmodel = np_utils.to_categorical(Y_trainbinary)
这个解决方案并不适合我,因为MNIST使用标签编码,而我的列车生成器使用单热编码。
<<p>附加信息/strong>这就是我如何定义train_generator
train_datagen = ImageDataGenerator(
rescale = 1./255,
horizontal_flip = True,
vertical_flip = True,
validation_split = 0.1)
train_generator = train_datagen.flow_from_directory(
data_train,
target_size = (img_height, img_width),
batch_size = batch_size,
shuffle = True,
class_mode = 'categorical',
subset = 'training',
seed = 42)
在这里我打印y看看它的形状:
x,y = train_generator.next()
print(len(y))
print(len(y[0]))
print(y[0])
输出:
32(批量大小)
4(类数
0。1. 0. 0.](元组)
我找到了一个解决方案,我想把它贴出来,以防有人有同样的问题。
首先,你必须忘记使用"从目录"在创建生成器时,请使用"Flow From dataframe"。
要创建一个数据框架,可以使用以下代码:
lst = list(data_train.glob("*/*.tiff"))
newLst = list()
print(lst[0])
for l in lst:
if l.parent == data_train / "bird":
type="Not Mammal"
else:
type="Mammal"
newLst.append((str(l),type))
df = pd.DataFrame(newLst, columns = ['path', 'category'])
print(df)
这样你就可以修改目录的名称(这是你在使用目录时无法做到的)。
然后使用(几乎)相同的代码初始化生成器:train_datagen = ImageDataGenerator(
rescale = 1./255,
horizontal_flip = True,
vertical_flip = True,
validation_split = 0.1)
train_generator = train_datagen.flow_from_dataframe(
df,
x_col = "path",
y_col="category"
target_size = (img_height, img_width),
batch_size = batch_size,
shuffle = True,
class_mode = 'binary',
subset = 'training',
seed = 42)
到目前为止,它的工作方式与目录流相同。