When I try to train a Segnet model,it throws the error . I checked my code with the paper of the Segnet, but I didn't find where is wrong. My Keras and Tensorflow has been updated to the latest version.
# coding=utf-8
import matplotlib
from PIL import Image
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import argparse
import numpy as np
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, UpSampling2D, BatchNormalization, Reshape, Permute, Activation, Flatten
# from keras.utils.np_utils import to_categorical
# from keras.preprocessing.image import img_to_array
from keras.models import Model
from keras.layers import Input
from keras.callbacks import ModelCheckpoint
# from sklearn.preprocessing import LabelBinarizer
# from sklearn.model_selection import train_test_split
# import pickle
import matplotlib.pyplot as plt
import os
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
path = '/tmp/pycharm_project_488/2'
os.chdir(path)
training_set = train_datagen.flow_from_directory(
'trainset',
target_size=(64,64),
batch_size=32,
class_mode='categorical',
shuffle=True)
test_set = test_datagen.flow_from_directory(
'testset',
target_size=(64,64),
batch_size=32,
class_mode='categorical',
shuffle=True)
def SegNet():
model = Sequential()
# encoder
model.add(Conv2D(64, (3, 3), strides=(1, 1), input_shape=(64, 64, 3), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(64, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
# (128,128)
model.add(Conv2D(128, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(128, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
# (64,64)
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
# (32,32)
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
# (16,16)
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
# (8,8)
# decoder
model.add(UpSampling2D(size=(2, 2)))
# (16,16)
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(UpSampling2D(size=(2, 2)))
# (32,32)
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(UpSampling2D(size=(2, 2)))
# (64,64)
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(UpSampling2D(size=(2, 2)))
# (128,128)
model.add(Conv2D(128, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(128, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(UpSampling2D(size=(2, 2)))
# (256,256)
model.add(Conv2D(64, (3, 3), strides=(1, 1), input_shape=(64, 64, 3), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(64, (3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(10, (1, 1), strides=(1, 1), padding='valid', activation='relu'))
model.add(BatchNormalization())
model.add(Reshape((64*64, 10)))
# axis=1鍜宎xis=2浜掓崲浣嶇疆锛岀瓑鍚屼簬np.swapaxes(layer,1,2)
# model.add(Permute((2, 1)))
#model.add(Flatten())
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.summary()
return model
def main():
model = SegNet()
filepath = "/tmp/pycharm_project_488/2/weights.best.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list = [checkpoint]
history = model.fit_generator(
training_set,
steps_per_epoch=(training_set.samples / 32),
epochs=20,
callbacks=callbacks_list,
validation_data=test_set,
validation_steps=(test_set.samples / 32))
# Plotting the Loss and Classification Accuracy
model.metrics_names
print(history.history.keys())
# "Accuracy"
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
# "Loss"
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
if __name__ == '__main__':
main()
conv2d_26 (Conv2D) (None, 64, 64, 64) 36928
_________________________________________________________________
batch_normalization_26 (Batc (None, 64, 64, 64) 256
_________________________________________________________________
activation_12 (Activation) (None, 64, 64, 64) 0
_________________________________________________________________
conv2d_27 (Conv2D) (None, 64, 64, 10) 650
_________________________________________________________________
batch_normalization_27 (Batc (None, 64, 64, 10) 40
_________________________________________________________________
activation_13 (Activation) (None, 64, 64, 10) 0
_________________________________________________________________
reshape_1 (Reshape) (None, 4096, 10) 0
_________________________________________________________________
activation_14 (Activation) (None, 4096, 10) 0
=================================================================
Total params: 31,821,426
Trainable params: 31,804,510
Non-trainable params: 16,916
_________________________________________________________________
(None, 64, 64, 3) ****
(None, 4096, 10) ****
Epoch 1/20
Traceback (most recent call last):
File "D:/uir/OpenSentinel2/train.py", line 193, in <module>
main()
File "D:/uir/OpenSentinel2/train.py", line 169, in main
validation_steps=(test_set.samples / 32))
File "D:\pyprogram\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "D:\pyprogram\lib\site-packages\keras\models.py", line 1253, in fit_generator
initial_epoch=initial_epoch)
File "D:\pyprogram\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "D:\pyprogram\lib\site-packages\keras\engine\training.py", line 2244, in fit_generator
class_weight=class_weight)
File "D:\pyprogram\lib\site-packages\keras\engine\training.py", line 1884, in train_on_batch
class_weight=class_weight)
File "D:\pyprogram\lib\site-packages\keras\engine\training.py", line 1487, in _standardize_user_data
exception_prefix='target')
File "D:\pyprogram\lib\site-packages\keras\engine\training.py", line 113, in _standardize_input_data
'with shape ' + str(data_shape))
ValueError: Error when checking target: expected activation_14 to have 3 dimensions, but got array with shape (32, 10)
I was also having a similar problem. Dimension reduction should be applied.
Try
GlobalAveragePooling2D()(x)
after last convolution layer and Later flatten and apply fully connected layer.
Most helpful comment
I was also having a similar problem. Dimension reduction should be applied.
Try
GlobalAveragePooling2D()(x)after last convolution layer and Later flatten and apply fully connected layer.