input_shape = (img_w, img_h, 1)
# Make Network
inputs = Input(name='the_input', shape=input_shape, dtype='float32')
# Convolution layer (VGG)
inner = Conv2D(64, (3, 3), padding='same', name='conv1', kernel_initializer='he_normal', kernel_regularizer = regularizers.l2(l_cnn))(inputs)
inner = BatchNormalization()(inner)
inner = Activation('relu')(inner)
inner = Dropout(drop)(inner)
inner = MaxPooling2D(pool_size=(2, 2), name='max1')(inner)
inner = Conv2D(128, (3, 3), padding='same', name='conv2', kernel_initializer='he_normal', kernel_regularizer = regularizers.l2(l_cnn))(inner)
inner = BatchNormalization()(inner)
inner = Activation('relu')(inner)
inner = Dropout(drop)(inner)
inner = MaxPooling2D(pool_size=(2, 2), name='max2')(inner)
# inner = Conv2D(256, (3, 3), padding='same', name='conv3', kernel_initializer='he_normal')(inner)
# inner = BatchNormalization()(inner)
# inner = Activation('relu')(inner)
inner = Conv2D(256, (3, 3), padding='same', name='conv4', kernel_initializer='he_normal', kernel_regularizer = regularizers.l2(l_cnn))(inner)
inner = BatchNormalization()(inner)
inner = Activation('relu')(inner)
inner = Dropout(drop)(inner)
inner = MaxPooling2D(pool_size=(1, 2), name='max3')(inner)
# inner = Conv2D(512, (3, 3), padding='same', name='conv5', kernel_initializer='he_normal')(inner)
inner = Conv2D(256, (3, 3), padding='same', name='conv5', kernel_initializer='he_normal', kernel_regularizer = regularizers.l2(l_cnn))(inner)
inner = BatchNormalization()(inner)
inner = Activation('relu')(inner)
inner = Dropout(drop)(inner)
# inner = Conv2D(512, (3, 3), padding='same', name='conv6')(inner)
# inner = BatchNormalization()(inner)
# inner = Activation('relu')(inner)
inner = MaxPooling2D(pool_size=(1, 2), name='max4')(inner)
inner = Conv2D(512, (2, 2), padding='same', kernel_initializer='he_normal', name='con7', kernel_regularizer = regularizers.l2(l_cnn))(inner)
inner = BatchNormalization()(inner)
inner = Activation('relu')(inner)
inner = Dropout(drop)(inner)
print(inner.shape)
# CNN to RNN
inner = Reshape(target_shape=((27, 1024)), name='reshape')(inner)
inner = Dense(64, activation='relu', kernel_initializer='he_normal', name='dense1')(inner)
inner = Dropout(drop)(inner)
# RNN layer
lstm = Bidirectional(LSTM(512, return_sequences=True, kernel_initializer='he_normal', name='lstm1', dropout=drop, recurrent_dropout=drop, recurrent_regularizer = regularizers.l2(l_lstm)))(inner)
# transforms RNN output to character activations:
inner = Dense(num_classes, kernel_initializer='he_normal',name='dense2')(lstm)
y_pred = Activation('softmax', name='softmax')(inner)