Download model/PXDesignBench/ColabDesign/colabdesign/tr/legacy/model.py from OneScience-Group/PXDesign: direct link, hf CLI and curl.
- Browser
- Download file 8.24 kB
-
https://huggingface.co/OneScience-Group/PXDesign/resolve/main/model/PXDesignBench/ColabDesign/colabdesign/tr/legacy/model.py
- Command line
-
hf download hf://OneScience-Group/PXDesign/model/PXDesignBench/ColabDesign/colabdesign/tr/legacy/model.py
-
curl -L -o model.py https://huggingface.co/OneScience-Group/PXDesign/resolve/main/model/PXDesignBench/ColabDesign/colabdesign/tr/legacy/model.py
8.24 kB
| # supressing warnings | |
| import warnings, logging, os | |
| warnings.filterwarnings('ignore',category=FutureWarning) | |
| logging.disable(logging.WARNING) | |
| os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" | |
| import tensorflow as tf | |
| tf.compat.v1.disable_eager_execution() | |
| from tr.src.utils import split_feat | |
| def tr_clear_mem(): | |
| tf.compat.v1.reset_default_graph() | |
| tf.compat.v1.keras.backend.clear_session() | |
| def tr_set_mem(frac=0.5): | |
| tf_config = tf.compat.v1.ConfigProto() | |
| tf_config.gpu_options.per_process_gpu_memory_fraction=frac | |
| tf.compat.v1.keras.backend.set_session(tf.compat.v1.Session(config=tf_config)) | |
| from tensorflow.keras.models import Model | |
| from tensorflow.keras.layers import Input, Conv2D, Activation, Dense, Lambda, Layer, Concatenate | |
| import numpy as np | |
| def get_TrR_weights(filename): | |
| weights = [np.squeeze(w) for w in np.load(filename, allow_pickle=True)] | |
| # remove weights for beta-beta pairing | |
| del weights[-4:-2] | |
| return weights | |
| def get_TrR(blocks=12, trainable=False, weights=None, name="TrR"): | |
| ex = {"trainable":trainable} | |
| # custom layer(s) | |
| class PSSM(Layer): | |
| # modified from MRF to only output tiled 1D features | |
| def __init__(self, diag=0.4, use_entropy=False): | |
| super(PSSM, self).__init__() | |
| self.diag = diag | |
| self.use_entropy = use_entropy | |
| def call(self, inputs): | |
| x,y = inputs | |
| _,_,L,A = [tf.shape(y)[k] for k in range(4)] | |
| with tf.name_scope('1d_features'): | |
| # sequence | |
| x_i = x[0,0,:,:20] | |
| # pssm | |
| f_i = y[0,0] | |
| # entropy | |
| if self.use_entropy: | |
| h_i = K.sum(-f_i * K.log(f_i + 1e-8), axis=-1, keepdims=True) | |
| else: | |
| h_i = tf.zeros((L,1)) | |
| # tile and combined 1D features | |
| feat_1D = tf.concat([x_i,f_i,h_i], axis=-1) | |
| feat_1D_tile_A = tf.tile(feat_1D[:,None,:], [1,L,1]) | |
| feat_1D_tile_B = tf.tile(feat_1D[None,:,:], [L,1,1]) | |
| with tf.name_scope('2d_features'): | |
| ic = self.diag * tf.eye(L*A) | |
| ic = tf.reshape(ic,(L,A,L,A)) | |
| ic = tf.transpose(ic,(0,2,1,3)) | |
| ic = tf.reshape(ic,(L,L,A*A)) | |
| i0 = tf.zeros([L,L,1]) | |
| feat_2D = tf.concat([ic,i0], axis=-1) | |
| feat = tf.concat([feat_1D_tile_A, feat_1D_tile_B, feat_2D],axis=-1) | |
| return tf.reshape(feat, [1,L,L,442+2*42]) | |
| class instance_norm(Layer): | |
| def __init__(self, axes=(1,2),trainable=True): | |
| super(instance_norm, self).__init__() | |
| self.axes = axes | |
| self.trainable = trainable | |
| def build(self, input_shape): | |
| self.beta = self.add_weight(name='beta',shape=(input_shape[-1],), | |
| initializer='zeros',trainable=self.trainable) | |
| self.gamma = self.add_weight(name='gamma',shape=(input_shape[-1],), | |
| initializer='ones',trainable=self.trainable) | |
| def call(self, inputs): | |
| mean, variance = tf.nn.moments(inputs, self.axes, keepdims=True) | |
| return tf.nn.batch_normalization(inputs, mean, variance, self.beta, self.gamma, 1e-6) | |
| ## INPUT ## | |
| inputs = Input((None,None,21),batch_size=1) | |
| A = PSSM()([inputs,inputs]) | |
| A = Dense(64, **ex)(A) | |
| A = instance_norm(**ex)(A) | |
| A = Activation("elu")(A) | |
| ## RESNET ## | |
| def resnet(X, dilation=1, filters=64, win=3): | |
| Y = Conv2D(filters, win, dilation_rate=dilation, padding='SAME', **ex)(X) | |
| Y = instance_norm(**ex)(Y) | |
| Y = Activation("elu")(Y) | |
| Y = Conv2D(filters, win, dilation_rate=dilation, padding='SAME', **ex)(Y) | |
| Y = instance_norm(**ex)(Y) | |
| return Activation("elu")(X+Y) | |
| for _ in range(blocks): | |
| for dilation in [1,2,4,8,16]: | |
| A = resnet(A, dilation) | |
| A = resnet(A, dilation=1) | |
| ## OUTPUT ## | |
| A_input = Input((None,None,64)) | |
| p_theta = Dense(25, activation="softmax", **ex)(A_input) | |
| p_phi = Dense(13, activation="softmax", **ex)(A_input) | |
| A_sym = Lambda(lambda x: (x + tf.transpose(x,[0,2,1,3]))/2)(A_input) | |
| p_dist = Dense(37, activation="softmax", **ex)(A_sym) | |
| p_omega = Dense(25, activation="softmax", **ex)(A_sym) | |
| A_model = Model(A_input,Concatenate()([p_theta,p_phi,p_dist,p_omega])) | |
| ## MODEL ## | |
| model = Model(inputs, A_model(A),name=name) | |
| if weights is not None: model.set_weights(weights) | |
| return model | |
| def get_TrR_model(protocol="fixbb", L=None, num_models=1, hard=True, use_theta=True): | |
| def gather_idx(x): | |
| idx = x[1][0] | |
| return tf.gather(tf.gather(x[0],idx,axis=-2),idx,axis=-3) | |
| def get_cce_loss(x, eps=1e-8): | |
| if use_theta: | |
| loss = -tf.reduce_sum(x[0]*tf.math.log(x[1] + eps),-1) | |
| loss = tf.reduce_mean(loss)/4 | |
| else: | |
| # remove theta | |
| true_x = split_feat(x[0]) | |
| pred_x = split_feat(x[1]) | |
| true_x = tf.concat([true_x[k] for k in ["phi","dist","omega"]],-1) | |
| pred_x = tf.concat([pred_x[k] for k in ["phi","dist","omega"]],-1) | |
| loss = -tf.reduce_sum(true_x*tf.math.log(pred_x + eps),-1) | |
| loss = tf.reduce_mean(loss)/3 | |
| return loss[None] | |
| def get_bkg_loss(x, eps=1e-8): | |
| loss = -tf.reduce_sum(x[1]*(tf.math.log(x[1]+eps)-tf.math.log(x[0]+eps)),-1) | |
| loss = tf.reduce_mean(loss)/4 | |
| return loss[None] | |
| def prep_seq(x_logits): | |
| x_soft = tf.nn.softmax(x_logits,-1) | |
| if hard: | |
| x_hard = tf.one_hot(tf.argmax(x_logits,-1),20) | |
| x = tf.stop_gradient(x_hard - x_soft) + x_soft | |
| else: | |
| x = x_soft | |
| x = tf.pad(x,[[0,0],[0,0],[0,1]]) | |
| return x[None] | |
| I_seq_logits = Input((L,20),name="seq_logits") | |
| seq = Lambda(prep_seq,name="seq")(I_seq_logits) | |
| if protocol in ["fixbb","partial"]: | |
| I_true = Input((L,L,100),name="true") | |
| if protocol in ["partial","hallucination"]: | |
| I_bkg = Input((L,L,100),name="bkg") | |
| if protocol in ["partial"]: | |
| I_idx = Input((None,),dtype=tf.int32,name="idx") | |
| I_idx_true = Input((None,),dtype=tf.int32,name="idx_true") | |
| # TODO | |
| pred = [] | |
| for nam in ["xaa","xab","xac","xad","xae"][:num_models]: | |
| print(nam) | |
| TrR = get_TrR(weights=get_TrR_weights(f"models/model_{nam}.npy"),name=nam) | |
| pred.append(TrR(seq)) | |
| pred = sum(pred)/len(pred) | |
| if protocol in ["partial"]: | |
| pred_sub = Lambda(gather_idx, name="pred_sub")([pred,I_idx]) | |
| true_sub = Lambda(gather_idx, name="true_sub")([I_true,I_idx_true]) | |
| cce_loss = Lambda(get_cce_loss,name="cce_loss")([true_sub, pred_sub]) | |
| if protocol in ["fixbb"]: | |
| cce_loss = Lambda(get_cce_loss,name="cce_loss")([I_true, pred]) | |
| if protocol in ["hallucination","partial"]: | |
| bkg_loss = Lambda(get_bkg_loss,name="bkg_loss")([I_bkg, pred]) | |
| # define model, loss and gradients | |
| inputs = [I_seq_logits] | |
| outputs = [] | |
| if protocol == "partial": | |
| inputs += [I_true, I_bkg, I_idx, I_idx_true] | |
| outputs += [cce_loss, bkg_loss] | |
| loss = Lambda(lambda x: x[0]+0.1*x[1])([cce_loss,bkg_loss]) | |
| if protocol == "hallucination": | |
| inputs += [I_bkg] | |
| outputs += [bkg_loss] | |
| loss = bkg_loss | |
| if protocol == "fixbb": | |
| inputs += [I_true] | |
| outputs += [cce_loss] | |
| loss = cce_loss | |
| grad = Lambda(lambda x: tf.gradients(x[0],x[1]), name="grad")([loss,I_seq_logits]) | |
| outputs += [grad, pred] | |
| model = Model(inputs, outputs, name="TrR_model") | |
| def _fixbb_model(seq, true): | |
| cce_loss, grad, pred = model.predict([seq[None],true[None]]) | |
| return {"cce_loss":cce_loss[0], | |
| "grad":grad[0], | |
| "pred":pred[0]} | |
| def _hallucination_model(seq, bkg): | |
| bkg_loss, grad, pred = model.predict([seq[None],bkg[None]]) | |
| return {"bkg_loss":bkg_loss[0], | |
| "grad":grad[0], | |
| "pred":pred[0]} | |
| def _partial_model(seq, true, bkg, pos_idx, pos_idx_ref=None): | |
| if pos_idx_ref is None: pos_idx_ref = pos_idx | |
| cce_loss, bkg_loss, grad, pred = model.predict([seq[None],true[None],bkg[None],pos_idx[None],pos_idx_ref[None]]) | |
| return {"cce_loss":cce_loss[0], | |
| "bkg_loss":bkg_loss[0], | |
| "grad":grad[0], | |
| "pred":pred[0]} | |
| if protocol == "fixbb": | |
| return _fixbb_model | |
| if protocol == "hallucination": | |
| return _hallucination_model | |
| if protocol == "partial": | |
| return _partial_model | |