{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import numpy as np \nimport pandas as pd\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\ndf = pd.read_csv('/kaggle/input/bfusecondaryprotein/train.csv')\ndf.len.hist(bins=100)\nprint(df.shape)\n\ndef seq2ngrams(seqs, n=3):\n    return np.array([[seq[i:i+n] for i in range(len(seq))] for seq in seqs])\n\nmaxlen_seq = 128\ninput_seqs, target_seqs = df[['seq', 'sst3']][(df.len <= maxlen_seq) & (~df.has_nonstd_aa)].values.T\ninput_grams = seq2ngrams(input_seqs)\nprint(len(input_seqs))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.preprocessing import text, sequence\nfrom keras.preprocessing.text import Tokenizer\nfrom keras.utils import to_categorical\n\ntokenizer_encoder = Tokenizer()\ntokenizer_encoder.fit_on_texts(input_grams)\ninput_data = tokenizer_encoder.texts_to_sequences(input_grams)\ninput_data = sequence.pad_sequences(input_data, maxlen=maxlen_seq, padding='post')\n\ntokenizer_decoder = Tokenizer(char_level=True)\ntokenizer_decoder.fit_on_texts(target_seqs)\ntarget_data = tokenizer_decoder.texts_to_sequences(target_seqs)\ntarget_data = sequence.pad_sequences(target_data, maxlen=maxlen_seq, padding='post')\ntarget_data = to_categorical(target_data)\ninput_data.shape, target_data.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.models import Model, Input\nfrom keras.layers import LSTM, Embedding, Dense, TimeDistributed, Bidirectional\n\nn_words = len(tokenizer_encoder.word_index) + 1\nn_tags = len(tokenizer_decoder.word_index) + 1\nprint(n_words, n_tags)\n\ninput = Input(shape=(maxlen_seq,))\nx = Embedding(input_dim=n_words, output_dim=128, input_length=maxlen_seq)(input)\nx = Bidirectional(LSTM(units=64, return_sequences=True, recurrent_dropout=0.1))(x)\ny = TimeDistributed(Dense(n_tags, activation=\"softmax\"))(x)\nmodel = Model(input, y)\nmodel.summary()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom keras.metrics import categorical_accuracy\nfrom keras import backend  as K\nimport tensorflow as tf\n\ndef q3_acc(y_true, y_pred):\n    y = tf.argmax(y_true, axis=-1)\n    y_ = tf.argmax(y_pred, axis=-1)\n    mask = tf.greater(y, 0)\n    return K.cast(K.equal(tf.boolean_mask(y, mask), tf.boolean_mask(y_, mask)), K.floatx())\n\nmodel.compile(optimizer=\"rmsprop\", loss=\"categorical_crossentropy\", metrics=[\"accuracy\", q3_acc])\n\nX_train, X_test, y_train, y_test = train_test_split(input_data, target_data, test_size=.4, random_state=0)\nseq_train, seq_test, target_train, target_test = train_test_split(input_seqs, target_seqs, test_size=.4, random_state=0)\n\nmodel.fit(X_train, y_train, batch_size=128, epochs=5, validation_data=(X_test, y_test), verbose=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def onehot_to_seq(oh_seq, index):\n    s = ''\n    for o in oh_seq:\n        i = np.argmax(o)\n        if i != 0:\n            s += index[i]\n        else:\n            break\n    return s\n\ndef plot_results(x, y, y_):\n    print(\"---\")\n    print(\"Input: \" + str(x))\n    print(\"Target: \" + str(onehot_to_seq(y, revsere_decoder_index).upper()))\n    print(\"Result: \" + str(onehot_to_seq(y_, revsere_decoder_index).upper()))\n    fig = plt.figure(figsize=(10,2))\n    plt.imshow(y.T, cmap='Blues')\n    plt.imshow(y_.T, cmap='Reds', alpha=.5)\n    plt.yticks(range(4), [' '] + [revsere_decoder_index[i+1].upper() for i in range(3)])\n    plt.show()\n    \nrevsere_decoder_index = {value:key for key,value in tokenizer_decoder.word_index.items()}\nrevsere_encoder_index = {value:key for key,value in tokenizer_encoder.word_index.items()}\n\nN=3\ny_train_pred = model.predict(X_train[:N])\ny_test_pred = model.predict(X_test[:N])\nprint('training')\nfor i in range(N):\n    plot_results(seq_train[i], y_train[i], y_train_pred[i])\nprint('testing')\nfor i in range(N):\n    plot_results(seq_test[i], y_test[i], y_test_pred[i])","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":1}