The documentation on __init__ explains that the first cost must be unsupervised and the second must be the supervised one. 

I'm not sure how __init__ could do any more than this without checking the dimensions of the layers against the data (which is exactly what the self.get_data_specs(model)[0].validate(data) line does)