deep_learning_cookbook
deep_learning_cookbook copied to clipboard
11.1 Detecting Multiple Images -- TypeError: add_weight() got multiple values for argument 'name'
Hi Douwe:
I adopted the code of kbardool/keras-frcnn after yhenon/keras-frcnn was deprecated and deleted in the Github. While running the script of train_frcnn.py, the system raised TypeError: add_weight() got multiple values for argument 'name'.
I am pleased to provide the Snippet of the code, detailed TypeError Message and related environment code of lines for your information.
1. Snippet of the code
Since Keras was updated, I have changed the line of code from" if K.image_dim_ordering() == 'th':" to "if K.image_data_format() == 'channels_first':"
import keras_frcnn.resnet as nn
num_features = 1024
if K.image_data_format() == 'channels_first':
input_shape_img = (3, None, None)
input_shape_features = (num_features, None, None)
else:
input_shape_img = (None, None, 3)
input_shape_features = (None, None, num_features)
img_input = Input(shape=input_shape_img)
roi_input = Input(shape=(c.num_rois, 4))
feature_map_input = Input(shape=input_shape_features)
"""define the base network (resnet here, can be VGG, Inception, etc)"""
shared_layers = nn.nn_base(img_input, trainable=True)
"""define the RPN, built on the base layers"""
num_anchors = len(c.anchor_box_scales) * len(c.anchor_box_ratios)
rpn_layers = nn.rpn(shared_layers, num_anchors)
classifier = nn.classifier(feature_map_input, roi_input, c.num_rois, nb_classes=len(c.class_mapping), trainable=True)
model_rpn = Model(img_input, rpn_layers)
model_classifier_only = Model([feature_map_input, roi_input], classifier)
model_classifier = Model([feature_map_input, roi_input], classifier)
2. TypeError Message
TypeError Traceback (most recent call last)
~/keras-frcnn/keras_frcnn/resnet.py in nn_base(input_tensor, trainable) 190 # Do not correct "trainable = trainable" to "trainable=True" 191 x = Convolution2D(64, (7, 7), strides=(2, 2), name='conv1', trainable=trainable)(x) --> 192 x = FixedBatchNormalization(axis=bn_axis, name='bn_conv1')(x) 193 x = Activation('relu')(x) 194 x = MaxPooling2D((3, 3), strides=(2, 2))(x)
~/miniconda3/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py in symbolic_fn_wrapper(*args, **kwargs) 73 if _SYMBOLIC_SCOPE.value: 74 with get_graph().as_default(): ---> 75 return func(*args, **kwargs) 76 else: 77 return func(*args, **kwargs)
~/miniconda3/lib/python3.7/site-packages/keras/engine/base_layer.py in call(self, inputs, **kwargs)
461 'You can build it manually via: '
462 'layer.build(batch_input_shape)
')
--> 463 self.build(unpack_singleton(input_shapes))
464 self.built = True
465
~/keras-frcnn/keras_frcnn/FixedBatchNormalization.py in build(self, input_shape) 28 regularizer=self.gamma_regularizer, 29 name='{}_gamma'.format(self.name), ---> 30 trainable=False) 31 self.beta = self.add_weight(shape, 32 initializer=self.beta_init,
TypeError: add_weight() got multiple values for argument 'name'
3. Related Snippet of FixedBatchNormalization.py
I checked the FRCNN code. It is related to FixedBatchNormalization.py.
def build(self, input_shape):
self.input_spec = [InputSpec(shape=input_shape)]
shape = (input_shape[self.axis],)
self.gamma = self.add_weight(shape,
initializer=self.gamma_init,
regularizer=self.gamma_regularizer,
name='{}_gamma'.format(self.name),
trainable=False)
self.beta = self.add_weight(shape,
initializer=self.beta_init,
regularizer=self.beta_regularizer,
name='{}_beta'.format(self.name),
trainable=False)
self.running_mean = self.add_weight(shape, initializer='zero',
name='{}_running_mean'.format(self.name),
trainable=False)
self.running_std = self.add_weight(shape, initializer='one',
name='{}_running_std'.format(self.name),
trainable=False)
if self.initial_weights is not None:
self.set_weights(self.initial_weights)
del self.initial_weights
self.built = True
Here is the website that I have referenced. keras-frcnn: https://github.com/kbardool/keras-frcnn deprecated yhenon: https://github.com/yhenon/keras-frcnn
Look forward to hearing from you,
Best regards,
Mike``
During running the example application, I found out the outstanding 'scipy.misc' issues. I am pleased to give the related solutions ad follows.
1. imread, imsave
Issue
ImportError: cannot import name 'imread' and 'imsave 'from 'scipy.misc'
Solution
First, install imageio
$ conda install imageio or $ pip install imageio
Second, change from scipy.misc import imread, imsave to: from imageio import imread, imsave
imageio at conda: https://github.com/conda-forge/imageio-feedstock
2. imresize
Issue
ImportError: cannot import name 'imresize' from 'scipy.misc'
Solution
First, install scikit-image
$ conda install -c conda-forge scikit-image or $ pip install scikit-image
Second, change from scipy.misc import imresize to: from skimage.transform import resize
scikit-image: https://scikit-image.org/docs/dev/install.html pypi: https://pypi.org/project/skimage/ example: https://scikit-image.org/docs/stable/auto_examples/transform/plot_rescale.html
3. fromimage, toimage
Issue
ImportError: cannot import name 'fromimage' from 'scipy.misc' ImportError: cannot import name 'toimage' from 'scipy.misc'
Solution
Aopt the numpy method: fromimage(im) -> np.asarray(im)
Adopt the pillow method Image.fromarray(): toimage() -> Image.fromarray()
stackoverflow: https://stackoverflow.com/questions/57796368/attributeerror-importerror-on-scipy-misc-image-functions-e-x-imread-imresize
Hi Douwe:
It is a long journey.
A good news is that I have gotten through the error: TypeError: add_weight() got multiple values for argument 'name' by correcting FixedBatchNormalization.py and other scripts related to the library of keras_frcnn.
However, I have not yet completed to run the application due to the function of format_img. It shows: NameError: name 'format_img' is not defined. I check both CV2 and PIL, there is no traceback for such an error.
Since keras_rfcnn is a classical case called by the application of 11.1 Detecting Multiple Images. I want to figure out it. Hope you can give a help.
Appreciate for your reply,
import cv2
import PIL
from PIL import Image
img = cv2.imread('/home/mike/Documents/dl-cookbook/data/cat_dog.jpg')
X, ratio = format_img(img, c)
# -if K.image_dim_ordering() == 'tf':
if K.image_data_format() == 'channels_last':
X = np.transpose(X, (0, 2, 3, 1))
y1, y2, f = model_rpn.predict(X)
# -r = keras_frcnn.roi_helpers.rpn_to_roi(y1, y2, c, K.image_dim_ordering(), overlap_thresh=0.7)
r = keras_frcnn.roi_helpers.rpn_to_roi(y1, y2, c, K.image_data_format(), overlap_thresh=0.7)
roi_count = R.shape[0] // c.num_rois
r2 = np.zeros((roi_count * c.num_rois, r.shape[1]))
r2 = r[:r2.shape[0],:r2.shape[1]]
r2 = np.reshape(r2, (roi_count, c.num_rois, r.shape[1]))
NameError Traceback (most recent call last)
NameError: name 'format_img' is not defined_
After adding the following code "from measure_map import format_img", there is no TypeError: add_weight() got multiple values for argument 'name'.
However, it has the TypeError: Object of type 'NoneType' has no len(). So I have added the issue 11.2