def residual_layer(self, initial_input): # Residual layer as defined in literature output_1 = Conv2D(filters=Param.FILTER_PER_LAYER, kernel_size=Param.FILTER_KERNEL_SIZE, data_format="channels_first", padding='same', use_bias=False, activation='linear', kernel_regularizer=regularizers.l2( Param.L2_REG_CONST))(initial_input) output_2 = BN(axis=1)(output_1) output_3 = LR()(output_2) output_4 = Conv2D(filters=Param.FILTER_PER_LAYER, kernel_size=Param.FILTER_KERNEL_SIZE, data_format="channels_first", padding='same', use_bias=False, activation='linear', kernel_regularizer=regularizers.l2( Param.L2_REG_CONST))(output_3) output_5 = BN(axis=1)(output_4) output_6 = add([initial_input, output_5]) final_output = LR()(output_6) return final_output
def value_head(self, initial_input): # Value head as defined in literature output_1 = Conv2D( filters=1, kernel_size=(1, 1), # 1x1 convolution data_format="channels_first", padding='same', use_bias=False, activation='linear', kernel_regularizer=regularizers.l2( Param.L2_REG_CONST))(initial_input) output_2 = BN(axis=1)(output_1) output_3 = LR()(output_2) output_4 = Flatten()(output_3) output_5 = Dense( Param. FILTER_PER_LAYER, # Use same convention of having the same number of nodes here as filter layers use_bias=False, activation='linear', kernel_regularizer=regularizers.l2(Param.L2_REG_CONST))(output_4) output_6 = LR()(output_5) final_output = Dense(1, use_bias=False, activation='tanh', kernel_regularizer=regularizers.l2( Param.L2_REG_CONST), name='value_head')(output_6) return final_output
def residual_layer(self, initial_input): output_1 = Dense(hive_command.RES_LAYER_NODE_COUNT, use_bias=False, activation='sigmoid', kernel_regularizer=regularizers.l2( hive_command.L2_REG_CONST))(initial_input) output_2 = BN(axis=1)(output_1) output_3 = LR()(output_2) output_4 = Dense(hive_command.RES_LAYER_NODE_COUNT, use_bias=False, activation='sigmoid', kernel_regularizer=regularizers.l2( hive_command.L2_REG_CONST))(output_3) output_5 = BN(axis=1)(output_4) output_6 = add([initial_input, output_5]) final_output = LR()(output_6) return final_output
def policy_head(self, initial_input): # Policy head as defined in literature output_1 = Conv2D( filters=2, kernel_size=(1, 1), # 1x1 convolution data_format="channels_first", padding='same', use_bias=False, activation='linear', kernel_regularizer=regularizers.l2(Param.L2_REG_CONST), kernel_initializer='random_uniform')(initial_input) output_2 = BN(axis=1)(output_1) output_3 = LR()(output_2) output_4 = Flatten()(output_3) final_output = Dense( 361, # 19 * 19, use_bias=False, activation='linear', kernel_regularizer=regularizers.l2(Param.L2_REG_CONST), name='policy_head')(output_4) return final_output
def fertilize(self): initial_input = Input(hive_command.INPUT_DIM) output_1 = Dense( 128, use_bias=False, activation='sigmoid', kernel_regularizer=regularizers.l2(hive_command.L2_REG_CONST), )(initial_input) output_2 = Dense( hive_command.RES_LAYER_NODE_COUNT, use_bias=False, activation='sigmoid', kernel_regularizer=regularizers.l2(hive_command.L2_REG_CONST), )(output_1) output_3 = BN(axis=1)(output_2) res_input = LR()(output_3) res_output = res_input for i in range(0, hive_command.RES_LAYER_COUNT): res_output = self.residual_layer(res_input) res_input = res_output policy = Dense(11, use_bias=False, activation='linear', kernel_regularizer=regularizers.l2( hive_command.L2_REG_CONST), name='policy')(res_output) model = Model(inputs=[initial_input], outputs=[policy]) model.compile( loss='mean_squared_error', optimizer=Adam(lr=hive_command.INITIAL_LEARNING_RATE, beta_1=0.9, beta_2=0.999, epsilon=10E-8), ) return model
def build_model(self): # This function constructs the model initial_input = Input(Param.INPUT_DIM) output_1 = Conv2D(filters=Param.FILTER_PER_LAYER, kernel_size=Param.FILTER_KERNEL_SIZE, data_format="channels_first", padding='same', use_bias=False, activation='linear', kernel_regularizer=regularizers.l2( Param.L2_REG_CONST))(initial_input) output_2 = BN(axis=1)(output_1) res_input = LR()(output_2) res_output = res_input # Initialize res_output # Add residual layers for i in range(0, Param.RES_LAYER_COUNT): res_output = self.residual_layer(res_input) res_input = res_output value = self.value_head(res_output) policy = self.policy_head(res_output) model = Model(inputs=[initial_input], outputs=[value, policy]) # The fit method uses the Adam optimizer because SGD tends to cause the loss function to become unstable # (nans during training), and overall Adam performs better than SGD. model.compile(loss={ 'value_head': 'mean_squared_error', 'policy_head': loss_function }, optimizer=Adam(lr=Param.INITIAL_LEARNING_RATE, beta_1=0.9, beta_2=0.999, epsilon=10E-8), loss_weights={ 'value_head': 0.5, 'policy_head': 0.5 }) return model