Repository: deepchem/deepchem
Issue: ConvMolFeaturizer does not work with qm9

## 🐛 Bug
Cannot generate features for QM9 with ConvMolFeaturizer. 

Additionally, this featurizer works with the example in the mol_graph_conv_featurizer.py. 

## To Reproduce
just test the following line:
dc.molnet.load_qm9(featurizer=dc.feat.ConvMolFeaturizer())

Here is my output: 

Failed to featurize datapoint 1663, [H]N(C(=O)N(C([H])([H])[H])C([H])([H])[H])C([H])([H])[H]. Appending empty array
Exception message: Pre-condition Violation
	getNumImplicitHs() called without preceding call to calcImplicitValence()
	Violation occurred on line 188 in file Code/GraphMol/Atom.cpp
	Failed Expression: d_implicitValence > -1
	RDKIT: 2020.09.3
	BOOST: 1_74

[08:17:56] 

****
Pre-condition Violation
getNumImplicitHs() called without preceding call to calcImplicitValence()
Violation occurred on line 188 in file /home/conda/feedstock_root/build_artifacts/rdkit_1607861336837/work/Code/GraphMol/Atom.cpp
Failed Expression: d_implicitValence > -1
****
_[ This happens for all the samples ]_

## Expected behavior
the returned value should be the dataset featurized with no error. 

## Environment

* OS: Ubuntu 20.04.1
* Python version: 3.7.9
* DeepChem version: 2.4.0.dev
* RDKit version (optional): 2020.09.3
* TensorFlow version (optional): 2.3.1
* PyTorch version (optional): N/A
* BOOST: 1_74

## Additional context

I had no problem until the last update.


Changed files:
deepchem/molnet/load_function/qm7_datasets.py, deepchem/molnet/load_function/qm8_datasets.py, deepchem/molnet/load_function/qm9_datasets.py

diff --git a/deepchem/molnet/load_function/qm7_datasets.py b/deepchem/molnet/load_function/qm7_datasets.py
index fb5c87501..2bc53938d 100644
--- a/deepchem/molnet/load_function/qm7_datasets.py
+++ b/deepchem/molnet/load_function/qm7_datasets.py
@@ -22,7 +22,8 @@ class _QM7Loader(_MolnetLoader):
       dc.utils.data_utils.download_url(url=GDB7_URL, dest_dir=self.data_dir)
       dc.utils.data_utils.untargz_file(
           os.path.join(self.data_dir, "gdb7.tar.gz"), self.data_dir)
-    loader = dc.data.SDFLoader(tasks=self.tasks, featurizer=self.featurizer)
+    loader = dc.data.SDFLoader(
+        tasks=self.tasks, featurizer=self.featurizer, sanitize=True)
     return loader.create_dataset(dataset_file, shard_size=8192)
 
 
@@ -81,6 +82,17 @@ def load_qm7(
   save_dir: str
     a directory to save the dataset in
 
+  Note
+  ----
+  DeepChem 2.4.0 has turned on sanitization for this dataset by
+  default.  For the QM7 dataset, this means that calling this
+  function will return 6838 compounds instead of 7160 in the source
+  dataset file.  This appears to be due to valence specification
+  mismatches in the dataset that weren't caught in earlier more lax
+  versions of RDKit.  Note that this may subtly affect benchmarking
+  results on this
+  dataset.
+
   References
   ----------
   .. [1] Rupp, Matthias, et al. "Fast and accurate modeling of molecular
diff --git a/deepchem/molnet/load_function/qm8_datasets.py b/deepchem/molnet/load_function/qm8_datasets.py
index 4271cea5d..b68a75f5f 100644
--- a/deepchem/molnet/load_function/qm8_datasets.py
+++ b/deepchem/molnet/load_function/qm8_datasets.py
@@ -24,7 +24,8 @@ class _QM8Loader(_MolnetLoader):
       dc.utils.data_utils.download_url(url=GDB8_URL, dest_dir=self.data_dir)
       dc.utils.data_utils.untargz_file(
           os.path.join(self.data_dir, "gdb8.tar.gz"), self.data_dir)
-    loader = dc.data.SDFLoader(tasks=self.tasks, featurizer=self.featurizer)
+    loader = dc.data.SDFLoader(
+        tasks=self.tasks, featurizer=self.featurizer, sanitize=True)
     return loader.create_dataset(dataset_file, shard_size=8192)
 
 
@@ -90,6 +91,16 @@ def load_qm8(
   save_dir: str
     a directory to save the dataset in
 
+  Note
+  ----
+  DeepChem 2.4.0 has turned on sanitization for this dataset by
+  default.  For the QM8 dataset, this means that calling this
+  function will return 21747 compounds instead of 21786 in the source
+  dataset file.  This appears to be due to valence specification
+  mismatches in the dataset that weren't caught in earlier more lax
+  versions of RDKit.  Note that this may subtly affect benchmarking
+  results on this dataset.
+
   References
   ----------
   .. [1] Blum, Lorenz C., and Jean-Louis Reymond. "970 million druglike
diff --git a/deepchem/molnet/load_function/qm9_datasets.py b/deepchem/molnet/load_function/qm9_datasets.py
index f894f4add..e3a3ebc79 100644
--- a/deepchem/molnet/load_function/qm9_datasets.py
+++ b/deepchem/molnet/load_function/qm9_datasets.py
@@ -23,7 +23,8 @@ class _QM9Loader(_MolnetLoader):
       dc.utils.data_utils.download_url(url=GDB9_URL, dest_dir=self.data_dir)
       dc.utils.data_utils.untargz_file(
           os.path.join(self.data_dir, "gdb9.tar.gz"), self.data_dir)
-    loader = dc.data.SDFLoader(tasks=self.tasks, featurizer=self.featurizer)
+    loader = dc.data.SDFLoader(
+        tasks=self.tasks, featurizer=self.featurizer, sanitize=True)
     return loader.create_dataset(dataset_file, shard_size=8192)
 
 
@@ -39,10 +40,10 @@ def load_qm9(
   """Load QM9 dataset
 
   QM9 is a comprehensive dataset that provides geometric, energetic,
-  electronic and thermodynamic properties for a subset of GDB-17 database,
-  comprising 134 thousand stable organic molecules with up to 9 heavy atoms.
-  All molecules are modeled using density functional theory
-  (B3LYP/6-31G(2df,p) based DFT).
+  electronic and thermodynamic properties for a subset of GDB-17
+  database, comprising 134 thousand stable organic molecules with up
+  to 9 heavy atoms.  All molecules are modeled using density
+  functional theory (B3LYP/6-31G(2df,p) based DFT).
 
   Random splitting is recommended for this dataset.
 
@@ -99,6 +100,16 @@ def load_qm9(
   save_dir: str
     a directory to save the dataset in
 
+  Note
+  ----
+  DeepChem 2.4.0 has turned on sanitization for this dataset by
+  default.  For the QM9 dataset, this means that calling this
+  function will return 132480 compounds instead of 133885 in the
+  source dataset file. This appears to be due to valence
+  specification mismatches in the dataset that weren't caught in
+  earlier more lax versions of RDKit. Note that this may subtly
+  affect benchmarking results on this dataset.
+
   References
   ----------
   .. [1] Blum, Lorenz C., and Jean-Louis Reymond. "970 million druglike small