How can I solve the error "'Node' object has no attribute 'output_masks" in my keras fine tuning?

Viewed 1320

I'm trying to set up a simple CNN fine tuning the ResNet50 model as follows:

import numpy as np
import cv2
from keras.models import Sequential, Model
from keras.layers import Dense, Activation, Conv2D, Flatten, GlobalAveragePooling2D, Dropout
from keras import optimizers
import os
from keras import applications
from keras.optimizers import SGD, Adam
from tensorflow.keras.applications.resnet50 import ResNet50
from keras.preprocessing.image import ImageDataGenerator

TRAIN_DIR = 'train/'
BATCH_SIZE = 32
NUM_EPOCHS = 5
width = 224
height = 224

base_model = ResNet50(weights='imagenet', include_top=True, input_shape=(224,224,3))
base_model.summary()
head_model = base_model.output
head_model = Dropout(0.5)(head_model)
head_model = Reshape(2049000, )(head_model)
head_model = Dense(1, activation="sigmoid")(head_model)

model = Model(inputs=base_model.input, outputs=head_model)

for layer in base_model.layers:
    layer.trainable = False
    
adam = Adam(lr=0.0001)
model.compile(optimizer= adam, loss='binary_crossentropy', metrics=['accuracy'])
#model.fit(train, labels, batch_size = 32, epochs=10)

train_datagen = ImageDataGenerator()
train_generator = train_datagen.flow_from_directory(TRAIN_DIR,
    target_size=(224, 224),
    batch_size=50,
    class_mode='binary')
model.fit_generator(train_generator, steps_per_epoch=100)

model.save("asd.h5")

When I run it, throws this error:


  File "C:\Users\Junior\Anaconda\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "D:/octProject/train.py", line 46, in <module>
    head_model = Flatten()(head_model)

  File "C:\Users\Junior\Anaconda\lib\site-packages\keras\engine\base_layer.py", line 443, in __call__
    previous_mask = _collect_previous_mask(inputs)

  File "C:\Users\Junior\Anaconda\lib\site-packages\keras\engine\base_layer.py", line 1311, in _collect_previous_mask
    mask = node.output_masks[tensor_index]

AttributeError: 'Node' object has no attribute 'output_masks'
  • In the train folder I have 2 subfolders: Normal and Other each with 11000 images. What can I do to handle this?
1 Answers

You have a problem with your imports. You are mixing up keras and tensorflow.keras. You also forgot to import Reshape.

Change your imports to this and it should work.

import numpy as np
import cv2
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Activation, Conv2D, Flatten, GlobalAveragePooling2D, Dropout, Reshape
from tensorflow.keras import optimizers
import os
from tensorflow.keras import applications
from tensorflow.keras.optimizers import SGD, Adam
from tensorflow.keras.applications.resnet50 import ResNet50
from keras.preprocessing.image import ImageDataGenerator

You also have an error at

head_model = Reshape(2049000, )(head_model)

It should be

head_model = Reshape((2049000, ))(head_model)
Related