TypeError: object of type 'Sequential' has no len()

Viewed 43

I am trying to perform a genetic CNN classification using this tuto that do MNIST Classifier using Genetic CNN. with my data which are a set of 32x32 rgba images ranged in a numpy of form (500, 32, 32, 4). everything is doing well until i arrive to the last line of code

# to initialize the beginning generation
for i in range(no_of_individuals):
   individuals.append(init())

# control loop
for generation in range(no_of_generations):
  individuals, losses = train(individuals)
  print(losses)

individuals = evolve(individuals, losses)

this error is appeared after printing the losses

TypeError                                 Traceback (most recent call last)

<ipython-input-105-f3dbd74861a6> in <module>
      8     print(losses)
      9 
---> 10     individuals = evolve(individuals, losses)

1 frames

<ipython-input-103-a515f95c8741> in crossover(individuals)
     15                 parentB = random.choice(individuals[:])
     16 
---> 17             for i in range(len(parentA)):
     18                 n = random.random()
     19                 if(n< 0.5):

TypeError: object of type 'Sequential' has no len()

The len(model) is called after defining the sequential model for training in this way

def train(models):
  
losses = []
 
for i in range(len(models)):
    history = models[i].fit(x=x_train,y=train_y, epochs=1, validation_data=(x_test, test_y))
    losses.append(round(history.history['loss'][-1], 4))
    
return models, losses

Update: this is the whole code used from the tutorial

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Dropout, Flatten, MaxPooling2D

def init():
     model  =Sequential()
     model.add(Conv2D(28, kernel_size=(3, 3), input_shape = input_shape))
     model.add(MaxPooling2D(pool_size=(2,2)))
     model.add(Flatten())
     model.add(Dense(128, activation='relu'))
     model.add(Dropout(0.2))
     model.add(Dense(10, activation='softmax'))

     model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

     return model


def train(models):
  
     losses = []
     
     for i in range(len(models)):
        history = models[i].fit(x=X_train,y=y_train, epochs=1, validation_data=(X_test, y_test))
        losses.append(round(history.history['loss'][-1], 4))
        
     return models, losses
   
# Depending on the Application the number of generations may or maynot be fixed
no_of_generations = 15
no_of_individuals = 10
mutate_factor = 0.1
individuals = []

def mutate(new_individual):
     genes = []
     for gene in new_individual:
      n = random.random()
      if(n < mutate_factor):
        #Assign random values to certain genes within the maximum acceptable bounds
        genes.append(random.random())
      else:
        genes.append(gene)
      
     return genes

def crossover(individuals):
    new_individuals = []

    new_individuals.append(individuals[0])
    new_individuals.append(individuals[1])

    for i in range(2, no_of_individuals):
        new_individual = []
        if(i < (no_of_individuals - 2)):
            if(i == 2):
                parentA = random.choice(individuals[:3])
                parentB = random.choice(individuals[:3])
            else:
                parentA = random.choice(individuals[:])
                parentB = random.choice(individuals[:])

            for i in range(len(parentA)):
                n = random.random()
                if(n< 0.5):
                    new_individual.append(parentA[i])
                else:
                    new_individual.append(parentB[i])
         
        else:
            new_individual = random.choice(individuals[:])

        new_individuals.append(mutate(new_individual))
        #new_individuals.append(new_individual)

    return new_individuals

def evolve(individuals, fitness):
  
    sorted_y_idx_list = sorted(range(len(fitness)),key=lambda x:fitness[x])
    individuals = [individuals[i] for i in sorted_y_idx_list ]

    individuals.reverse()

    new_individuals = crossover(individuals)

    return new_individuals

# to initialize the beginning generation
for i in range(no_of_individuals):
    individuals.append(init())

# control loop
for generation in range(no_of_generations):
    individuals, losses = train(individuals)
    print(losses)

    individuals = evolve(individuals, losses)

This colab contain the code with the error generated

0 Answers
Related