Repository navigation
Expand file tree
/
Copy pathtrain.py
More file actions
87 lines (59 loc) · 2.4 KB
/
Copy pathtrain.py
File metadata and controls
87 lines (59 loc) · 2.4 KB
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
from datetime import datetime
import pathlib
from typing import Any, Tuple
import typer
from tensorflow import keras
from tensorflow.keras.applications.xception import Xception
from tensorflow.keras.applications.xception import preprocess_input
from tensorflow.keras.preprocessing.image import ImageDataGenerator
def make_model(input_size=150, learning_rate=0.01, size_inner=100, droprate=0.5):
base_model = Xception(
weights="imagenet", include_top=False, input_shape=(input_size, input_size, 3)
)
base_model.trainable = False
#########################################
inputs = keras.Input(shape=(input_size, input_size, 3))
base = base_model(inputs, training=False)
vectors = keras.layers.GlobalAveragePooling2D()(base)
inner = keras.layers.Dense(size_inner, activation="relu")(vectors)
drop = keras.layers.Dropout(droprate)(inner)
outputs = keras.layers.Dense(2)(drop)
model = keras.Model(inputs, outputs)
#########################################
optimizer = keras.optimizers.Adam(learning_rate=learning_rate)
loss = keras.losses.CategoricalCrossentropy(from_logits=True)
model.compile(optimizer=optimizer, loss=loss, metrics=["accuracy"])
return model
def generate_train_val_ds(data_dir: str, input_size: int = 299) -> Any:
train_gen = ImageDataGenerator(
preprocessing_function=preprocess_input,
zoom_range=0.1,
horizontal_flip=True,
validation_split=0.2,
)
train_ds = train_gen.flow_from_directory(
data_dir, subset="training", target_size=(input_size, input_size), batch_size=32
)
val_ds = train_gen.flow_from_directory(
data_dir,
subset="validation",
target_size=(input_size, input_size),
batch_size=32,
shuffle=False,
)
return train_ds, val_ds
def main(
model_name: str = typer.Option(...),
train_data_path: str = typer.Option(...),
output_path: str = "./models",
input_size: int = 299,
):
data_dir = pathlib.Path(train_data_path)
final_model = make_model(input_size=input_size, learning_rate=0.2, size_inner=100, droprate=0.2)
train_ds, val_ds = generate_train_val_ds(data_dir)
final_model.fit(train_ds, epochs=10, validation_data=val_ds)
model_path = f"{output_path}/{model_name}.h5"
final_model.save(model_path)
print(f"Model saved to {model_path}")
if __name__ == "__main__":
typer.run(main)