Search code examples
tensorflowkerasdeep-learningresnetimage-classification

Getting ValueError and TypeError while training model using resnet50


I am working on medical image classification using Resnet50 model. Whenever I try to flatten the layer I am getting this error.

ValueError: Attempt to convert a value (None) with an unsupported type (<class 'NoneType'>) to a Tensor.

My code is as below

from PIL import Image
import numpy as np
import tensorflow
from tensorflow.keras import layers
from tensorflow.keras.callbacks import Callback, ModelCheckpoint, ReduceLROnPlateau, TensorBoard, EarlyStopping
from tensorflow.keras.models import Model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from keras.utils.np_utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import cohen_kappa_score, accuracy_score
import scipy
from tensorflow.keras import backend as K
import gc
from functools import partial
from tqdm import tqdm
from sklearn import metrics
from collections import Counter
import json
import itertools
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D,GlobalAveragePooling2D 
from keras.layers import Input, Lambda, Dense, Flatten
from keras.preprocessing import image
from glob import glob

pre_trained_model = tensorflow.keras.applications.ResNet50(input_shape=(224,224,3), include_top=False, weights="imagenet")

from keras.applications.resnet50 import ResNet50
from keras.models import Model
import keras
restnet = ResNet50(include_top=False, weights='imagenet', input_shape=(224,224,3))
output = restnet.layers[-1].output
output = keras.layers.Flatten()(output)
restnet = Model(restnet.input, output=output)
for layer in restnet.layers:
    layer.trainable = False
restnet.summary()

I also tried adding the output layer this way:

last_layer = pre_trained_model.get_layer('conv5_block3_out')
print('last layer output shape:', last_layer.output_shape)
last_output = last_layer.output
x = GlobalAveragePooling2D()(last_output)
x = layers.Dropout(0.5)(x)
x = layers.Dense(3, activation='softmax')(x)

But got this error:

TypeError: Cannot convert a symbolic Keras input/output to a numpy array. This error may indicate that you're trying to pass a symbolic value to a NumPy call, which is not supported. Or, you may be trying to pass Keras symbolic inputs/outputs to a TF API that does not register dispatching, preventing Keras from automatically converting the API call to a lambda layer in the Functional Model.

I am unable to understand both errors, checked the soln given here, but that didn't solve my problem.


Solution

  • You are mixing tensorflow and keras libraries. Recommended to use only tensorflow.keras.* instead of keras.*.

    Here is the modified code:

    from PIL import Image
    import numpy as np
    import tensorflow
    from tensorflow.keras import layers
    from tensorflow.keras.callbacks import Callback, ModelCheckpoint, ReduceLROnPlateau, TensorBoard, EarlyStopping
    from tensorflow.keras.models import Model
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    from keras.utils.np_utils import to_categorical
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.optimizers import Adam
    import matplotlib.pyplot as plt
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import cohen_kappa_score, accuracy_score
    import scipy
    from tensorflow.keras import backend as K
    import gc
    from functools import partial
    from tqdm import tqdm
    from sklearn import metrics
    from collections import Counter
    import json
    import itertools
    from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D,GlobalAveragePooling2D 
    from tensorflow.keras.layers import Input, Lambda, Dense, Flatten
    from tensorflow.keras.preprocessing import image
    from glob import glob
    
    pre_trained_model = tensorflow.keras.applications.ResNet50(input_shape=(224,224,3), include_top=False, weights="imagenet")
    
    from keras.applications.resnet50 import ResNet50
    from keras.models import Model
    import keras
    restnet = ResNet50(include_top=False, weights='imagenet', input_shape=(224,224,3))
    output = restnet.layers[-1].output
    output = tensorflow.keras.layers.Flatten()(output)
    restnet = tensorflow.keras.models.Model(restnet.input, outputs=output)
    for layer in restnet.layers:
        layer.trainable = False
    restnet.summary()