How to use tf.keras.utils.Sequence with model.fit() in Tensorflow 2?

Tags: , ,



I want to train a model with a custom generator class but model.fit() gives me this error:

    Traceback (most recent call last):
      File "C:/Users/benja/PycharmProjects/mri/modelTrainer.py", line 100, in <module>
        the_generator = DataGenerator()
    TypeError: 'module' object is not callable

Here is the DataGenerator class I wrote:

import numpy as np
import math
from tensorflow.keras.utils import Sequence

import os
import nibabel as nib
import pandas as pd
 
    
    niftiFilesDirPath = './train/nifti/'

class DataGenerator(Sequence):
def __init__(self):

    csvFileName = "combined.csv"
    niftiFileNames = [s for s in os.listdir(niftiFilesDirPath) if s.endswith(".nii.gz")]
    print("Files fount: ", len(niftiFileNames))
    dataframe = pd.read_csv(niftiFilesDirPath + csvFileName)
    niftiFileLables = []

    for niftiFileName in niftiFileNames:
        label = dataframe.loc[dataframe["Image ID"] == int(niftiFileName.split(".")[0])]
        labelValue = label['Has Parkinson'].values[0]

        if labelValue == 0:
            niftiFileLables.append([0,1])
        else:
            niftiFileLables.append([1,0])

    self.x, self.y = niftiFileNames, niftiFileLables
    self.batch_size = 8

def __len__(self):
    return math.ceil(len(self.x) / self.batch_size)

def __getitem__(self, idx):
    batch_x = self.x[idx * self.batch_size:(idx + 1) *
    self.batch_size]
    batch_y = self.y[idx * self.batch_size:(idx + 1) *
    self.batch_size]
    niftiImagesList = []
    for niftiFileName in batch_x:
        niftiFile = os.path.join(niftiFilesDirPath, niftiFileName)
        theImage = nib.load(niftiFile)
        imageNpArray = theImage.get_fdata()
        niftiImagesList.append(imageNpArray)
        print(imageNpArray.shape)
        print(imageNpArray.dtype)

    return np.array(niftiImagesList), np.array(batch_y)

And here is the model I want to train on the DataGenerator class:

import numpy as np 
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv3D, MaxPool3D
from tensorflow.keras import optimizers, losses 
import DataGenerator
 
model = Sequential() 
model.add(Conv3D(8, (3, 3, 3), activation='relu', input_shape=(256,256,128,1))) 
model.add(MaxPool3D((3, 3, 3)))
model.add(Dense(256, activation='tanh'))
model.add(Dense(2, activation='linear'))

# setup model
model.compile(optimizer=optimizers.Adam(1e-3),
                     loss=losses.mean_squared_error,
                     metrics=['mae'])
 
# Generators
the_generator = DataGenerator()
# Train model on dataset
model.fit(x=the_generator, epochs=10)

The code seems correct but I get the error despite many tries. How to use tf.keras.utils.Sequence with model.fit() in Tensorflow 2?

Answer

Because of this line:

import DataGenerator

It will be a module, you need to import definitions inside a module, not the module itself. This error is about Python syntax, not related to TensorFlow or Keras.

# Let it be DataGenerator.py
from DataGenerator import DataGenerator


Source: stackoverflow