def init_dueling(self, *,
                     action_dim,
                     prelinear_size,
                     fc_hidden_sizes,
                     dueling):
        """
        Args:
            - prelinear_size: size of feature vector before the linear layers,
                like flattened conv or LSTM features
            - fc_hidden_sizes: list of fully connected layer sizes before `action_dim` softmax
        """
        self.dueling = dueling
        self.prelinear_size = prelinear_size
        U.assert_type(fc_hidden_sizes, list)
        hiddens = [prelinear_size] + fc_hidden_sizes
        self.fc_action_layers = nn.ModuleList()
        hidden_list = hiddens + [action_dim]
        for prev_h, next_h in zip(hidden_list[:-1], hidden_list[1:]):
            lin = nn.Linear(prev_h, next_h)
            U.conv_fc_init(lin)
            self.fc_action_layers.append(lin)

        if dueling:
            self.fc_state_layers = nn.ModuleList()
            # output a single state value
            hidden_list = hiddens + [1]
            for prev_h, next_h in zip(hidden_list[:-1], hidden_list[1:]):
                lin = nn.Linear(prev_h, next_h)
                U.conv_fc_init(lin)
                self.fc_state_layers.append(lin)

        Args:
            - prelinear_size: size of feature vector before the linear layers,
                like flattened conv or LSTM features
            - fc_hidden_sizes: list of fully connected layer sizes before `action_dim` softmax
        
surreal/model/q_net.py