Hi,
I’m trying to synthesise MRI image derived from CT using U-Net segmentation. I tried to use L1 as loss function. But when i fit the model, error shows. Please help me on possible reasons. i’m pretty new to deep learning.
File “/var/folders/l0/z8r9pfhd6ls5r030zy0c3lrh0000gn/T/ipykernel_4657/4045245122.py”, line 39, in l1_loss *
for b in range(y_true_deonehot.shape[0]):
TypeError: ‘NoneType’ object cannot be interpreted as an integer
Basic parameters: batch size = 5, num_classes = 20, epoch = 90. input shape = [None, 300,300,1], output shape (None, 300, 300, 20). (20 is correspond to one-hot num_classes).
definition of model:
kernel_size = 3
filters_orig = 32
layer_depth = 4
use_batch_norm = batch_size > 1
inputs = Input(shape=(*image_size, num_channels), name=‘input’)
outputs = unet(inputs, out_channels=num_classes,
layer_depth=layer_depth, filters_orig=filters_orig,
kernel_size=kernel_size, batch_norm=use_batch_norm,
final_activation=“softmax”
)
unet_model = Model(inputs, outputs)
optimizer = tf.keras.optimizers.legacy.Adam()
unet_model.compile(optimizer=optimizer, loss=l1_loss,
metrics=[‘accuracy’])
train = tf.data.Dataset.zip((train_image,train_label))
val = tf.data.Dataset.zip((val_image,val_label))
def l1_loss(y_true,y_pred):
#input shape: one-hotted [batch,m,n,num_classes]
y_true_deonehot = tf.argmax(y_true, axis=-1)
y_pred_deonehot = tf.argmax(y_pred, axis=-1)
loss = []
for b in range(y_true_deonehot.shape[0]):
t = tf.cast(y_true_deonehot[b,:,:],tf.float32)
p = tf.cast(y_pred_deonehot[b,:,:],tf.float32)
loss.append(np.mean(tf.abs(t-p)))
l1_loss = np.mean(loss)
return l1_loss
history = unet_model.fit(train, epochs=num_epochs, steps_per_epoch=train_steps_per_epoch,
validation_data=val, validation_steps=val_steps_per_epoch,
verbose=0)