dohyun
dohyun

Reputation: 31

x-ray pneumonia cnn detection grad cam error

I'm going to solve the binary classification problem soon after I started deep learning. After distinguishing pneumonia from normal people, I try to visualize it with a grad camera, and the following error comes out. The structure of the model.

[![Model of cnn. Input value is 256,256,1.][1]][1]

with open('x-ray_model.json',"r") as json_file: 
    loaded_model_json =json_file.read()
    loaded_model = model_from_json(loaded_model_json)
    
loaded_model.load_weights("x-ray_pneumonia.h5")


def get_img_array(img_path, size):
    image = cv2.imread(img_path)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image = cv2.resize(image,size)
    array = np.expand_dims(image, axis=0)
    return array

def make_gradcam_heatmap(img_array, model, last_conv_layer_name, pred_index=None):
  
    grad_model = tf.keras.models.Model(
        [model.inputs], [model.get_layer(last_conv_layer_name).output, model.output]
    )
    
    with tf.GradientTape() as tape:
        last_conv_layer_output, preds = grad_model(img_array)
        if pred_index is None:
            pred_index = tf.argmax(preds[0])
        class_channel = preds[:, pred_index]

   
    grads = tape.gradient(class_channel, last_conv_layer_output)

  
    pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))

    
    last_conv_layer_output = last_conv_layer_output[0]
    heatmap = last_conv_layer_output @ pooled_grads[..., tf.newaxis]
    heatmap = tf.squeeze(heatmap)

    
    heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap) 
    return heatmap.numpy()


Input 0 of layer "conv2d" is incompatible with the layer: expected axis -1 of input shape to have value 1, but received input with shape (1, 256, 256, 3)
The following error occurs
I don't know where the error came from because I used it while referring to other codes. 


  [1]: https://i.sstatic.net/wYv5F.png

Upvotes: 3

Views: 210

Answers (1)

user11530462
user11530462

Reputation:

I was able to visualize and distinguish pneumonia from normal people with the following code:

def make_gradcam_heatmap(img_array, model, last_conv_layer_name, pred_index=None):
  
    grad_model = tf.keras.models.Model(
        [model.inputs], [model.get_layer(last_conv_layer_name).output, model.output]
    )
    
    with tf.GradientTape() as tape:
        last_conv_layer_output, preds = grad_model(img_array)
        if pred_index is None:
            pred_index = tf.argmax(preds[0])
        class_channel = preds[:, pred_index]
   
    grads = tape.gradient(class_channel, last_conv_layer_output)
    pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
    
    last_conv_layer_output = last_conv_layer_output[0]
    heatmap = last_conv_layer_output @ pooled_grads[..., tf.newaxis]
    heatmap = tf.squeeze(heatmap)
    
    heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap) 
    return heatmap.numpy()

For complete code, please refer to this gist.

Upvotes: 0

Related Questions