| 73 | |
| 74 | |
| 75 | class DSSM(): |
| 76 | def __init__(self, |
| 77 | user_column=None, |
| 78 | item_column=None, |
| 79 | dnn_hidden_units=[256, 128, 64, 32], |
| 80 | optimizer_type='adam', |
| 81 | batch_size=0, |
| 82 | learning_rate=0.001, |
| 83 | use_bn=True, |
| 84 | inputs=None, |
| 85 | bf16=False, |
| 86 | stock_tf=None, |
| 87 | adaptive_emb=False, |
| 88 | input_layer_partitioner=None, |
| 89 | dense_layer_partitioner=None): |
| 90 | if not inputs: |
| 91 | raise ValueError("Dataset is not defined.") |
| 92 | self._feature = inputs[0] |
| 93 | self._label = inputs[1] |
| 94 | |
| 95 | self._user_column = user_column |
| 96 | self._item_column = item_column |
| 97 | if not user_column or not item_column: |
| 98 | raise ValueError('User column or item column is not defined.') |
| 99 | |
| 100 | self.tf = stock_tf |
| 101 | self.bf16 = False if self.tf else bf16 |
| 102 | self.is_training = True |
| 103 | self._adaptive_emb = adaptive_emb |
| 104 | |
| 105 | self._dnn_hidden_units = dnn_hidden_units |
| 106 | self._dnn_last_hidden_units = self._dnn_hidden_units.pop() |
| 107 | self._batch_size = batch_size |
| 108 | self._learning_rate = learning_rate |
| 109 | self._use_bn = use_bn |
| 110 | self._optimizer_type = optimizer_type |
| 111 | self._input_layer_partitioner = input_layer_partitioner |
| 112 | self._dense_layer_partitioner = dense_layer_partitioner |
| 113 | |
| 114 | self._create_model() |
| 115 | with tf.name_scope('head'): |
| 116 | self._create_loss() |
| 117 | self._create_optimizer() |
| 118 | self._create_metrics() |
| 119 | |
| 120 | # used to add summary in tensorboard |
| 121 | def _add_layer_summary(self, value, tag): |
| 122 | tf.summary.scalar('%s/fraction_of_zero_values' % tag, |
| 123 | tf.nn.zero_fraction(value)) |
| 124 | tf.summary.histogram('%s/activation' % tag, value) |
| 125 | |
| 126 | def _dnn_tower(self, net, name): |
| 127 | with tf.variable_scope(name + '_layer', |
| 128 | partitioner=self._dense_layer_partitioner, |
| 129 | reuse=tf.AUTO_REUSE): |
| 130 | for layer_id, num_hidden_units in enumerate( |
| 131 | self._dnn_hidden_units): |
| 132 | with tf.variable_scope(name + '_%d' % layer_id, |