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(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(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(CONV_SIZE, (1, 1), padding = 'same', activation = 'relu')(ia{k})") 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(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(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(CONV_SIZE, (5, 1), padding = 'same', activation = 'relu', strides = (2,2))(eval(f"ia{a}")) 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(CONV_SIZE, (1, 1), strides = (2,2), padding = 'same', activation = 'relu')(i)") 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(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(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])") # grid size reductor 2 # c types for k in range(c): 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(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(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(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])") # mppt o = eval(f"ic{c}") return tf.keras.Model(inputs = i, outputs = o) ''' ''' a_i = l.Input(shape = (300, 300, 3)) a_1_1 = l.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(a_i) a_3_1 = l.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(a_i) a_3_2 = l.Conv2D(1024, (3, 1), padding = 'same', activation = 'relu')(a_3_1) a_5_1 = l.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(a_i) a_5_2 = l.Conv2D(1024, (5, 1), padding = 'same', activation = 'relu')(a_5_1) a_7_1 = l.Conv2D(1024, (1, 1), padding = 'same', activation = 'relu')(a_i) a_7_2 = l.Conv2D(1024, (7, 1), padding = 'same', activation = 'relu')(a_7_1) a_o = l.Concatenate()([a_1_1, a_3_2, a_5_2, a_7_2]) inception_type_a = [a_i, a_o] tf.keras.Model(*inception_type_a) ''' 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))