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