-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprojeto_1.py
111 lines (92 loc) · 3.16 KB
/
projeto_1.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
# from dvclive.keras import DvcLiveCallback
from tensorflow.keras import layers, Sequential, optimizers
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import pathlib
class Training:
def __init__(self, params):
self.params = params
self.model_filepath = params['model_filepath']
self.batch_size = params['batch_size']
self.hwc = (
self.params['input_height'],
self.params['input_width'],
self.params['input_channels'],
)
self.hw = (
self.params['input_height'],
self.params['input_width'],
)
def build_model(self):
self.model = Sequential([
layers.Conv2D(6, (5, 5), activation='relu', input_shape=self.hwc),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(16, (5, 5), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Flatten(),
layers.Dense(120, activation='relu'),
layers.Dense(84, activation='relu'),
layers.Dense(1, activation='sigmoid')
])
self.model.compile(
optimizer=optimizers.Adam(0.001),
loss='binary_crossentropy',
metrics=['accuracy'],
)
return self
def load_ds(self):
# Data Augumentation
train_datagen = ImageDataGenerator(
rescale=1.0 / 255.0,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
channel_shift_range=10,
horizontal_flip=True,
fill_mode='nearest'
)
train_ds = train_datagen.flow_from_directory(
'./ds/train',
target_size=self.hw,
interpolation='bicubic',
class_mode='binary',
shuffle=True,
batch_size=self.batch_size
)
val_datagen = ImageDataGenerator(rescale=1.0/255.0)
val_ds = val_datagen.flow_from_directory(
'./ds/valid',
target_size=self.hw,
class_mode='binary',
shuffle=False,
batch_size=self.batch_size
)
return train_ds, val_ds
def train(self):
train_ds, val_ds = self.load_ds()
self.model.fit(
train_ds,
steps_per_epoch=train_ds.samples // self.batch_size,
validation_data=val_ds,
validation_steps=val_ds.samples // self.batch_size,
epochs=self.params['epochs'],
verbose=self.params['verbose'],
)
return self
def save_model(self):
pathlib.Path(self.model_filepath).unlink(missing_ok=True)
self.model.save(self.model_filepath)
def main():
params = {
"input_height": 224,
"input_width": 224,
"input_channels": 3,
"batch_size": 64,
"epochs": 10,
"verbose": 1,
"model_filepath": "./model.keras",
}
Training(params).build_model().train().save_model()
if __name__ == '__main__':
main()