{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Classifying primary tumor with DNA methylation data \n", "\n", "### Raw data from TCGA is processed in R \n", "- `getDNAM.R` \n", "- `tcga2stat.R` \n", "\n", "### All DNAm results were computed on the UIUC nano cluster:\n", "- `rf_dnam.py` for random forest classification \n", "- `knn_dnam.py` for k-nearest neighbors classification \n", "- `nn_loop_dnam.py` for tuning neural network hyperparamters \n", "- `nn_dnam.py` for neural net classification \n", "\n", "Data structures from the cluster are saved using cPickle, and loaded into this jupyter notebook for further visualization and analysis\n", "\n", "### Cluster outputs can be viewed in the following files: \n", "- `py_knn_10_dnam.out`\n", "- `py_nn_dnam.out`\n", "- `py_nn_sigmoid_scale.out`\n", "- `py_rf_dnam.out`\n", "\n", "Files can be found under the `tumor-origin/dnam` folder" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "import numpy\n", "import pandas as pd \n", "from tensorflow.keras import layers \n", "from tensorflow.keras.utils import to_categorical\n", "\n", "from numpy import random\n", "\n", "from sklearn import metrics\n", "from sklearn.metrics import confusion_matrix\n", "import matplotlib.pyplot as plt\n", "\n", "import cPickle as pickle\n", "\n", "# Files containing raw data were not loaded into ipynb \n", "# data = pd.read_csv('dnam/merged-rand.txt', sep='\\t')\n", "# types = pd.read_csv('dnam/types-rand.txt', sep='\\t')\n", "# labels = pd.read_csv('dnam/labels-rand.txt', sep='\\t')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tuning the learning rate\n", "\n", "The output `200e-2e5e-dnam` contains dictionaries for accuracy results at different learning rates, and accuracy results for different epochs. \n", "\n", "Learning rates were generated using `numpy.geomspace` for logarithmically spaced values. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "#### CAREFUL\n", "#### You are about to load in new variables from the cluster \n", "#### To use for further visualization \n", "filename='db/200e-2e5e-dnam'\n", "with open(filename, 'rb') as fp:\n", " learnloss = pickle.load(fp)\n", " histories = pickle.load(fp)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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EZWEQkREVBIKERFRSShEREQloRAREZWEQkREVBIKERFRSShEREQloRAREZWEQkREVBIKERFRSShEREQloRAREZWEQkREVBIKERFRSShEREQloRAREZVaQ0HSEZLWS9og6bR+xh8raYuk68rHcXXWExERg9u1rhlLmgKcC7wS2AyslrTC9g19ul5k+8S66oiIiNbVuadwELDB9kbbDwIXAkfWuLyIiBihOkNhJrCpaXhz2dbXGyT9UtIlkmb3NyNJSyR1S+resmVLHbVGRATtP9H8XWCu7ecClwNf76+T7WW2G7YbXV1dY1pgRMRkUmco9ADNn/xnlW0V23fafqAc/CrwghrriYiIIdQZCquBeZL2lzQVWASsaO4gad+mwYXAjTXWExERQ6jt20e2t0s6EVgFTAHOs71O0plAt+0VwMmSFgLbgT8Cx9ZVT0REDE22213DsDQaDXd3d7e7jIiIcUXSGtuNofq1+0RzRER0kIRCRERUEgoREVFJKERERCWhEBERlYRCRERUEgoREVFJKERERCWhEBERlYRCRERUEgoREVFJKERERCWhEBERlYRCRERUEgoREVFJKERERCWhEBERlYRCRERUEgoREVFJKERERKXWUJB0hKT1kjZIOm2Qfm+QZElD3lQ6IiLqU1soSJoCnAu8GlgALJa0oJ9+04FTgGvrqiUiIlpT557CQcAG2xttPwhcCBzZT7+PAZ8E7q+xloiIaEGdoTAT2NQ0vLlsq0h6PjDb9vcHm5GkJZK6JXVv2bJl9CuNiAigjSeaJe0CnAOcOlRf28tsN2w3urq66i8uImKSqjMUeoDZTcOzyrZe04HnAFdJugU4BFiRk80REe1TZyisBuZJ2l/SVGARsKJ3pO27be9te67tucA1wELb3TXWFBERg6gtFGxvB04EVgE3AhfbXifpTEkL61puREQ8drvWOXPbK4GVfdo+PEDfw+qsJSIihpZfNEdERCWhEBERlYRCRERUEgoREVFJKERERCWhEBERlYRCRERUEgoREVFJKERERKXWXzR3kuVrezh71Xpu27qN/WZMY+nh8znqwJlDTzhB64iI6M+kCIXla3s4/bLr2fbQDgB6tm7j9MuuBxjTDXKn1BERMZBJcfjo7FXrqw1xr20P7eDsVesnZR0REQOZFKFw29Ztw2qf6HVERAxkUoTCfjOmDat9otcR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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#Visualize loss at each learning rate to pick an ideal learning rate \n", "\n", "def visualizeLearnLossRange(learnloss): \n", " plt.title('model test accuracy')\n", " plt.xscale('log')\n", " plt.ylabel('accuracy')\n", " plt.xlabel('learning rate')\n", " plt.scatter(list(learnloss.keys()),list(learnloss.values()))\n", " plt.gca().invert_xaxis()\n", " plt.savefig(\"accuracy_learningrate_range.pdf\")\n", " plt.show()\n", "\n", "visualizeLearnLossRange(learnloss)\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Max test accuracy: \n", "(0.9932432432432432, [0.00021544346900318845])\n", "Rate: 1e-05\tAccuracy: 0.9915540540540541\n", "Rate: 2.1544346900318867e-05\tAccuracy: 0.9915540540540541\n", "Rate: 4.641588833612782e-05\tAccuracy: 0.9915540540540541\n", "Rate: 0.0001\tAccuracy: 0.9915540540540541\n", "Rate: 0.00021544346900318845\tAccuracy: 0.9932432432432432\n", "Rate: 0.0004641588833612782\tAccuracy: 0.9915540540540541\n", "Rate: 0.001\tAccuracy: 0.9898648648648649\n", "Rate: 0.0021544346900318843\tAccuracy: 0.9847972972972973\n", "8\n" ] } ], "source": [ "## Look at rates and decide lower/upper bound \n", "max_acc = max(learnloss.values()) # maximum value\n", "max_lr = [k for k, v in learnloss.items() if v == max_acc] # getting all keys containing the `maximum`\n", "print(\"Max test accuracy: \")\n", "print(max_acc, max_lr)\n", "\n", "orderedkeys = []\n", "for ll in learnloss:\n", " orderedkeys.append(ll)\n", "orderedkeys = sorted(orderedkeys)\n", "\n", "# Get high learning rates and visualize their accuracy over X epochs \n", "counter = 0\n", "goodrates = []\n", "for ll in orderedkeys: \n", " if learnloss[ll] > 0.77: \n", " counter+=1\n", " goodrates.append(ll)\n", " print(\"Rate: \" + str(ll) + \"\\tAccuracy: \"+ str(learnloss[ll]))\n", "print(counter)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def visualizeEpochs(learnloss, histories):\n", " fig = plt.figure(figsize=(10,3))\n", " counter = 0\n", " nrRows = 4\n", " nrCols = 3\n", " for lr in goodrates:\n", " if lr != 4.641588833612782e-05 and lr != 0.0001:\n", " # generate subplots \n", " ax = fig.add_subplot(nrRows, nrCols, counter+1)\n", " ax.plot(histories[lr]['acc'])\n", " ax.plot(histories[lr]['val_acc'])\n", " plt.title('learning rate: ' + '{:.3g}'.format(lr))\n", " ax.set_ylabel('accuracy')\n", " ax.set_xlabel('epoch')\n", " ax.legend(['train', 'test'], loc='lower right')\n", " counter +=1\n", " fig.set_figheight(12)\n", " fig.set_figwidth(15)\n", " plt.tight_layout()\n", " plt.savefig(\"dnam/6-accuracy_epochs.pdf\")\n", " plt.show()\n", " \n", "\n", "visualizeEpochs(learnloss, histories)" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [], "source": [ "# Learning rate: 0.01 to 0.000001\n", "# encoded labels are one-hot encoded \n", "# Test labels are treated with ravel\n", "learnloss = {} \n", "histories = {}\n", "def learnLoss(learningRate, epochs, train, encoded_train, test, encoded_test, test_labels):\n", " model = tf.keras.Sequential()\n", " model.add(layers.Dense(128, activation='sigmoid'))\n", " model.add(layers.Dense(128, activation='sigmoid'))\n", " model.add(layers.Dense(17, activation='softmax'))\n", " model.compile(optimizer=tf.train.RMSPropOptimizer(learningRate),\n", " loss='categorical_crossentropy',\n", " metrics=['accuracy'])\n", " \n", " model.fit(train, encoded_train, validation_data=(test, encoded_test), epochs=epochs, batch_size=32)\n", " \n", " \n", " # test \n", " pred_y = model.predict_classes(test)\n", " nnyhat = confusion_matrix(test_types, pred_y)\n", " accuracy = metrics.accuracy_score(test_labels, pred_y)\n", " print(\"Accuracy: \", accuracy)\n", " learnloss[learningRate] = accuracy \n", " histories[learningRate] = model.history.history" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "learningRates = numpy.geomspace(0.01, 0.000001, num=50)\n", "print(learningRates)\n", "for lr in learningRates:\n", " learnLoss(lr, 500, train, encoded_train, test, encoded_test, r_test_types)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "### CAREFUL\n", "### You are about to DUMP and replace the current saved variables\n", "\n", "filename='500epoch50learn'\n", "with open(filename, 'wb')as fp:\n", " pickle.dump(learnloss, fp)\n", " pickle.dump(histories, fp)\n", " \n", "filename='500epoch50learn'\n", "with open(filename, 'rb') as fp:\n", " learnloss = pickle.load(fp)\n", " histories = pickle.load(fp)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Sample code for debugging purposes. " ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "model = tf.keras.Sequential()\n", "model.add(layers.Dense(128, activation='sigmoid'))\n", "model.add(layers.Dense(128, activation='sigmoid'))\n", "model.add(layers.Dense(17, activation='softmax'))\n", "model.compile(optimizer=tf.train.RMSPropOptimizer(5.1794746792312125e-05),\n", " loss='categorical_crossentropy',\n", " metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 5574 samples, validate on 2376 samples\n", "Epoch 1/200\n", "5574/5574 [==============================] - 1s 256us/step - loss: 0.8388 - acc: 0.7384 - val_loss: 0.8616 - val_acc: 0.7315\n", "Epoch 2/200\n", "5574/5574 [==============================] - 1s 169us/step - loss: 0.8350 - acc: 0.7363 - val_loss: 0.8543 - val_acc: 0.7319\n", "Epoch 3/200\n", "5574/5574 [==============================] - 1s 172us/step - loss: 0.8317 - acc: 0.7388 - val_loss: 0.8579 - val_acc: 0.7273\n", "Epoch 4/200\n", "5574/5574 [==============================] - 1s 170us/step - loss: 0.8313 - acc: 0.7393 - val_loss: 0.8530 - val_acc: 0.7315\n", "Epoch 5/200\n", "5574/5574 [==============================] - 1s 176us/step - loss: 0.8236 - acc: 0.7417 - val_loss: 0.8508 - val_acc: 0.7306\n", "Epoch 6/200\n", "5574/5574 [==============================] - 1s 173us/step - loss: 0.8281 - acc: 0.7404 - val_loss: 0.8445 - val_acc: 0.7344\n", "Epoch 7/200\n", "5574/5574 [==============================] - 1s 171us/step - loss: 0.8233 - acc: 0.7413 - val_loss: 0.8467 - val_acc: 0.7285\n", "Epoch 8/200\n", "5574/5574 [==============================] - 1s 175us/step - loss: 0.8254 - acc: 0.7397 - val_loss: 0.8501 - val_acc: 0.7298\n", "Epoch 9/200\n", "5574/5574 [==============================] - 1s 174us/step - loss: 0.8309 - acc: 0.7393 - val_loss: 0.8462 - val_acc: 0.7327\n", "Epoch 10/200\n", "5574/5574 [==============================] - 1s 208us/step - loss: 0.8299 - acc: 0.7406 - val_loss: 0.8523 - val_acc: 0.7353\n", "Epoch 11/200\n", "5574/5574 [==============================] - 1s 183us/step - loss: 0.8269 - acc: 0.7443 - val_loss: 0.8453 - val_acc: 0.7336\n", "Epoch 12/200\n", "5574/5574 [==============================] - 1s 194us/step - loss: 0.8255 - acc: 0.7456 - val_loss: 0.8423 - val_acc: 0.7323\n", "Epoch 13/200\n", "5574/5574 [==============================] - 1s 200us/step - loss: 0.8235 - acc: 0.7451 - val_loss: 0.8446 - val_acc: 0.7319\n", "Epoch 14/200\n", "5574/5574 [==============================] - 1s 183us/step - loss: 0.8228 - acc: 0.7456 - val_loss: 0.8441 - val_acc: 0.7336\n", "Epoch 15/200\n", "5574/5574 [==============================] - 1s 173us/step - loss: 0.8234 - acc: 0.7458 - val_loss: 0.8427 - val_acc: 0.7370\n", "Epoch 16/200\n", "5574/5574 [==============================] - 1s 176us/step - loss: 0.8192 - acc: 0.7463 - val_loss: 0.8407 - val_acc: 0.7344\n", "Epoch 17/200\n", "5574/5574 [==============================] - 1s 179us/step - loss: 0.8194 - acc: 0.7449 - val_loss: 0.8375 - val_acc: 0.7374\n", "Epoch 18/200\n", "5574/5574 [==============================] - 1s 179us/step - loss: 0.8114 - acc: 0.7478 - val_loss: 0.8363 - val_acc: 0.7370\n", "Epoch 19/200\n", "5574/5574 [==============================] - 1s 173us/step - loss: 0.8113 - acc: 0.7485 - val_loss: 0.8340 - val_acc: 0.7340\n", "Epoch 20/200\n", "5574/5574 [==============================] - 1s 179us/step - loss: 0.8118 - acc: 0.7485 - val_loss: 0.8376 - val_acc: 0.7336\n", "Epoch 21/200\n", "5574/5574 [==============================] - 1s 174us/step - loss: 0.8136 - acc: 0.7474 - val_loss: 0.8357 - val_acc: 0.7277\n", "Epoch 22/200\n", "5574/5574 [==============================] - 1s 179us/step - loss: 0.8136 - acc: 0.7460 - val_loss: 0.8393 - val_acc: 0.7294\n", "Epoch 23/200\n", "5574/5574 [==============================] - 1s 173us/step - loss: 0.8150 - acc: 0.7445 - val_loss: 0.8378 - val_acc: 0.7273\n", "Epoch 24/200\n", "5574/5574 [==============================] - 1s 173us/step - loss: 0.8160 - acc: 0.7440 - val_loss: 0.8363 - val_acc: 0.7298\n", "Epoch 25/200\n", "5574/5574 [==============================] - 1s 183us/step - loss: 0.8157 - acc: 0.7449 - val_loss: 0.8407 - val_acc: 0.7273\n", "Epoch 26/200\n", "5574/5574 [==============================] - 1s 178us/step - loss: 0.8201 - acc: 0.7454 - val_loss: 0.8455 - val_acc: 0.7273\n", "Epoch 27/200\n", "5574/5574 [==============================] - 1s 179us/step - loss: 0.8222 - acc: 0.7418 - val_loss: 0.8426 - val_acc: 0.7260\n", "Epoch 28/200\n", "5574/5574 [==============================] - 1s 172us/step - loss: 0.8198 - acc: 0.7433 - val_loss: 0.8428 - val_acc: 0.7302\n", "Epoch 29/200\n", "5574/5574 [==============================] - 1s 175us/step - loss: 0.8177 - acc: 0.7404 - val_loss: 0.8411 - val_acc: 0.7269\n", "Epoch 30/200\n", "5574/5574 [==============================] - 1s 181us/step - loss: 0.8129 - acc: 0.7429 - val_loss: 0.8348 - val_acc: 0.7285\n", "Epoch 31/200\n", "5574/5574 [==============================] - 1s 182us/step - loss: 0.8090 - acc: 0.7461 - val_loss: 0.8367 - val_acc: 0.7281\n", "Epoch 32/200\n", "5574/5574 [==============================] - 1s 178us/step - loss: 0.8114 - acc: 0.7431 - val_loss: 0.8361 - val_acc: 0.7277\n", "Epoch 33/200\n", "5574/5574 [==============================] - 1s 180us/step - loss: 0.8095 - acc: 0.7463 - val_loss: 0.8297 - val_acc: 0.7306\n", "Epoch 34/200\n", "5574/5574 [==============================] - 1s 177us/step - loss: 0.8093 - acc: 0.7445 - val_loss: 0.8315 - val_acc: 0.7336\n", "Epoch 35/200\n", "5574/5574 [==============================] - 1s 181us/step - loss: 0.8088 - acc: 0.7442 - val_loss: 0.8278 - val_acc: 0.7344\n", "Epoch 36/200\n", "5574/5574 [==============================] - 1s 176us/step - loss: 0.8046 - acc: 0.7470 - val_loss: 0.8226 - val_acc: 0.7382\n", "Epoch 37/200\n", "5574/5574 [==============================] - 1s 177us/step - loss: 0.8030 - acc: 0.7472 - val_loss: 0.8248 - val_acc: 0.7361\n", "Epoch 38/200\n", "5574/5574 [==============================] - 1s 175us/step - loss: 0.8013 - acc: 0.7483 - val_loss: 0.8249 - val_acc: 0.7391\n", "Epoch 39/200\n", "5574/5574 [==============================] - 1s 180us/step - loss: 0.7997 - acc: 0.7492 - val_loss: 0.8190 - val_acc: 0.7416\n", "Epoch 40/200\n", "5574/5574 [==============================] - 1s 176us/step - loss: 0.7950 - acc: 0.7526 - val_loss: 0.8222 - val_acc: 0.7365\n", "Epoch 41/200\n", "5574/5574 [==============================] - 1s 177us/step - loss: 0.7963 - acc: 0.7497 - val_loss: 0.8218 - val_acc: 0.7399\n", "Epoch 42/200\n", "5574/5574 [==============================] - 1s 179us/step - loss: 0.7951 - acc: 0.7531 - val_loss: 0.8212 - val_acc: 0.7403\n", "Epoch 43/200\n", "5574/5574 [==============================] - 1s 182us/step - loss: 0.7941 - acc: 0.7512 - val_loss: 0.8181 - val_acc: 0.7382\n", "Epoch 44/200\n", "5574/5574 [==============================] - 1s 181us/step - loss: 0.7933 - acc: 0.7519 - val_loss: 0.8181 - val_acc: 0.7365\n", "Epoch 45/200\n", "5574/5574 [==============================] - 1s 177us/step - loss: 0.7941 - acc: 0.7551 - val_loss: 0.8224 - val_acc: 0.7374\n", "Epoch 46/200\n", "5574/5574 [==============================] - 1s 173us/step - loss: 0.7989 - acc: 0.7522 - val_loss: 0.8229 - val_acc: 0.7365\n", "Epoch 47/200\n", "5574/5574 [==============================] - 1s 181us/step - loss: 0.7962 - acc: 0.7549 - val_loss: 0.8189 - val_acc: 0.7399\n", "Epoch 48/200\n", "5574/5574 [==============================] - 1s 176us/step - loss: 0.7962 - acc: 0.7537 - val_loss: 0.8232 - val_acc: 0.7361\n", "Epoch 49/200\n", "5574/5574 [==============================] - 1s 174us/step - loss: 0.7965 - acc: 0.7546 - val_loss: 0.8238 - val_acc: 0.7382\n", "Epoch 50/200\n", "5574/5574 [==============================] - 1s 184us/step - loss: 0.7945 - acc: 0.7567 - val_loss: 0.8203 - val_acc: 0.7365\n", "Epoch 51/200\n", "5574/5574 [==============================] - 1s 184us/step - loss: 0.7905 - acc: 0.7553 - val_loss: 0.8162 - val_acc: 0.7428\n", "Epoch 52/200\n", "5574/5574 [==============================] - 1s 172us/step - loss: 0.7874 - acc: 0.7573 - val_loss: 0.8143 - val_acc: 0.7395\n", "Epoch 53/200\n", "5574/5574 [==============================] - 1s 174us/step - loss: 0.7884 - acc: 0.7546 - val_loss: 0.8200 - val_acc: 0.7365\n", "Epoch 54/200\n", "5574/5574 [==============================] - 1s 182us/step - loss: 0.7882 - acc: 0.7539 - val_loss: 0.8177 - val_acc: 0.7386\n", "Epoch 55/200\n", "5574/5574 [==============================] - 1s 188us/step - loss: 0.7841 - acc: 0.7560 - val_loss: 0.8144 - val_acc: 0.7403\n", "Epoch 56/200\n", "5574/5574 [==============================] - 1s 174us/step - loss: 0.7833 - acc: 0.7551 - val_loss: 0.8079 - val_acc: 0.7428\n", "Epoch 57/200\n", "5574/5574 [==============================] - 1s 185us/step - loss: 0.7803 - acc: 0.7582 - val_loss: 0.8053 - val_acc: 0.7428\n", "Epoch 58/200\n", "5574/5574 [==============================] - 1s 180us/step - loss: 0.7731 - acc: 0.7601 - val_loss: 0.8068 - val_acc: 0.7416\n", "Epoch 59/200\n", "5574/5574 [==============================] - 1s 185us/step - loss: 0.7755 - acc: 0.7569 - val_loss: 0.8073 - val_acc: 0.7428\n", "Epoch 60/200\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "5574/5574 [==============================] - 1s 170us/step - loss: 0.7722 - acc: 0.7585 - val_loss: 0.8057 - val_acc: 0.7407\n", "Epoch 61/200\n", "5574/5574 [==============================] - 1s 168us/step - loss: 0.7736 - acc: 0.7530 - val_loss: 0.8013 - val_acc: 0.7428\n", "Epoch 62/200\n", "5574/5574 [==============================] - 1s 168us/step - loss: 0.7692 - acc: 0.7544 - val_loss: 0.7986 - val_acc: 0.7441\n", "Epoch 63/200\n", "5574/5574 [==============================] - 1s 167us/step - loss: 0.7744 - acc: 0.7537 - val_loss: 0.8065 - val_acc: 0.7445\n", "Epoch 64/200\n", "5574/5574 [==============================] - 1s 167us/step - loss: 0.7759 - acc: 0.7539 - val_loss: 0.8040 - val_acc: 0.7462\n", "Epoch 65/200\n", "5574/5574 [==============================] - 1s 170us/step - loss: 0.7732 - acc: 0.7524 - val_loss: 0.8011 - val_acc: 0.7424\n", "Epoch 66/200\n", "5574/5574 [==============================] - 1s 167us/step - loss: 0.7711 - acc: 0.7558 - val_loss: 0.7974 - val_acc: 0.7471\n", "Epoch 67/200\n", "5574/5574 [==============================] - 1s 168us/step - loss: 0.7690 - acc: 0.7565 - val_loss: 0.8017 - val_acc: 0.7420\n", "Epoch 68/200\n", "5574/5574 [==============================] - 1s 170us/step - loss: 0.7657 - acc: 0.7583 - val_loss: 0.8035 - val_acc: 0.7399\n", "Epoch 69/200\n", "5574/5574 [==============================] - 1s 166us/step - loss: 0.7662 - acc: 0.7573 - val_loss: 0.7995 - val_acc: 0.7433\n", "Epoch 70/200\n", "5574/5574 [==============================] - 1s 169us/step - loss: 0.7694 - acc: 0.7558 - val_loss: 0.7969 - val_acc: 0.7441\n", "Epoch 71/200\n", "5574/5574 [==============================] - 1s 168us/step - loss: 0.7667 - acc: 0.7625 - val_loss: 0.7992 - val_acc: 0.7479\n", "Epoch 72/200\n", "5574/5574 [==============================] - 1s 171us/step - loss: 0.7656 - acc: 0.7598 - val_loss: 0.7996 - val_acc: 0.7416\n", "Epoch 73/200\n", "5574/5574 [==============================] - 1s 168us/step - loss: 0.7609 - acc: 0.7605 - val_loss: 0.8004 - val_acc: 0.7445\n", "Epoch 74/200\n", "5574/5574 [==============================] - 1s 169us/step - loss: 0.7615 - acc: 0.7591 - val_loss: 0.8025 - val_acc: 0.7458\n", "Epoch 75/200\n", "5574/5574 [==============================] - 1s 167us/step - loss: 0.7650 - acc: 0.7583 - val_loss: 0.8020 - val_acc: 0.7445\n", "Epoch 76/200\n", "5574/5574 [==============================] - 1s 172us/step - loss: 0.7611 - acc: 0.7598 - val_loss: 0.8054 - val_acc: 0.7403\n", "Epoch 77/200\n", "5574/5574 [==============================] - 1s 172us/step - loss: 0.7639 - acc: 0.7580 - val_loss: 0.7995 - val_acc: 0.7504\n", "Epoch 78/200\n", "5574/5574 [==============================] - 1s 174us/step - loss: 0.7634 - acc: 0.7564 - val_loss: 0.8019 - val_acc: 0.7483\n", "Epoch 79/200\n", "5574/5574 [==============================] - 1s 170us/step - loss: 0.7604 - acc: 0.7610 - val_loss: 0.7970 - val_acc: 0.7466\n", "Epoch 80/200\n", "5574/5574 [==============================] - 1s 167us/step - loss: 0.7621 - acc: 0.7598 - val_loss: 0.7983 - val_acc: 0.7441\n", "Epoch 81/200\n", "5574/5574 [==============================] - 1s 178us/step - loss: 0.7666 - acc: 0.7576 - val_loss: 0.8008 - val_acc: 0.7428\n", "Epoch 82/200\n", "5574/5574 [==============================] - 1s 205us/step - loss: 0.7699 - acc: 0.7594 - val_loss: 0.8025 - val_acc: 0.7445\n", "Epoch 83/200\n", "5574/5574 [==============================] - 1s 199us/step - loss: 0.7676 - acc: 0.7610 - val_loss: 0.8059 - val_acc: 0.7428\n", "Epoch 84/200\n", "5574/5574 [==============================] - 1s 195us/step - loss: 0.7640 - acc: 0.7587 - val_loss: 0.8001 - val_acc: 0.7424\n", "Epoch 85/200\n", "5574/5574 [==============================] - 1s 196us/step - loss: 0.7633 - acc: 0.7596 - val_loss: 0.8037 - val_acc: 0.7449\n", "Epoch 86/200\n", "5574/5574 [==============================] - 1s 171us/step - loss: 0.7637 - acc: 0.7610 - val_loss: 0.8016 - val_acc: 0.7437\n", "Epoch 87/200\n", "5574/5574 [==============================] - 1s 176us/step - loss: 0.7648 - acc: 0.7605 - val_loss: 0.7986 - val_acc: 0.7445\n", "Epoch 88/200\n", "5574/5574 [==============================] - 1s 171us/step - loss: 0.7653 - acc: 0.7576 - val_loss: 0.8026 - val_acc: 0.7479\n", "Epoch 89/200\n", "5574/5574 [==============================] - 1s 173us/step - loss: 0.7658 - acc: 0.7589 - val_loss: 0.7992 - val_acc: 0.7424\n", "Epoch 90/200\n", "5574/5574 [==============================] - 1s 169us/step - loss: 0.7625 - acc: 0.7591 - val_loss: 0.8009 - val_acc: 0.7424\n", "Epoch 91/200\n", "5574/5574 [==============================] - 1s 175us/step - loss: 0.7624 - acc: 0.7596 - val_loss: 0.8019 - val_acc: 0.7395\n", "Epoch 92/200\n", "5574/5574 [==============================] - 1s 167us/step - loss: 0.7621 - acc: 0.7614 - val_loss: 0.7999 - val_acc: 0.7365\n", "Epoch 93/200\n", "5574/5574 [==============================] - 1s 191us/step - loss: 0.7565 - acc: 0.7600 - val_loss: 0.7977 - val_acc: 0.7399\n", "Epoch 94/200\n", "5574/5574 [==============================] - 1s 193us/step - loss: 0.7532 - acc: 0.7603 - val_loss: 0.7901 - val_acc: 0.7433\n", "Epoch 95/200\n", "5574/5574 [==============================] - 1s 170us/step - loss: 0.7548 - acc: 0.7607 - val_loss: 0.7863 - val_acc: 0.7445\n", "Epoch 96/200\n", "5574/5574 [==============================] - 1s 176us/step - loss: 0.7493 - acc: 0.7632 - val_loss: 0.7876 - val_acc: 0.7420\n", "Epoch 97/200\n", "5574/5574 [==============================] - 1s 174us/step - loss: 0.7485 - acc: 0.7616 - val_loss: 0.7820 - val_acc: 0.7407\n", "Epoch 98/200\n", "5574/5574 [==============================] - 1s 179us/step - loss: 0.7477 - acc: 0.7634 - val_loss: 0.7910 - val_acc: 0.7395\n", "Epoch 99/200\n", "5574/5574 [==============================] - 1s 174us/step - loss: 0.7517 - acc: 0.7612 - val_loss: 0.7865 - val_acc: 0.7471\n", "Epoch 100/200\n", "5574/5574 [==============================] - 1s 190us/step - loss: 0.7501 - acc: 0.7634 - val_loss: 0.7844 - val_acc: 0.7424\n", "Epoch 101/200\n", "5574/5574 [==============================] - 1s 224us/step - loss: 0.7478 - acc: 0.7646 - val_loss: 0.7829 - val_acc: 0.7441\n", "Epoch 102/200\n", "5574/5574 [==============================] - 1s 186us/step - loss: 0.7510 - acc: 0.7632 - val_loss: 0.7812 - val_acc: 0.7475\n", "Epoch 103/200\n", "5574/5574 [==============================] - 1s 177us/step - loss: 0.7497 - acc: 0.7653 - val_loss: 0.7837 - val_acc: 0.7462\n", "Epoch 104/200\n", "5574/5574 [==============================] - 1s 179us/step - loss: 0.7514 - acc: 0.7628 - val_loss: 0.7822 - val_acc: 0.7437\n", "Epoch 105/200\n", "5574/5574 [==============================] - 1s 211us/step - loss: 0.7471 - acc: 0.7653 - val_loss: 0.7792 - val_acc: 0.7462\n", "Epoch 106/200\n", "5574/5574 [==============================] - 1s 183us/step - loss: 0.7447 - acc: 0.7664 - val_loss: 0.7889 - val_acc: 0.7416\n", "Epoch 107/200\n", "5574/5574 [==============================] - 1s 179us/step - loss: 0.7453 - acc: 0.7661 - val_loss: 0.7883 - val_acc: 0.7424\n", "Epoch 108/200\n", "5574/5574 [==============================] - 1s 195us/step - loss: 0.7429 - acc: 0.7673 - val_loss: 0.7812 - val_acc: 0.7454\n", "Epoch 109/200\n", "5574/5574 [==============================] - 1s 181us/step - loss: 0.7407 - acc: 0.7664 - val_loss: 0.7813 - val_acc: 0.7475\n", "Epoch 110/200\n", "5574/5574 [==============================] - 1s 204us/step - loss: 0.7411 - acc: 0.7704 - val_loss: 0.7807 - val_acc: 0.7433\n", "Epoch 111/200\n", "5574/5574 [==============================] - 1s 214us/step - loss: 0.7390 - acc: 0.7711 - val_loss: 0.7807 - val_acc: 0.7475\n", "Epoch 112/200\n", "5574/5574 [==============================] - 1s 241us/step - loss: 0.7390 - acc: 0.7695 - val_loss: 0.7778 - val_acc: 0.7492\n", "Epoch 113/200\n", "5574/5574 [==============================] - 1s 215us/step - loss: 0.7402 - acc: 0.7664 - val_loss: 0.7727 - val_acc: 0.7496\n", "Epoch 114/200\n", "5574/5574 [==============================] - 1s 198us/step - loss: 0.7367 - acc: 0.7670 - val_loss: 0.7783 - val_acc: 0.7475\n", "Epoch 115/200\n", "5574/5574 [==============================] - 1s 238us/step - loss: 0.7368 - acc: 0.7679 - val_loss: 0.7751 - val_acc: 0.7500\n", "Epoch 116/200\n", "5574/5574 [==============================] - 1s 192us/step - loss: 0.7335 - acc: 0.7686 - val_loss: 0.7697 - val_acc: 0.7492\n", "Epoch 117/200\n", "5574/5574 [==============================] - 1s 188us/step - loss: 0.7311 - acc: 0.7679 - val_loss: 0.7672 - val_acc: 0.7555\n", "Epoch 118/200\n", "5574/5574 [==============================] - 1s 185us/step - loss: 0.7298 - acc: 0.7671 - val_loss: 0.7660 - val_acc: 0.7525\n", "Epoch 119/200\n", "5574/5574 [==============================] - 1s 215us/step - loss: 0.7276 - acc: 0.7709 - val_loss: 0.7620 - val_acc: 0.7546\n", "Epoch 120/200\n", "5574/5574 [==============================] - 2s 286us/step - loss: 0.7280 - acc: 0.7707 - val_loss: 0.7625 - val_acc: 0.7546\n", "Epoch 121/200\n", "5574/5574 [==============================] - 2s 339us/step - loss: 0.7263 - acc: 0.7707 - val_loss: 0.7598 - val_acc: 0.7542\n", "Epoch 122/200\n", "5574/5574 [==============================] - 2s 316us/step - loss: 0.7253 - acc: 0.7711 - val_loss: 0.7611 - val_acc: 0.7555\n", "Epoch 123/200\n", "5574/5574 [==============================] - 1s 251us/step - loss: 0.7224 - acc: 0.7718 - val_loss: 0.7614 - val_acc: 0.7542\n", "Epoch 124/200\n", "5574/5574 [==============================] - 2s 324us/step - loss: 0.7193 - acc: 0.7731 - val_loss: 0.7598 - val_acc: 0.7542\n", "Epoch 125/200\n", "5574/5574 [==============================] - 1s 254us/step - loss: 0.7217 - acc: 0.7743 - val_loss: 0.7546 - val_acc: 0.7588\n", "Epoch 126/200\n", "5574/5574 [==============================] - 1s 236us/step - loss: 0.7198 - acc: 0.7729 - val_loss: 0.7577 - val_acc: 0.7601\n", "Epoch 127/200\n", "5574/5574 [==============================] - 1s 222us/step - loss: 0.7199 - acc: 0.7711 - val_loss: 0.7586 - val_acc: 0.7551\n", "Epoch 128/200\n", "5574/5574 [==============================] - 1s 222us/step - loss: 0.7141 - acc: 0.7770 - val_loss: 0.7544 - val_acc: 0.7626\n", "Epoch 129/200\n", "5574/5574 [==============================] - 1s 167us/step - loss: 0.7134 - acc: 0.7768 - val_loss: 0.7514 - val_acc: 0.7601\n", "Epoch 130/200\n", "5574/5574 [==============================] - 1s 163us/step - loss: 0.7129 - acc: 0.7783 - val_loss: 0.7565 - val_acc: 0.7555\n", "Epoch 131/200\n", "5574/5574 [==============================] - 1s 202us/step - loss: 0.7172 - acc: 0.7725 - val_loss: 0.7598 - val_acc: 0.7567\n", "Epoch 132/200\n", "5574/5574 [==============================] - 1s 164us/step - loss: 0.7119 - acc: 0.7759 - val_loss: 0.7574 - val_acc: 0.7588\n", "Epoch 133/200\n", "5574/5574 [==============================] - 1s 168us/step - loss: 0.7159 - acc: 0.7747 - val_loss: 0.7558 - val_acc: 0.7559\n", "Epoch 134/200\n", "5574/5574 [==============================] - 1s 220us/step - loss: 0.7146 - acc: 0.7731 - val_loss: 0.7587 - val_acc: 0.7576\n", "Epoch 135/200\n", "5574/5574 [==============================] - 1s 226us/step - loss: 0.7138 - acc: 0.7748 - val_loss: 0.7560 - val_acc: 0.7618\n", "Epoch 136/200\n", "5574/5574 [==============================] - 1s 208us/step - loss: 0.7111 - acc: 0.7774 - val_loss: 0.7550 - val_acc: 0.7609\n", "Epoch 137/200\n", "5574/5574 [==============================] - 1s 212us/step - loss: 0.7106 - acc: 0.7770 - val_loss: 0.7566 - val_acc: 0.7605\n", "Epoch 138/200\n", "5574/5574 [==============================] - 1s 189us/step - loss: 0.7095 - acc: 0.7743 - val_loss: 0.7652 - val_acc: 0.7542\n", "Epoch 139/200\n", "5574/5574 [==============================] - 1s 161us/step - loss: 0.7084 - acc: 0.7761 - val_loss: 0.7570 - val_acc: 0.7555\n", "Epoch 140/200\n", "5574/5574 [==============================] - 1s 158us/step - loss: 0.7115 - acc: 0.7713 - val_loss: 0.7623 - val_acc: 0.7563\n", "Epoch 141/200\n", "5574/5574 [==============================] - 1s 160us/step - loss: 0.7105 - acc: 0.7732 - val_loss: 0.7556 - val_acc: 0.7563\n", "Epoch 142/200\n", "5574/5574 [==============================] - 1s 182us/step - loss: 0.7104 - acc: 0.7745 - val_loss: 0.7578 - val_acc: 0.7572\n", "Epoch 143/200\n", "5574/5574 [==============================] - 1s 170us/step - loss: 0.7119 - acc: 0.7718 - val_loss: 0.7565 - val_acc: 0.7567\n", "Epoch 144/200\n", "5574/5574 [==============================] - 1s 171us/step - loss: 0.7134 - acc: 0.7731 - val_loss: 0.7600 - val_acc: 0.7551\n", "Epoch 145/200\n", "5574/5574 [==============================] - 1s 170us/step - loss: 0.7112 - acc: 0.7750 - val_loss: 0.7598 - val_acc: 0.7572\n", "Epoch 146/200\n", "5574/5574 [==============================] - 1s 230us/step - loss: 0.7170 - acc: 0.7680 - val_loss: 0.7588 - val_acc: 0.7576\n", "Epoch 147/200\n", "5574/5574 [==============================] - 1s 225us/step - loss: 0.7168 - acc: 0.7687 - val_loss: 0.7630 - val_acc: 0.7513\n", "Epoch 148/200\n", "5574/5574 [==============================] - 1s 248us/step - loss: 0.7157 - acc: 0.7709 - val_loss: 0.7659 - val_acc: 0.7538\n", "Epoch 149/200\n", "5574/5574 [==============================] - 1s 223us/step - loss: 0.7152 - acc: 0.7684 - val_loss: 0.7662 - val_acc: 0.7576\n", "Epoch 150/200\n", "5574/5574 [==============================] - 1s 214us/step - loss: 0.7177 - acc: 0.7702 - val_loss: 0.7649 - val_acc: 0.7563\n", "Epoch 151/200\n", "5574/5574 [==============================] - 1s 203us/step - loss: 0.7152 - acc: 0.7711 - val_loss: 0.7683 - val_acc: 0.7525\n", "Epoch 152/200\n", "5574/5574 [==============================] - 1s 216us/step - loss: 0.7203 - acc: 0.7705 - val_loss: 0.7710 - val_acc: 0.7538\n", "Epoch 153/200\n", "5574/5574 [==============================] - 1s 220us/step - loss: 0.7244 - acc: 0.7682 - val_loss: 0.7667 - val_acc: 0.7513\n", "Epoch 154/200\n", "5574/5574 [==============================] - 1s 206us/step - loss: 0.7190 - acc: 0.7680 - val_loss: 0.7657 - val_acc: 0.7601\n", "Epoch 155/200\n", "5574/5574 [==============================] - 1s 179us/step - loss: 0.7123 - acc: 0.7693 - val_loss: 0.7659 - val_acc: 0.7584\n", "Epoch 156/200\n", "5574/5574 [==============================] - 1s 246us/step - loss: 0.7098 - acc: 0.7722 - val_loss: 0.7565 - val_acc: 0.7555\n", "Epoch 157/200\n", "5574/5574 [==============================] - 1s 189us/step - loss: 0.7070 - acc: 0.7727 - val_loss: 0.7544 - val_acc: 0.7576\n", "Epoch 158/200\n", "5574/5574 [==============================] - 1s 205us/step - loss: 0.7081 - acc: 0.7734 - val_loss: 0.7497 - val_acc: 0.7563\n", "Epoch 159/200\n", "5574/5574 [==============================] - 1s 211us/step - loss: 0.7111 - acc: 0.7731 - val_loss: 0.7510 - val_acc: 0.7555\n", "Epoch 160/200\n", "5574/5574 [==============================] - 1s 247us/step - loss: 0.7120 - acc: 0.7720 - val_loss: 0.7559 - val_acc: 0.7546\n", "Epoch 161/200\n", "5574/5574 [==============================] - 2s 271us/step - loss: 0.7110 - acc: 0.7720 - val_loss: 0.7559 - val_acc: 0.7546\n", "Epoch 162/200\n", "5574/5574 [==============================] - 1s 198us/step - loss: 0.7093 - acc: 0.7745 - val_loss: 0.7606 - val_acc: 0.7542\n", "Epoch 163/200\n", "5574/5574 [==============================] - 1s 192us/step - loss: 0.7083 - acc: 0.7757 - val_loss: 0.7568 - val_acc: 0.7635\n", "Epoch 164/200\n", "5574/5574 [==============================] - 1s 214us/step - loss: 0.7062 - acc: 0.7736 - val_loss: 0.7535 - val_acc: 0.7605\n", "Epoch 165/200\n", "5574/5574 [==============================] - 1s 177us/step - loss: 0.7045 - acc: 0.7757 - val_loss: 0.7479 - val_acc: 0.7601\n", "Epoch 166/200\n", "5574/5574 [==============================] - 1s 162us/step - loss: 0.7014 - acc: 0.7736 - val_loss: 0.7463 - val_acc: 0.7626\n", "Epoch 167/200\n", "5574/5574 [==============================] - 1s 162us/step - loss: 0.6955 - acc: 0.7786 - val_loss: 0.7383 - val_acc: 0.7618\n", "Epoch 168/200\n", "5574/5574 [==============================] - 1s 168us/step - loss: 0.6942 - acc: 0.7761 - val_loss: 0.7377 - val_acc: 0.7656\n", "Epoch 169/200\n", "5574/5574 [==============================] - 1s 189us/step - loss: 0.6938 - acc: 0.7781 - val_loss: 0.7398 - val_acc: 0.7652\n", "Epoch 170/200\n", "5574/5574 [==============================] - 1s 209us/step - loss: 0.6899 - acc: 0.7793 - val_loss: 0.7360 - val_acc: 0.7643\n", "Epoch 171/200\n", "5574/5574 [==============================] - 1s 165us/step - loss: 0.6876 - acc: 0.7797 - val_loss: 0.7374 - val_acc: 0.7677\n", "Epoch 172/200\n", "5574/5574 [==============================] - 1s 164us/step - loss: 0.6866 - acc: 0.7801 - val_loss: 0.7386 - val_acc: 0.7614\n", "Epoch 173/200\n", "5574/5574 [==============================] - 1s 167us/step - loss: 0.6879 - acc: 0.7783 - val_loss: 0.7307 - val_acc: 0.7668\n", "Epoch 174/200\n", "5574/5574 [==============================] - 1s 165us/step - loss: 0.6837 - acc: 0.7793 - val_loss: 0.7330 - val_acc: 0.7652\n", "Epoch 175/200\n", "5574/5574 [==============================] - 1s 210us/step - loss: 0.6845 - acc: 0.7786 - val_loss: 0.7300 - val_acc: 0.7689\n", "Epoch 176/200\n", "5574/5574 [==============================] - 1s 160us/step - loss: 0.6853 - acc: 0.7784 - val_loss: 0.7333 - val_acc: 0.7643\n", "Epoch 177/200\n", "5574/5574 [==============================] - 1s 161us/step - loss: 0.6824 - acc: 0.7779 - val_loss: 0.7291 - val_acc: 0.7652\n", "Epoch 178/200\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "5574/5574 [==============================] - 1s 160us/step - loss: 0.6830 - acc: 0.7757 - val_loss: 0.7300 - val_acc: 0.7673\n", "Epoch 179/200\n", "5574/5574 [==============================] - 1s 175us/step - loss: 0.6857 - acc: 0.7781 - val_loss: 0.7277 - val_acc: 0.7681\n", "Epoch 180/200\n", "5574/5574 [==============================] - 1s 187us/step - loss: 0.6854 - acc: 0.7784 - val_loss: 0.7351 - val_acc: 0.7664\n", "Epoch 181/200\n", "5574/5574 [==============================] - 1s 187us/step - loss: 0.6842 - acc: 0.7783 - val_loss: 0.7317 - val_acc: 0.7652\n", "Epoch 182/200\n", "5574/5574 [==============================] - 1s 178us/step - loss: 0.6850 - acc: 0.7797 - val_loss: 0.7367 - val_acc: 0.7639\n", "Epoch 183/200\n", "5574/5574 [==============================] - 1s 176us/step - loss: 0.6889 - acc: 0.7783 - val_loss: 0.7395 - val_acc: 0.7605\n", "Epoch 184/200\n", "5574/5574 [==============================] - 1s 221us/step - loss: 0.6884 - acc: 0.7777 - val_loss: 0.7391 - val_acc: 0.7601\n", "Epoch 185/200\n", "5574/5574 [==============================] - 1s 249us/step - loss: 0.6870 - acc: 0.7793 - val_loss: 0.7343 - val_acc: 0.7660\n", "Epoch 186/200\n", "5574/5574 [==============================] - 1s 197us/step - loss: 0.6858 - acc: 0.7788 - val_loss: 0.7262 - val_acc: 0.7681\n", "Epoch 187/200\n", "5574/5574 [==============================] - 1s 189us/step - loss: 0.6810 - acc: 0.7788 - val_loss: 0.7270 - val_acc: 0.7689\n", "Epoch 188/200\n", "5574/5574 [==============================] - 1s 180us/step - loss: 0.6825 - acc: 0.7799 - val_loss: 0.7328 - val_acc: 0.7635\n", "Epoch 189/200\n", "5574/5574 [==============================] - 1s 215us/step - loss: 0.6831 - acc: 0.7802 - val_loss: 0.7392 - val_acc: 0.7597\n", "Epoch 190/200\n", "5574/5574 [==============================] - 1s 193us/step - loss: 0.6851 - acc: 0.7806 - val_loss: 0.7414 - val_acc: 0.7588\n", "Epoch 191/200\n", "5574/5574 [==============================] - 1s 177us/step - loss: 0.6834 - acc: 0.7788 - val_loss: 0.7355 - val_acc: 0.7652\n", "Epoch 192/200\n", "5574/5574 [==============================] - 1s 182us/step - loss: 0.6863 - acc: 0.7808 - val_loss: 0.7313 - val_acc: 0.7635\n", "Epoch 193/200\n", "5574/5574 [==============================] - 1s 199us/step - loss: 0.6886 - acc: 0.7792 - val_loss: 0.7373 - val_acc: 0.7572\n", "Epoch 194/200\n", "5574/5574 [==============================] - 1s 224us/step - loss: 0.6885 - acc: 0.7804 - val_loss: 0.7428 - val_acc: 0.7572\n", "Epoch 195/200\n", "5574/5574 [==============================] - 1s 223us/step - loss: 0.6862 - acc: 0.7827 - val_loss: 0.7428 - val_acc: 0.7546\n", "Epoch 196/200\n", "5574/5574 [==============================] - 1s 202us/step - loss: 0.6869 - acc: 0.7817 - val_loss: 0.7448 - val_acc: 0.7546\n", "Epoch 197/200\n", "5574/5574 [==============================] - 1s 182us/step - loss: 0.6869 - acc: 0.7820 - val_loss: 0.7458 - val_acc: 0.7618\n", "Epoch 198/200\n", "5574/5574 [==============================] - 1s 199us/step - loss: 0.6839 - acc: 0.7818 - val_loss: 0.7401 - val_acc: 0.7605\n", "Epoch 199/200\n", "5574/5574 [==============================] - 1s 188us/step - loss: 0.6815 - acc: 0.7826 - val_loss: 0.7375 - val_acc: 0.7609\n", "Epoch 200/200\n", "5574/5574 [==============================] - 1s 195us/step - loss: 0.6792 - acc: 0.7844 - val_loss: 0.7357 - val_acc: 0.7630\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.fit(train, encoded_train, validation_data=(test, encoded_test), epochs=200, batch_size=32)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "dense_3 (Dense) multiple 307712 \n", "_________________________________________________________________\n", "dense_4 (Dense) multiple 16512 \n", "_________________________________________________________________\n", "dense_5 (Dense) multiple 2193 \n", "=================================================================\n", "Total params: 326,417\n", "Trainable params: 326,417\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "model.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Cross-validation (in-progress)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "# Load libraries\n", "import numpy as np\n", "from tensorflow.keras import models\n", "from tensorflow.keras import layers\n", "from tensorflow.keras.wrappers.scikit_learn import KerasClassifier\n", "from sklearn.model_selection import cross_val_score\n", "from sklearn.datasets import make_classification" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [], "source": [ "# Create function returning a compiled network\n", "def create_network():\n", " model = tf.keras.Sequential()\n", " model.add(layers.Dense(128, activation='sigmoid'))\n", " model.add(layers.Dense(128, activation='sigmoid'))\n", " model.add(layers.Dense(17, activation='softmax'))\n", " model.compile(optimizer=tf.train.RMSPropOptimizer(5.1794746792312125e-05),\n", " loss='categorical_crossentropy',\n", " metrics=['accuracy'])\n", " # Return compiled network\n", " return model" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "# Wrap Keras model so it can be used by scikit-learn\n", "neural_network = KerasClassifier(build_fn=create_network, \n", " epochs=100, \n", " batch_size=32, \n", " verbose=0)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.65285253, 0.66469322, 0.66953714])" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Evaluate neural network using three-fold cross-validation\n", "cross_val_score(neural_network, train, encoded_train, cv=3)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 2 }