/
Multi Class Classification.py
153 lines (124 loc) · 4.92 KB
/
Multi Class Classification.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# importing libraries
import keras
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.layers.normalization import BatchNormalization
from keras.callbacks import EarlyStopping
from keras.callbacks import ModelCheckpoint
from keras.models import load_model
from keras import backend as K
img_width, img_height = 20, 20
train_data_dir = '/content/drive/My Drive/KaggleData_split/train'
test_data_dir = '/content/drive/My Drive/KaggleData_split/test'
nb_train_samples = 1500
nb_test_samples = 120
epochs = 100
batch_size = 16
num_of_classes=3 #change it as per your number of categories
validation_split = 0.2
if K.image_data_format() == 'channels_first':
input_shape = (3, img_width, img_height)
else:
input_shape = (img_width, img_height, 3)
# Model
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape = input_shape))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size =(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size =(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(64))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(num_of_classes, activation='softmax'))
model.compile(loss ='categorical_crossentropy',
optimizer ='adam',
metrics =['accuracy'])
#Train/Validation/Test Generators
train_datagen = ImageDataGenerator( rescale = 1. / 255,
validation_split=validation_split) # set validation split)
test_datagen = ImageDataGenerator(rescale = 1. / 255)
train_generator = train_datagen.flow_from_directory(train_data_dir,
target_size =(img_width, img_height), shuffle=True,
batch_size = batch_size, class_mode ='categorical',
subset='training') # set as training data
validation_generator = train_datagen.flow_from_directory( train_data_dir,
target_size =(img_width, img_height),
batch_size = batch_size, class_mode ='categorical',
subset='validation') # set as validation data
test_generator = test_datagen.flow_from_directory( test_data_dir,
target_size =(img_width, img_height), shuffle=False,
batch_size = 1, class_mode ='categorical')
# confirm the iterator works
#batchX, batchy = train_generator.next()
#print('Batch shape=%s, min=%.3f, max=%.3f' % (batchX.shape, batchX.min(), batchX.max()))
#batchX, batchy = validation_generator.next()
#print('Batch shape=%s, min=%.3f, max=%.3f' % (batchX.shape, batchX.min(), batchX.max()))
#batchX, batchy = test_generator.next()
#print('Batch shape=%s, min=%.3f, max=%.3f' % (batchX.shape, batchX.min(), batchX.max()))
# simple early stopping
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=30)
mc = ModelCheckpoint('best_model.h5', monitor='val_acc', mode='max', verbose=1, save_best_only=True)
model.fit_generator(train_generator,
steps_per_epoch = train_generator.samples // batch_size, callbacks=[es, mc],
epochs = epochs, validation_data = validation_generator,
validation_steps = validation_generator.samples // batch_size)
"""
epochs = epochs, validation_data = validation_generator,
validation_steps = nb_validation_samples // batch_size)
"""
# load the saved model
saved_model = load_model('best_model.h5')
# make a prediction
test_generator.reset()
yhat = saved_model.predict_generator(test_generator, steps= nb_test_samples)
print(len(yhat))
#model.save_weights('model_saved.h5')
###
# Save to csv file
###
import os
import sys
import numpy
numpy.set_printoptions(threshold=sys.maxsize)
import csv
#sort files in test directory
l=os.listdir('/content/drive/My Drive/KaggleData/test/test')
li=[x.split('.')[0] for x in l]
li.sort()
#Create final labels
labels = numpy.argmax(yhat, axis=1)
#print(labels)
temp = numpy.empty([nb_test_samples, 2], dtype=int)
for i in range(nb_test_samples):
if labels[i]==1:
labels[i]=3
if labels[i]==0:
labels[i]=1
temp[i] = [li[i], labels[i]]
numpy.savetxt('/content/drive/My Drive/194310001.csv', temp, fmt='%d',delimiter=',', header='imageId,label')
#Test Generator Debugging Technique
#print(test_generator.classes)
#print(test_generator.class_indices)
#print(test_generator.filenames)
#test_generator.reset()
#image,label = test_generator.next()
#import matplotlib.pyplot as plt
#plt.imshow(image.reshape(20,20,3))
#plt.show()