I've been working on this, and just can't get it to work. It can't matching inputs to outputs.
Input data: two folders of images (400 x 400 pixels) in a master folder called TrainingData
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)
from keras.preprocessing.image import ImageDataGenerator
from keras import models
from keras_unet.models import custom_unet
model = custom_unet(
input_shape=(400, 400, 3),
use_batch_norm=False,
num_classes=2,
filters=64,
dropout=0.2,
output_activation='sigmoid')
from keras.utils import multi_gpu_model
#parallel_model = multi_gpu_model(model, gpus=4, cpu_merge=True, cpu_relocation=True)
parallel_model = multi_gpu_model(model, gpus=4)
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True,
validation_split = 0.2)
train_generator = train_datagen.flow_from_directory(
'<path>/TrainingData',
target_size=(400, 400),
batch_size=32,
class_mode='binary',
shuffle=True,
subset='training')
validation_generator = train_datagen.flow_from_directory(
'<path>/TrainingData',
target_size=(400, 400),
batch_size=32,
class_mode='binary',
shuffle=True,
subset='validation')
from keras.callbacks import ModelCheckpoint
filepath="<newpath>/Unetweights.best.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list = [checkpoint]
from collections import Counter
counter = Counter(train_generator.classes)
max_val = float(max(counter.values()))
class_weights = {class_id : max_val/num_images for class_id, num_images in counter.items()}
parallel_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
history=parallel_model.fit_generator(train_generator,
steps_per_epoch = train_generator.samples // 32,
validation_data = validation_generator,
validation_steps = validation_generator.samples // 32,
epochs = 75,
class_weight=class_weights, callbacks=callbacks_list)
Epoch 1/75
Traceback (most recent call last):
File "", line 6, in
File "/home/bly/anaconda3/envs/tf_gpu/lib/python3.7/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "/home/bly/anaconda3/envs/tf_gpu/lib/python3.7/site-packages/keras/engine/training.py", line 1418, in fit_generator
initial_epoch=initial_epoch)
File "/home/bly/anaconda3/envs/tf_gpu/lib/python3.7/site-packages/keras/engine/training_generator.py", line 217, in fit_generator
class_weight=class_weight)
File "/home/bly/anaconda3/envs/tf_gpu/lib/python3.7/site-packages/keras/engine/training.py", line 1211, in train_on_batch
class_weight=class_weight)
File "/home/bly/anaconda3/envs/tf_gpu/lib/python3.7/site-packages/keras/engine/training.py", line 789, in _standardize_user_data
exception_prefix='target')
File "/home/bly/anaconda3/envs/tf_gpu/lib/python3.7/site-packages/keras/engine/training_utils.py", line 128, in standardize_input_data
'with shape ' + str(data_shape))
ValueError: Error when checking target: expected conv2d_38 to have 4 dimensions, but got array with shape (32, 1)
I honestly don't know what I am doing wrong.