Keras: ValueError: Error when checking target: expected activation_14 to have 3 dimensions, but got array with shape (32, 10)

Created on 8 Apr 2019  路  1Comment  路  Source: keras-team/keras

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.

Code:

# 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()

Error:

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)
tensorflow support

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.

>All comments

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.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

anjishnu picture anjishnu  路  3Comments

farizrahman4u picture farizrahman4u  路  3Comments

snakeztc picture snakeztc  路  3Comments

braingineer picture braingineer  路  3Comments

NancyZxll picture NancyZxll  路  3Comments