I’m trying to use ImageDataGenerator() for my image datasets. Here is my image augmentation code:
JavaScript
x
31
31
1
batch_size = 16
2
3
train_datagen = ImageDataGenerator(
4
rescale=1./255,
5
shear_range=0.2,
6
zoom_range=0.2,
7
horizontal_flip=True)
8
9
test_datagen = ImageDataGenerator(rescale=1./255)
10
11
# Use flow from dataframe
12
train_generator = train_datagen.flow_from_dataframe(
13
dataframe=train,
14
directory="data/train",
15
x_col="id",
16
y_col=["not_ready", "ready"],
17
target_size=(300, 300),
18
batch_size=batch_size,
19
class_mode="raw",
20
validate_filenames=False)
21
22
validation_generator = test_datagen.flow_from_dataframe(
23
dataframe=validation,
24
directory="data/validation",
25
x_col="id",
26
y_col=["not_ready", "ready"],
27
target_size=(300, 300),
28
batch_size=batch_size,
29
class_mode="raw",
30
validate_filenames=False)
31
Then use that plug into my model:
JavaScript
1
15
15
1
model = Sequential([
2
layers.Conv2D(filters=16, kernel_size=(3, 3), activation='relu', input_shape=(300, 300, 1)),
3
layers.MaxPooling2D(pool_size=(2, 2)),
4
layers.Dropout(0.5),
5
layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu'),
6
layers.MaxPooling2D(pool_size=(2, 2)),
7
layers.Dropout(0.5),
8
layers.Flatten(),
9
layers.Dense(64, activation='relu'),
10
layers.Dropout(0.5),
11
layers.Dense(32, activation='relu'),
12
layers.Dropout(0.5),
13
layers.Dense(2, activation='sigmoid')
14
])
15
Use EarlyStopping:
JavaScript
1
2
1
early_stopping = EarlyStopping(monitor='val_loss',mode='min',verbose=1,patience=10, restore_best_weights=True)
2
Compile and Fit the model:
JavaScript
1
9
1
model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])
2
history = model.fit(
3
train_generator,
4
steps_per_epoch=train_generator.n // batch_size,
5
epochs=100,
6
validation_data=validation_generator,
7
validation_steps=validation_generator.n // batch_size,
8
callbacks=[early_stopping])
9
That is when the code crash, and gives this error message.
JavaScript
1
2
1
/AppleInternal/Library/BuildRoots/8d3bda53-8d9c-11ec-abd7-fa6a1964e34e/Library/Caches/com.apple.xbs/Sources/MetalPerformanceShaders/MPSNDArray/Kernels/MPSNDArrayConvolution.mm:2317: failed assertion `output channels should be divisible by group'
2
I try to change the output neurons but that doesn’t work. I don’t know what to do anymore. Please help me. Thank you so much.
Advertisement
Answer
Got it. Because I use grayscale images. So I have to add color_mode keyword argument in both flow_from_dataframe() and set it equal to “grayscale”
JavaScript
1
20
20
1
train_generator = train_datagen.flow_from_dataframe(
2
dataframe=train,
3
directory="data/train",
4
x_col="id",
5
y_col=["not_ready", "ready"],
6
target_size=(300, 300),
7
batch_size=batch_size,
8
class_mode="raw",
9
color_mode="grayscale")
10
11
validation_generator = test_datagen.flow_from_dataframe(
12
dataframe=validation,
13
directory="data/validation",
14
x_col="id",
15
y_col=["not_ready", "ready"],
16
target_size=(300, 300),
17
batch_size=batch_size,
18
class_mode="raw",
19
color_mode="grayscale")
20