diff --git a/test.py b/test.py index e0b2abf..d280894 100644 --- a/test.py +++ b/test.py @@ -1,67 +1,191 @@ import tensorflow as tf import numpy as np +from tensorflow import keras as k from tensorflow.keras import layers as kl from tensorflow.keras import models as km from tensorflow.keras import optimizers as ko +CONV_SIZE = 128 +MPPT_SIZE = 1024 +DRPT_RATE = 0.3 +TOUT_AMNT = 2 + +def conv(i, n, s, t = (1, 1)): + c = kl.Conv2D(n, s, padding = 'same', strides = t)(i) + b = kl.BatchNormalization()(c) + return kl.Activation('relu')(b) + +def avg(i, s): + return kl.AveragePooling2D(s, padding = 'same')(i) + +def max(i, s): + return kl.MaxPooling2D(s, padding = 'same')(i) + +def generate_start(i): + r1 = conv(i, CONV_SIZE, (3, 3)) + r2 = conv(r1, CONV_SIZE, (3, 3)) + r3 = conv(r2, CONV_SIZE, (3, 3)) + + m1 = kl.MaxPooling2D((3, 3))(r3) + + r4 = conv(m1, CONV_SIZE, (1, 1)) + r5 = conv(r4, CONV_SIZE, (3, 3)) + + return kl.MaxPooling2D((3, 3))(r5) + +def generate_type_a(i): + a11 = conv(i, CONV_SIZE, (1, 1), (3, 3)) + + a21 = avg(i, (3, 3)) + a22 = conv(a21, CONV_SIZE, (1, 1)) + + a31 = conv(i, CONV_SIZE, (1, 1)) + a32 = conv(a31, CONV_SIZE, (3, 3), (3, 3)) + + a41 = conv(i, CONV_SIZE, (1, 1)) + a42 = conv(a41, CONV_SIZE, (3, 3)) + a43 = conv(a42, CONV_SIZE, (3, 3), (3, 3)) + + return kl.Concatenate()([a11, a22, a32, a43]) + +def generate_ab_bridge(i): + ab11 = conv(i, CONV_SIZE, (1, 1)) + ab12 = conv(ab11, CONV_SIZE, (3, 3)) + ab13 = conv(ab12, CONV_SIZE, (3, 3), (3, 3)) + + ab21 = conv(i, CONV_SIZE, (3, 3), (3, 3)) + + ab31 = max(i, (3, 3)) + + return kl.Concatenate()([ab13, ab21, ab31]) + +def generate_type_b(i): + b11 = conv(i, CONV_SIZE, (1, 1)) + b12 = conv(b11, CONV_SIZE, (7, 1)) + b13 = conv(b12, CONV_SIZE, (1, 7)) + b14 = conv(b13, CONV_SIZE, (7, 1)) + b15 = conv(b14, CONV_SIZE, (1, 7), (3, 3)) + + b21 = conv(i, CONV_SIZE, (1, 1)) + b22 = conv(b21, CONV_SIZE, (1, 7)) + b23 = conv(b22, CONV_SIZE, (7, 1), (3, 3)) + + b31 = conv(i, CONV_SIZE, (1, 1), (3, 3)) + + b41 = avg(i, (3, 3)) + b42 = conv(b41, CONV_SIZE, (1, 1)) + + return kl.Concatenate()([b15, b23, b31, b42]) + +def generate_bc_bridge(i): + bc11 = conv(i, CONV_SIZE, (1, 1)) + bc12 = conv(bc11, CONV_SIZE, (7, 1)) + bc13 = conv(bc12, CONV_SIZE, (1, 7)) + bc14 = conv(bc13, CONV_SIZE, (3, 3), (3, 3)) + + bc21 = conv(i, CONV_SIZE, (1, 1)) + bc22 = conv(bc21, CONV_SIZE, (1, 1), (3, 3)) + + bc31 = max(i, (3, 3)) + + return kl.Concatenate()([bc14, bc22, bc31]) + +def generate_aux(i): + u1 = kl.AveragePooling2D((5, 5))(i) + u2 = conv(u1, CONV_SIZE, (1, 1)) + u3 = kl.Flatten()(u2) + u4 = kl.Dropout(DRPT_RATE)(u3) + u5 = kl.Dense(MPPT_SIZE)(u4) + + return kl.Dense(TOUT_AMNT)(u5) + +def generate_type_c(i): + c11 = conv(i, CONV_SIZE, (1, 1)) + c12 = conv(c11, CONV_SIZE, (3, 3)) + c13 = conv(c12, CONV_SIZE, (1, 3), (3, 3)) + c14 = conv(c12, CONV_SIZE, (3, 1), (3, 3)) + + c21 = conv(i, CONV_SIZE, (1, 1)) + c22 = conv(c21, CONV_SIZE, (1, 3), (3, 3)) + c23 = conv(c21, CONV_SIZE, (3, 1), (3, 3)) + + c31 = max(i, (3, 3)) + c32 = conv(c31, CONV_SIZE, (1, 1)) + + c41 = conv(i, CONV_SIZE, (1, 1)) + + return kl.Concatenate()([c14, c23, c32, c41]) + +def generate_finish(i): + f1 = kl.AveragePooling2D((5, 5))(i) + f2 = conv(f1, CONV_SIZE, (1, 1)) + f3 = kl.Flatten()(f2) + f4 = kl.Dropout(DRPT_RATE)(f3) + f5 = kl.Dense(MPPT_SIZE)(f4) + + return kl.Dense(TOUT_AMNT)(f5) + +''' def generate_inception_model(a = 5, b = 4, c = 2): # start i = kl.Input(shape = (300, 300, 3)) - r1 = kl.Conv2D(1024, (3, 3), padding = 'same', activation = 'relu')(i) - r2 = kl.Conv2D(1024, (5, 5), padding = 'same', activation = 'relu')(r1) - r3 = kl.Conv2D(1024, (7, 7), padding = 'same', activation = 'relu')(r2) + r1 = kl.Conv2D(CONV_SIZE, (3, 3), padding = 'same', activation = 'relu')(i) + r2 = kl.Conv2D(CONV_SIZE, (5, 5), padding = 'same', activation = 'relu')(r1) + r3 = kl.Conv2D(CONV_SIZE, (7, 7), padding = 'same', activation = 'relu')(r2) m1 = kl.MaxPooling2D((3, 3))(r3) - r4 = kl.Conv2D(1024, (3, 3), padding = 'same', activation = 'relu')(m1) - r5 = kl.Conv2D(1024, (5, 5), padding = 'same', activation = 'relu')(r4) + r4 = kl.Conv2D(CONV_SIZE, (3, 3), padding = 'same', activation = 'relu')(m1) + r5 = kl.Conv2D(CONV_SIZE, (5, 5), padding = 'same', activation = 'relu')(r4) ia0 = kl.MaxPooling2D((2, 2))(r5) # a types for k in range(a): - exec(f"ia{k}_1_1 = kl.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(ia{k})") + exec(f"ia{k}_1_1 = kl.Conv2D(CONV_SIZE, (1, 1), padding = 'same', activation = 'relu')(ia{k})") - exec(f"ia{k}_3_1 = kl.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(ia{k})") - exec(f"ia{k}_3_2 = kl.Conv2D(1024, (3, 1), padding = 'same', activation = 'relu')(ia{k}_3_1)") + exec(f"ia{k}_3_1 = kl.Conv2D(CONV_SIZE, (1, 1), padding = 'same', activation = 'relu')(ia{k})") + exec(f"ia{k}_3_2 = kl.Conv2D(CONV_SIZE, (3, 1), padding = 'same', activation = 'relu')(ia{k}_3_1)") - exec(f"ia{k}_5_1 = kl.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(ia{k})") - exec(f"ia{k}_5_2 = kl.Conv2D(1024, (3, 1), padding = 'same', activation = 'relu')(ia{k}_5_1)") - exec(f"ia{k}_5_3 = kl.Conv2D(1024, (5, 1), padding = 'same', activation = 'relu')(ia{k}_5_2)") + exec(f"ia{k}_5_1 = kl.Conv2D(CONV_SIZE, (1, 1), padding = 'same', activation = 'relu')(ia{k})") + exec(f"ia{k}_5_2 = kl.Conv2D(CONV_SIZE, (3, 1), padding = 'same', activation = 'relu')(ia{k}_5_1)") + exec(f"ia{k}_5_3 = kl.Conv2D(CONV_SIZE, (5, 1), padding = 'same', activation = 'relu')(ia{k}_5_2)") - exec(f"ia{k}_7_1 = kl.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(ia{k})") - exec(f"ia{k}_7_2 = kl.Conv2D(1024, (3, 1), padding = 'same', activation = 'relu')(ia{k}_7_1)") - exec(f"ia{k}_7_3 = kl.Conv2D(1024, (5, 1), padding = 'same', activation = 'relu')(ia{k}_7_2)") - exec(f"ia{k}_7_4 = kl.Conv2D(1024, (7, 1), padding = 'same', activation = 'relu')(ia{k}_7_3)") + exec(f"ia{k}_7_1 = kl.Conv2D(CONV_SIZE, (1, 1), padding = 'same', activation = 'relu')(ia{k})") + exec(f"ia{k}_7_2 = kl.Conv2D(CONV_SIZE, (3, 1), padding = 'same', activation = 'relu')(ia{k}_7_1)") + exec(f"ia{k}_7_3 = kl.Conv2D(CONV_SIZE, (5, 1), padding = 'same', activation = 'relu')(ia{k}_7_2)") + exec(f"ia{k}_7_4 = kl.Conv2D(CONV_SIZE, (7, 1), padding = 'same', activation = 'relu')(ia{k}_7_3)") exec(f"ia{k+1} = kl.Concatenate()([ia{k}_1_1, ia{k}_3_2, ia{k}_5_3, ia{k}_7_4])") # grid size reductor 1 - iab_1 = kl.Conv2D(1024, (5, 1), padding = 'same', activation = 'relu')(eval(f"ia{a}")) + iab_1 = kl.Conv2D(CONV_SIZE, (5, 1), padding = 'same', activation = 'relu', strides = (2,2))(eval(f"ia{a}")) - iab_2 = kl.Conv2D(1024, (5, 1), padding = 'same', activation = 'relu')(eval(f"ia{a}")) - iab_3 = kl.Conv2D(1024, (3, 1), padding = 'same', activation = 'relu')(iab_2) - iab_4 = kl.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(iab_3) + iab_2 = kl.Conv2D(CONV_SIZE, (5, 1), padding = 'same', activation = 'relu')(eval(f"ia{a}")) + iab_3 = kl.Conv2D(CONV_SIZE, (3, 1), padding = 'same', activation = 'relu')(iab_2) + iab_4 = kl.Conv2D(CONV_SIZE, (1, 1), padding = 'same', activation = 'relu', strides = (2,2))(iab_3) + + iab_5 = kl.MaxPooling2D((2, 2), padding = 'same')(eval(f"ia{a}")) iab_6 = kl.Concatenate()([iab_1, iab_4, iab_5]) # b types for k in range(b): exec(f"ib{k}_1_1 = kl.MaxPooling2D((2, 2), padding = 'same')(iab_6)") - exec(f"ib{k}_1_2 = kl.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(i)") + exec(f"ib{k}_1_2 = kl.Conv2D(CONV_SIZE, (1, 1), strides = (2,2), padding = 'same', activation = 'relu')(i)") - exec(f"ib{k}_3_1 = kl.Conv2D(1024, (3, 1), padding = 'same', activation = 'relu')(iab_6)") + exec(f"ib{k}_3_1 = kl.Conv2D(CONV_SIZE, (3, 1), padding = 'same', activation = 'relu')(iab_6)") - exec(f"ib{k}_5_1 = kl.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(iab_6)") - exec(f"ib{k}_5_2 = kl.Conv2D(1024, (3, 1), padding = 'same', activation = 'relu')(ib{k}_5_1)") - exec(f"ib{k}_5_3 = kl.Conv2D(1024, (5, 1), padding = 'same', activation = 'relu')(ib{k}_5_2)") + exec(f"ib{k}_5_1 = kl.Conv2D(CONV_SIZE, (1, 1), padding = 'same', activation = 'relu')(iab_6)") + exec(f"ib{k}_5_2 = kl.Conv2D(CONV_SIZE, (3, 1), padding = 'same', activation = 'relu')(ib{k}_5_1)") + exec(f"ib{k}_5_3 = kl.Conv2D(CONV_SIZE, (5, 1), padding = 'same', activation = 'relu')(ib{k}_5_2)") - exec(f"ib{k}_7_1 = kl.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(iab_6)") - exec(f"ib{k}_7_2 = kl.Conv2D(1024, (3, 1), padding = 'same', activation = 'relu')(ib{k}_7_1)") - exec(f"ib{k}_7_3 = kl.Conv2D(1024, (5, 1), padding = 'same', activation = 'relu')(ib{k}_7_2)") - exec(f"ib{k}_7_4 = kl.Conv2D(1024, (7, 1), padding = 'same', activation = 'relu')(ib{k}_7_3)") + exec(f"ib{k}_7_1 = kl.Conv2D(CONV_SIZE, (1, 1), padding = 'same', activation = 'relu')(iab_6)") + exec(f"ib{k}_7_2 = kl.Conv2D(CONV_SIZE, (3, 1), padding = 'same', activation = 'relu')(ib{k}_7_1)") + exec(f"ib{k}_7_3 = kl.Conv2D(CONV_SIZE, (5, 1), padding = 'same', activation = 'relu')(ib{k}_7_2)") + exec(f"ib{k}_7_4 = kl.Conv2D(CONV_SIZE, (7, 1), padding = 'same', activation = 'relu')(ib{k}_7_3)") exec(f"ib{k+1} = kl.Concatenate()([ib{k}_1_2, ib{k}_3_2, ib{k}_5_3, ib{k}_7_4])") @@ -69,18 +193,18 @@ def generate_inception_model(a = 5, b = 4, c = 2): # c types for k in range(c): - exec(f"ic{k}_1_1 = kl.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(i{'b' if k else 'a'}{k if k else a})") + exec(f"ic{k}_1_1 = kl.Conv2D(CONV_SIZE, (1, 1), padding = 'same', activation = 'relu')(i{'b' if k else 'a'}{k if k else a})") - exec(f"ic{k}_3_1 = kl.Conv2D(1024, (3, 1), padding = 'same', activation = 'relu')(i{'b' if k else 'a'}{k if k else a})") + exec(f"ic{k}_3_1 = kl.Conv2D(CONV_SIZE, (3, 1), padding = 'same', activation = 'relu')(i{'b' if k else 'a'}{k if k else a})") - exec(f"ic{k}_5_1 = kl.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(i{'b' if k else 'a'}{k if k else a})") - exec(f"ic{k}_5_2 = kl.Conv2D(1024, (3, 1), padding = 'same', activation = 'relu')(ib{k}_5_1)") - exec(f"ic{k}_5_3 = kl.Conv2D(1024, (5, 1), padding = 'same', activation = 'relu')(ib{k}_5_2)") + exec(f"ic{k}_5_1 = kl.Conv2D(CONV_SIZE, (1, 1), padding = 'same', activation = 'relu')(i{'b' if k else 'a'}{k if k else a})") + exec(f"ic{k}_5_2 = kl.Conv2D(CONV_SIZE, (3, 1), padding = 'same', activation = 'relu')(ib{k}_5_1)") + exec(f"ic{k}_5_3 = kl.Conv2D(CONV_SIZE, (5, 1), padding = 'same', activation = 'relu')(ib{k}_5_2)") - exec(f"ic{k}_7_1 = kl.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(i{'b' if k else 'a'}{k if k else a})") - exec(f"ic{k}_7_2 = kl.Conv2D(1024, (3, 1), padding = 'same', activation = 'relu')(ib{k}_7_1)") - exec(f"ic{k}_7_3 = kl.Conv2D(1024, (5, 1), padding = 'same', activation = 'relu')(ib{k}_7_2)") - exec(f"ic{k}_7_4 = kl.Conv2D(1024, (7, 1), padding = 'same', activation = 'relu')(ib{k}_7_3)") + exec(f"ic{k}_7_1 = kl.Conv2D(CONV_SIZE, (1, 1), padding = 'same', activation = 'relu')(i{'b' if k else 'a'}{k if k else a})") + exec(f"ic{k}_7_2 = kl.Conv2D(CONV_SIZE, (3, 1), padding = 'same', activation = 'relu')(ib{k}_7_1)") + exec(f"ic{k}_7_3 = kl.Conv2D(CONV_SIZE, (5, 1), padding = 'same', activation = 'relu')(ib{k}_7_2)") + exec(f"ic{k}_7_4 = kl.Conv2D(CONV_SIZE, (7, 1), padding = 'same', activation = 'relu')(ib{k}_7_3)") exec(f"ib{k+1} = kl.Concatenate()([ib{k}_1_1, ib{k}_3_2, ib{k}_5_3, ib{k}_7_4])") @@ -88,6 +212,7 @@ def generate_inception_model(a = 5, b = 4, c = 2): o = eval(f"ic{c}") return tf.keras.Model(inputs = i, outputs = o) +''' ''' @@ -111,6 +236,31 @@ inception_type_a = [a_i, a_o] tf.keras.Model(*inception_type_a) ''' -mod = generate_inception_model() +gi = kl.Input((300, 300, 3)) + +ds = generate_start(gi) + +for _ in range(5): + ds = generate_type_a(ds) + +ds = generate_ab_bridge(ds) + +for _ in range(4): + ds = generate_type_b(ds) + +uo = generate_aux(ds) + +go = generate_bc_bridge(ds) + +for _ in range(2): + go = generate_type_c(go) + +go = generate_finish(go) + +r = kl.Concatenate()([uo, go]) + + +mod = k.Model(inputs = gi, outputs = r) + mod.summary() mod.compile(optimizer = ko.Lion(learning_rate = 0.001))