File size: 4,910 Bytes
53113a9
9ba13b7
53113a9
 
 
 
 
 
34dd37c
53113a9
34dd37c
53113a9
 
 
 
 
34dd37c
53113a9
34dd37c
 
 
53113a9
34dd37c
 
 
 
 
 
 
 
 
 
 
 
 
53113a9
 
34dd37c
 
9ba13b7
34dd37c
 
 
53113a9
 
34dd37c
 
53113a9
 
34dd37c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53113a9
 
34dd37c
53113a9
34dd37c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53113a9
 
34dd37c
53113a9
34dd37c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53113a9
 
34dd37c
9ba13b7
34dd37c
9ba13b7
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
---
license: mit
library_name: bpnet
tags:
  - bpnet
  - dna
  - genomics
  - transcription-factor-binding
  - chip-seq
  - encode
  - encode-bpnet-atlas
  - hg38
  - qc-passed
  - REST
---

# ENCODE BPNet Atlas

As part of the ENCODE 4 Project, we trained BPNet models on 2,339 ENCODE
transcription factor ChIP-seq experiments spanning 788 targets across
175 biosamples. Here, we provide all models for open-source use.

For more information about the models, see:

- Main ENCODE 4 Paper
- A unified lexicon of predictive DNA sequence motifs from ENCODE transcription
  factor binding and chromatin accessibility assays (Deshpande et al., Zenodo 2025)
- Base-resolution models of transcription-factor binding reveal soft motif syntax
  (Avsec et al., Nat Genet 2021)

## BPNet model: REST ChIP-seq in HCT116 (ENCSR000BVI)

- Model: BPNet
- Assay: TF ChIP-seq
- Target: REST
- Experiment: [ENCSR000BVI](https://www.encodeproject.org/experiments/ENCSR000BVI/)
- Model annotation: [ENCSR148KXV](https://www.encodeproject.org/annotations/ENCSR148KXV/)
- Biosample: HCT116 (Full name: Homo sapiens HCT116)
- Cell slim(s): cancer cell, epithelial cell
- Organ slim(s): epithelium, colon, large intestine, intestine
- Developmental slim(s): endoderm
- System slim(s): digestive system
- Assembly: hg38

## QC

- Status: passed
- Notes: Found direct motif (counts, profile);

## Directory structure

5-fold cross-validation. Each `fold_*/` contains the trained BPNet model in two formats:

- `fold_0/model.h5` — BPNet model in .h5 (Keras) format
- `fold_0/saved_model/` — BPNet model in TensorFlow SavedModel format (a directory; load directly)
- `config.json` — training / architecture parameters

## Instructions

BPNet takes a one-hot DNA sequence plus control (bias) inputs and predicts
stranded profile logits and total logcounts. The control inputs come from the
matched WCE/Input DNA control and **can be passed as zeros**.

### 1. Loading the SavedModel and making predictions

```python
import numpy as np
import tensorflow as tf
from scipy.special import logsumexp

model = tf.saved_model.load("fold_0/saved_model")
# sequence: (N, 2114, 4) one-hot [A,C,G,T]
# profile_bias_input: (N, 1000, 2) per-base profile bias from WCE/Input control, or zeros
# counts_bias_input:  (N, 2) log2 total counts from WCE/Input control, or zeros
predictions = model.signatures["serving_default"](**{
    "sequence": sequence.astype("float32"),
    "profile_bias_input_0": profile_bias_input.astype("float32"),
    "counts_bias_input_0": counts_bias_input.astype("float32")})
# predictions["profile_predictions"]:   (N, 1000, 2) logits (strands NOT independent)
# predictions["logcounts_predictions"]: (N, 1) total logcount

output_len = 1000
def vectorized_prediction_to_profile(predictions):
    logits_arr = predictions["profile_predictions"]
    counts_arr = predictions["logcounts_predictions"]
    pred_profile_logits = np.reshape(logits_arr, [-1, 1, output_len * 2])
    probVals_array = np.exp(pred_profile_logits - logsumexp(
        pred_profile_logits, axis=2).reshape([len(logits_arr), 1, 1]))
    profile_predictions = np.multiply(
        np.exp(counts_arr).reshape([len(counts_arr), 1, 1]), probVals_array)
    plus  = np.reshape(profile_predictions, [len(counts_arr), output_len, 2])[:, :, 0]
    minus = np.reshape(profile_predictions, [len(counts_arr), output_len, 2])[:, :, 1]
    return plus, minus, counts_arr

plus, minus, logcounts = vectorized_prediction_to_profile(predictions)
```

### 2. Loading the .h5 (Keras) and making predictions

```python
import numpy as np
import tensorflow as tf
import tensorflow.keras.backend as kb
from tensorflow.keras.models import load_model
from tensorflow.keras.utils import CustomObjectScope
from bpnet.model.custommodel import CustomModel

def get_model(model_path):
    with CustomObjectScope({"kb": kb, "tf": tf, "CustomModel": CustomModel}):
        return load_model(model_path)

model = get_model("fold_0/model.h5")
N = sequence.shape[0]
predictions = model.predict([
    sequence,                     # (N, 2114, 4)
    np.zeros((N, 1000, 2)),       # profile_bias_input (or real WCE/Input control values)
    np.zeros((N, 2))])            # counts_bias_input  (or real control log2 counts)
# predictions[0]: (N, 1000, 2) logits;  predictions[1]: (N, 1) logcounts
# convert with the same vectorized_prediction_to_profile() (predictions[0], predictions[1])
```

## Docker image to load and use the models

`kundajelab/bpnet-atlas` (placeholder — image forthcoming).

## Code

- Code: https://github.com/kundajelab/bpnet/
- Toolbox & downstream analysis: https://github.com/kundajelab/bpnet/wiki

## License & citation

Released under the MIT license.

The models are derived from ENCODE data (unrestricted use under the ENCODE
data-use policy). Please cite the ENCODE Project Consortium and the model
software: BPNet (Avsec et al., Nat Genet 2021).