I'm new with python and I'm doing a project trying to classify movie posters by genre. Then, when I run main, I came up to this problem :
File "/home/.../Desktop/movies_genre_model.py", line 56, in build
num_classes = len(y_train(0))
TypeError: 'NoneType' object is not callable
What does this mean?
What I have tried:
1 import os
2 import time
3
4 import keras
5 from keras.layers import Conv2D, MaxPooling2D
6 from keras.layers import Dense, Dropout, Flatten
7 from keras.models import Sequential
8
9 import movies_dataset as movies
10
11
12 def get_kernel_dimensions(version, shape, divisor):
13 image_width = shape[0]
14
15
16 if version == 1:
17 return 3, 3
18
19
20 if version == 2:
21 return int(0.1 * image_width / divisor), int(0.1 * image_width / divisor)
22
23
24 if version == 3:
25 return int(0.2 * image_width / divisor), int(0.2 * image_width / divisor)
26
27
28 def build(version, min_year, max_year, genres, ratio, epochs,
29 x_train=None, y_train=None, x_validation=None, y_validation=None):
30
31 print()
32 print('version:', version)
33 print('min_year:', min_year)
34 print('max_year:', max_year)
35 print('genres:', genres)
36 print('ratio:', ratio)
37 print()
38
39
40 if x_train is None or y_train is None or x_validation is None or y_validation is None:
41 begin = time.time()
42 x_train = movies.load_genre_data(min_year, max_year, genres, ratio, 'train')
43 y_train = movies.load_genre_data(min_year, max_year, genres, ratio, 'train')
44 x_validation = movies.load_genre_data(min_year, max_year, genres, ratio, 'validation')
45 y_validation = movies.load_genre_data(min_year, max_year, genres, ratio, 'validation')
46 print('loaded in', (time.time() - begin) / 60, 'min.')
47 else:
48 print('data provided in arguments')
49
50 print()
51 print('x_train shape:', x_train.shape)
52 print(x_train.shape[0], 'train samples')
53 print(x_validation.shape[0], 'validation samples')
54
55
56 num_classes = len(y_train(0))
57 kernel_dimensions1 = get_kernel_dimensions(version, x_train.shape, 1)
58 kernel_dimensions2 = get_kernel_dimensions(version, x_train.shape, 2)
59 print('kernel_dimensions1:', kernel_dimensions1)
60 print('kernel_dimensions2:', kernel_dimensions2)
61
62 model = Sequential([
63 Conv2D(32, kernel_dimensions1, padding='same', input_shape=x_train.shape[1:], activation='relu'),
64 Conv2D(32, kernel_dimensions1, activation='relu'),
65 MaxPooling2D(pool_size=(2, 2)),
66 Dropout(0.25),
67
68 Conv2D(64, kernel_dimensions2, padding='same', activation='relu'),
69 Conv2D(64, kernel_dimensions2, activation='relu'),
70 MaxPooling2D(pool_size=(2, 2)),
71 Dropout(0.25),
72
73 Flatten(),
74 Dense(512, activation='relu'),
75 Dropout(0.5),
76 Dense(num_classes, activation='sigmoid')
77 ])
78
79 opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)
80 model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
81 print(model.summary())
82
83 model.fit(x_train, y_train, batch_size=32, epochs=epochs, validation_data=(x_validation, y_validation))
84
85
86 save_dir = os.path.join(os.getcwd(), 'saved_models')
87 if not os.path.isdir(save_dir):
88 os.makedirs(save_dir)
89
90
91 model_file_name = 'genres' \
92 + '_' + str(min_year) + '_' + str(max_year) \
93 + '_g' + str(len(genres)) \
94 + '_r' + str(ratio) \
95 + '_e' + str(epochs) \
96 + '_v' + str(version) + '.h5'
97
98 model_path = os.path.join(save_dir, model_file_name)
99 model.save(model_path)
100 print('Saved trained model at %s ' % model_path)