{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Purchase Prediction using a LSTM RNN" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Background \n", "\n", "This notebook was published as part of an AWS ML blog . It is the second notebook of two published as part of the blog. The first notebook presents the bulk of the data discovery and processing steps described in the blog. This second notebook takes the dataset generated by the first notebook, and demonstrates the training and model serving steps involved in a ML process to deploy a custom Tensorflow model in SageMaker. \n", "\n", "Read the blog for context around the use case.\n", "\n", "The dataset referenced by this notebook originates from the public UCI Machine Learning Repository: http://archive.ics.uci.edu/ml/datasets/online+retail\n", "\n", " Source: \n", "\n", "Dr Daqing Chen, Director: Public Analytics group. chend '@' lsbu.ac.uk, School of Engineering, London South Bank University, London SE1 0AA, UK.\n", "\n", " Data Set Information: \n", "\n", "This is a transnational data set which contains all the transactions occurring between 01/12/2010 and 09/12/2011 for a UK-based and registered non-store online retail.The company mainly sells unique all-occasion gifts. Many customers of the company are wholesalers.\n", "\n", " Attribute Information: \n", "\n", "InvoiceNo: Invoice number. Nominal, a 6-digit integral number uniquely assigned to each transaction. If this code starts with letter 'c', it indicates a cancellation. StockCode: Product (item) code. Nominal, a 5-digit integral number uniquely assigned to each distinct product. Description: Product (item) name. Nominal. Quantity: The quantities of each product (item) per transaction. Numeric.\n", "InvoiceDate: Invice Date and time. Numeric, the day and time when each transaction was generated. UnitPrice: Unit price. Numeric, Product price per unit in sterling. CustomerID: Customer number. Nominal, a 5-digit integral number uniquely assigned to each customer. Country: Country name. Nominal, the name of the country where each customer resides." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Setup\n", "\n", "This notebook was created and tested on an ml.p2.xlarge notebook instance running the conda_tensorflow_p27 kernel . The p-class instance was selected for local GPU training, which was ideal for rapid prototyping. However, a ml.m4.xlarge instance is more than sufficient to run this notebook.\n", "\n", "Begin by...\n", "1. Follow the instructions in the first notebook . The notebook will produce two files used by this notebook. \n", "2. Start up a notebook instance, and ensure the instance has accessed to the files produced by the first notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check the devices available on your notebook. If you provisoned a p type instance, you should see a GPU device like '/device:GPU:0' " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['/device:CPU:0', '/device:GPU:0']\n" ] } ], "source": [ "from tensorflow.python.client import device_lib\n", "\n", "def get_available_devices(): \n", " local_device_protos = device_lib.list_local_devices()\n", " return [x.name for x in local_device_protos]\n", "\n", "print(get_available_devices()) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Additional libarires need to be installed and updated on the notebook instance. For instance, you will need pandas 0.22+ as well as some other libraries to read the parquet file from S3. Run the following commands to install them on your instance" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!yes | conda update -n base conda\n", "!yes | conda update pandas\n", "!yes | conda update dask\n", "!pip install s3fs\n", "!pip install -U fastparquet\n", "#!yes | conda install -c anaconda tensorflow-tensorboard " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Import the required dependencies" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import boto3\n", "import s3fs\n", "import pandas as pd\n", "import numpy as np\n", "import os\n", "from io import BytesIO, StringIO\n", "import gzip\n", "\n", "from sklearn.utils import shuffle\n", "from sklearn.model_selection import train_test_split\n", "\n", "import tensorflow as tf\n", "from tensorflow.python.keras.layers import Dense, Embedding, TimeDistributed\n", "from tensorflow.python.keras.regularizers import l2\n", "from tensorflow.python.estimator.export.export_output import PredictOutput\n", "from tensorflow.python.saved_model.signature_constants import DEFAULT_SERVING_SIGNATURE_DEF_KEY\n", "\n", "from sagemaker.tensorflow import TensorFlow\n", "from sagemaker.tensorflow.predictor import tf_serializer, tf_deserializer\n", "from sagemaker.predictor import RealTimePredictor\n", "from sagemaker.content_types import CONTENT_TYPE_OCTET_STREAM\n", "from tensorflow_serving.apis import predict_pb2\n", "\n", "pd.set_option(\"display.max_rows\", 10)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Update S3_BUCKET with the name of the bucket containing the datasets that you created using the first notebook. Set S3_TARGET_PREFIX to the parquet file that contains our sparse vectors of customer orders. Ensure your notebook instance has access to the files in this bucket." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "s3://dtong-ml-datasets/processed/ecomm/cart_sparse_vecs.parquet.gz\n" ] } ], "source": [ "S3_BUCKET = \"dtong-ml-datasets\"\n", "S3_TARGET_PREFIX = \"/processed/ecomm/cart_sparse_vecs.parquet.gz\"\n", "S3_LOCATION = \"s3://\"+S3_BUCKET+S3_TARGET_PREFIX \n", "print(S3_LOCATION)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Load the file" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset shape: (10827, 4)\n", "Sample: \n", " CustomerID InvoiceNo InvoiceDate \\\n", "0 18283 540350 1294323240 \n", "\n", " Cart \n", "0 [0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, ... \n" ] } ], "source": [ "carts = pd.read_parquet(S3_LOCATION, engine='fastparquet')\n", "print(\"Dataset shape: \"+str(carts.shape))\n", "print(\"Sample: \\n\"+str(carts[0:1]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we load the csv file, which contains the product lookup table. You should have created this file from the first notebook. Set S3_TARGET_PREFIX to the location of this file." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "s3://dtong-ml-datasets/processed/ecomm/customer_basket_list.csv.gz\n" ] } ], "source": [ "S3_TARGET_PREFIX = \"/processed/ecomm/customer_basket_list.csv.gz\"\n", "S3_LOCATION = \"s3://\"+S3_BUCKET+S3_TARGET_PREFIX \n", "print(S3_LOCATION)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Load the file" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Product lookup table shape: (3648, 2)\n", "Number of customers: 1090\n" ] } ], "source": [ "products = pd.read_csv(S3_LOCATION, compression='gzip', header=None, sep=',', names=[\"Description\",\"Index\"])\n", "nProducts = products.shape[0] \n", "nSequences = carts.shape[0]\n", "nCustomers = len(carts.groupby(\"CustomerID\").CustomerID)\n", "\n", "print(\"Product lookup table shape: \"+str(products.shape))\n", "print(\"Number of customers: \"+str(nCustomers))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Convert the dataset to a pandas dataframe to fascilitate reshaping the dataset. The orders are stored in the \"Cart\" column as a list. The following unwind this list so that each index value is stored as a column in the dataframe. " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CustomerIDInvoiceDate01234567...3638363936403641364236433644364536463647
01828312943232400.01.00.00.00.00.01.01.0...0.00.00.00.00.00.00.00.00.00.0
11828312957946800.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
21828312988890001.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
31828313034038200.01.00.01.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
41828313061503800.00.00.01.00.00.01.00.0...0.00.00.00.00.00.00.00.00.00.0
..................................................................
108221234713021729800.00.01.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
108231234713076244600.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
108241234713122748800.00.01.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
108251234713200639000.00.01.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
108261234713232731200.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
\n", "

10827 rows × 3650 columns

\n", "
" ], "text/plain": [ " CustomerID InvoiceDate 0 1 2 3 4 5 6 7 ... \\\n", "0 18283 1294323240 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 ... \n", "1 18283 1295794680 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... \n", "2 18283 1298889000 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... \n", "3 18283 1303403820 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 ... \n", "4 18283 1306150380 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 ... \n", "... ... ... ... ... ... ... ... ... ... ... ... \n", "10822 12347 1302172980 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 ... \n", "10823 12347 1307624460 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... \n", "10824 12347 1312274880 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 ... \n", "10825 12347 1320063900 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 ... \n", "10826 12347 1323273120 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... \n", "\n", " 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 \n", "0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "... ... ... ... ... ... ... ... ... ... ... \n", "10822 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "10823 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "10824 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "10825 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "10826 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "\n", "[10827 rows x 3650 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cartsDF = pd.merge(pd.DataFrame(carts[[\"CustomerID\",\"InvoiceDate\"]]), \\\n", " pd.DataFrame(carts[\"Cart\"].values.tolist(), dtype=np.float32), \\\n", " how = \"left\", left_index = True, right_index = True)\n", "\n", "display(cartsDF)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to reshape the dataframe into the following datasets so that it can be utilize by the LSTM model that we build in this notebook:\n", "\n", "1. X: contains the inputs shaped as . Conceptually, this data set is organized as a sequence of 49 orders for each of our customers. All customers have varying number of orders, so customers who have less than 50 orders have zero vectors serving as placeholders. \n", "2. Y: represents our targets. Essentially, they are the predictions for the next time step. Y is just X shifted by one time slice as we're trying to train a model that learns the next time slice.\n", "3. SL: we use Tensorflow's dynamic RNN model. Normally RNNs require fixed sequence lengths, which is wasteful in many ways. Dyanmic RNNs provides a more efficient means of support variable sequence lengths. In order to use the dynamic rnn model, a vector of sequence lengths have to be provided to the Tensorflow model to support dynamic unrolling. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/ec2-user/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/ipykernel/__main__.py:4: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "X shape: (1090, 49, 3648)\n", "Y shape: (1090, 49, 3648)\n", "Sequence Lengths shape: (1090,)\n" ] } ], "source": [ "MAX_TIMESTEPS = 50\n", "adjustedSteps = MAX_TIMESTEPS - 1\n", "\n", "cartsMat = cartsDF.as_matrix()\n", "X = np.zeros((nCustomers,adjustedSteps,nProducts))\n", "Y = np.zeros((nCustomers,adjustedSteps,nProducts))\n", "SL = np.ones(nCustomers)\n", "\n", "lastCustomer = cartsMat[0,0]\n", "timeStep = 0\n", "cIdx = 0\n", "\n", "for i in range(nSequences-1) :\n", " \n", " cid = cartsMat[i,0]\n", " if (cid != lastCustomer) : \n", " \n", " if ((timeStep >= 1) and (timeStep <= adjustedSteps)) :\n", " Y[cIdx:cIdx+1,timeStep-1,:] = 0.\n", " X[cIdx:cIdx+1,timeStep-1,:] = 0.\n", " SL[cIdx] = timeStep-1\n", " \n", " timeStep = 0\n", " cIdx = cIdx + 1\n", " Y[cIdx:cIdx+1,timeStep,:] = cartsMat[i+1,2:]\n", " X[cIdx:cIdx+1,timeStep,:] = cartsMat[i,2:]\n", " timeStep = timeStep + 1 \n", " \n", " elif (timeStep < adjustedSteps) :\n", " \n", " Y[cIdx:cIdx+1,timeStep,:] = cartsMat[i+1,2:]\n", " X[cIdx:cIdx+1,timeStep,:] = cartsMat[i,2:]\n", " timeStep = timeStep + 1 \n", " SL[cIdx] = timeStep \n", " \n", " elif (timeStep >= adjustedSteps) :\n", " timeStep = timeStep + 1 \n", " \n", " lastCustomer = cid \n", " \n", "print(\"X shape: \"+ str(X.shape))\n", "print(\"Y shape: \"+ str(Y.shape))\n", "print(\"Sequence Lengths shape: \"+ str(SL.shape))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll create a variation of the Y dataset, so that they better represent target softmax outputs. We'll normalize all the values of the Y vectors, so that the values in the vector represent probabilities. Each product purchase is assign equal probability." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0.03448276 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.03448276]]\n", "\n", " [[0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0.02702703 0. 0. ]]]\n" ] } ], "source": [ "Y_sm = np.divide(Y,np.maximum(1.,Y.sum(axis=2))[:,:,None])\n", "print(Y_sm[0:2,0:2,0:10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll use a random 80:20 split on the dataset for training and validation" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(872, 49, 3648)\n", "(218, 49, 3648)\n", "(872, 49, 3648)\n", "(218, 49, 3648)\n", "(872,)\n", "(218,)\n" ] } ], "source": [ "X = X.astype(np.float32)\n", "Y = Y.astype(np.float32)\n", "Y_sm = Y_sm.astype(np.float32)\n", "SL = SL.astype(np.int32)\n", "\n", "X, Y, Y_sm, SL = shuffle(X, Y, Y_sm, SL)\n", "X_train, X_val, Y_train, Y_val, Y_sm_train, Y_sm_val, SL_train, SL_val = train_test_split(X, Y, Y_sm, SL, test_size=0.2)\n", "\n", "print(X_train.shape)\n", "print(X_val.shape)\n", "print(Y_train.shape)\n", "print(Y_val.shape)\n", "print(SL_train.shape)\n", "print(SL_val.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sagemaker training expects to obtain these datasets from an S3 location. We'll convert this dataset back into pandas dataframes to fasciltiate writing our training, validation and sequence length datasets out to S3." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(42728, 3648)\n", "(42728, 3648)\n", "(872, 1)\n", "(10682, 3648)\n", "(10682, 3648)\n", "(218, 1)\n" ] } ], "source": [ "X_train_df = pd.DataFrame(X_train.reshape(X_train.shape[0]*X_train.shape[1],X_train.shape[2]),dtype=np.float32)\n", "Y_train_df = pd.DataFrame(Y_sm_train.reshape(Y_sm_train.shape[0]*Y_sm_train.shape[1],Y_sm_train.shape[2]),dtype=np.float32)\n", "SL_train_df = pd.DataFrame(SL_train,dtype=np.float32)\n", "\n", "X_val_df = pd.DataFrame(X_val.reshape(X_val.shape[0]*X_val.shape[1],X_val.shape[2]),dtype=np.float32)\n", "Y_val_df = pd.DataFrame(Y_val.reshape(Y_val.shape[0]*Y_val.shape[1],Y_val.shape[2]),dtype=np.float32)\n", "SL_val_df = pd.DataFrame(SL_val,dtype=np.float32)\n", "\n", "print(X_train_df.shape)\n", "print(Y_train_df.shape)\n", "print(SL_train_df.shape)\n", "print(X_val_df.shape)\n", "print(Y_val_df.shape)\n", "print(SL_val_df.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set S3_BUCKET to the S3 bucket that will house the datasets, code and artifacts for Sagemaker training. Set the following prefixes accordingly:\n", "\n", "1. S3_DATA_LOCATION: location where your training, validation and sequence length data sets are stored\n", "2. S3_MODEL_LOCATION: location where model artifacts produced by training will be stored\n", "3. S3_CODE_LOCATION: location where the Python script defining the Sagemaker custom model will be stored" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "S3_BUCKET = \"awslabs-ml-samples\"\n", "S3_DATA_LOCATION = \"datasets/rnn_purchase_predictor/\"\n", "S3_MODEL_LOCATION = \"models/rnn_purchase_predictor/\"\n", "S3_CODE_LOCATION = \"code/rnn_purchase_predictor/\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below are various constants including hyperparameter parameters that can be modified. A few values you may choose to change:\n", "\n", "1. TRAINING_INSTANCE_TYPE, TRAINING_INSTANCE_COUNT: currently these values are set to perform GPU training on a single ml.p2.xlarge instance. If you want to try distributed training, you can modify the values to \"ml.c4.8xlarge\" and \"2,\" for instance.\n", "2. SAVE_PATH, CUSTOM_TF_MODEL_FILENAME: SAVE_PATH specifies the location of the python script that defines your custom Tensorflow model stored on your notebook instance. Either create a folder calle \"rnn_purchase_predictor\" in your home directory, or modify the path accordingly. The name of the script is set to \"rnn_purchase_predictor_custom_tf_model.py.\" Again, if you need to upload the script with this name into the SAVE_PATH location, or modify this value if you choose to rename the file.\n", "\n", "You can download \"rnn_purchase_predictor_custom_tf_model.py\" from this Github location: https://github.com/aws-samples/aws-sagemaker-ml-blog-predictive-campaigns/blob/master/scripts/rnn_purchase_predictor_custom_tf_model.py" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "ENCODER_BOTTLENECK = 128\n", "DECODER_BOTTLENECK = 128\n", "LSTM_UNITS = 600\n", "TIME_STEPS = MAX_TIMESTEPS - 1\n", "EPOCHS = 300\n", "LEARNING_RATE = 0.001\n", "INPUT_SIZE = nProducts\n", "OUTPUT_SIZE = INPUT_SIZE\n", "BATCHES = X_train.shape[0]\n", "BATCH_SIZE= 32\n", "K_PREDICTIONS = 3\n", "SAVE_PATH = \"./rnn_purchase_predictor/\"\n", "TOP_PROD_BY_QTYBOUGHT = 138\n", "TOP_PROD_BY_TIMESBOUGHT = 0\n", "CUSTOM_TF_MODEL_FILENAME = \"rnn_purchase_predictor_custom_tf_model.py\"\n", "POSITIVE_THRESHOLD = 0.5\n", "TRAINING_INSTANCE_TYPE = \"ml.p2.xlarge\"\n", "#TRAINING_INSTANCE_TYPE = \"ml.c4.8xlarge\"\n", "TRAINING_INSTANCE_COUNT = 1\n", "DROPOUT_RNN_STATE_KEEP_PROB = 0.3\n", "DROPOUT_RNN_INPUT_KEEP_PROB = 0.2\n", "L2_REG_DENSE = 0.0005\n", "\n", "training_dir = \"s3://\"+S3_BUCKET+\"/\"+S3_DATA_LOCATION\n", "model_dir = \"s3://\"+S3_BUCKET+\"/\"+S3_MODEL_LOCATION\n", "code_dir = \"s3://\"+S3_BUCKET+\"/\"+S3_CODE_LOCATION\n", "iamRole = \"arn:aws:iam::803235869972:role/service-role/AmazonSageMaker-ExecutionRole-20171129T110981\"\n", "\n", "training_steps = int(np.ceil(float(X_train.shape[0])/BATCH_SIZE))*EPOCHS\n", "evaluation_steps = int(np.ceil(float(X_val.shape[0])/BATCH_SIZE))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can run the following code block below to write out the training and validation sets to the S3 locations configured above. Again, ensure your notebook instance has requried access to S3." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "X_TRAIN_FILENAME = \"X_train.csv.gz\"\n", "Y_TRAIN_FILENAME = \"Y_train.csv.gz\"\n", "SL_TRAIN_FILENAME = \"SL_train.csv.gz\"\n", "X_VAL_FILENAME = \"X_val.csv.gz\"\n", "Y_VAL_FILENAME = \"Y_val.csv.gz\"\n", "SL_VAL_FILENAME = \"SL_val.csv.gz\"\n", " \n", "datasets = [X_train_df, Y_train_df, SL_train_df, X_val_df, Y_val_df, SL_val_df]\n", "filenames = [X_TRAIN_FILENAME,Y_TRAIN_FILENAME,SL_TRAIN_FILENAME,X_VAL_FILENAME,Y_VAL_FILENAME,SL_VAL_FILENAME]\n", "s3_resource = boto3.resource('s3')\n", "\n", "for i in range(len(datasets)) :\n", " \n", " csv_buffer = datasets[i].to_csv(None).encode()\n", "\n", " gz_buffer = BytesIO()\n", "\n", " with gzip.GzipFile(mode='w', fileobj=gz_buffer) as gz_file:\n", " gz_file.write(csv_buffer)\n", "\n", " s3_object = s3_resource.Object(S3_BUCKET, S3_DATA_LOCATION+filenames[i])\n", " s3_object.put(Body=gz_buffer.getvalue())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following code block contains the same contents as rnn_purchase_predictor_custom_tf_model.py . I embedded the code in this notebook for the purpose of local training. During development, it is often practical to perform local training on the notebook before using Sagemaker's remote distributed training. There is overhead associated with executing remote training; therefore, local training is more practical for early stages of rapid prototyping and experimenting with changes." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "X_TRAIN_FILENAME = \"X_train.csv.gz\"\n", "Y_TRAIN_FILENAME = \"Y_train.csv.gz\"\n", "SL_TRAIN_FILENAME = \"SL_train.csv.gz\"\n", "X_VAL_FILENAME = \"X_val.csv.gz\"\n", "Y_VAL_FILENAME = \"Y_val.csv.gz\"\n", "SL_VAL_FILENAME = \"SL_val.csv.gz\"\n", "\n", "INPUT_TENSOR_NAME = \"ph_inputs\"\n", "OUTPUT_TENSOR_NAME = \"ph_labels\"\n", "SL_TENSOR_NAME = \"ph_sequence_lengths\"\n", "\n", "def train_input_fn(training_dir, hyperparameters):\n", " \n", " file_names = {\"X\": X_TRAIN_FILENAME, \"Y\": Y_TRAIN_FILENAME, \"SL\": SL_TRAIN_FILENAME}\n", " return _input_fn(training_dir, file_names, None, True, hyperparameters)\n", "\n", "def eval_input_fn(training_dir, hyperparameters):\n", " \n", " file_names = {\"X\": X_VAL_FILENAME, \"Y\": Y_VAL_FILENAME, \"SL\": SL_VAL_FILENAME}\n", " return _input_fn(training_dir, file_names, 1, False, hyperparameters)\n", "\n", "def _input_fn(data_dir, file_names, epochs, do_shuffle, hyperparameters):\n", " \n", " xdf = pd.read_csv(os.path.join(data_dir, file_names[\"X\"]), \n", " compression=\"gzip\", header=0, index_col=0, sep=\",\", dtype=np.float32)\n", " ydf = pd.read_csv(os.path.join(data_dir, file_names[\"Y\"]), \n", " compression=\"gzip\", header=0, index_col=0, sep=\",\", dtype=np.float32)\n", " sldf = pd.read_csv(os.path.join(data_dir, file_names[\"SL\"]), \n", " compression=\"gzip\", header=0, index_col=0, sep=\",\", dtype=np.float32)\n", "\n", " X = xdf.as_matrix().reshape(-1, hyperparameters[\"MAX_TIMESTEP\"], hyperparameters[\"INPUT_SIZE\"])\n", " Y = ydf.as_matrix().reshape(-1, hyperparameters[\"MAX_TIMESTEP\"], hyperparameters[\"INPUT_SIZE\"])\n", " SL = sldf.as_matrix().reshape(-1,)\n", " \n", " return tf.estimator.inputs.numpy_input_fn(\n", " x = {INPUT_TENSOR_NAME: X, SL_TENSOR_NAME: SL},\n", " y = Y,\n", " batch_size = hyperparameters[\"BATCH_SIZE\"],\n", " num_epochs=epochs,\n", " shuffle=do_shuffle)()\n", "\n", "def serving_input_fn(hyperparameters):\n", " \n", " _input = tf.placeholder(tf.float32, [1, hyperparameters[\"MAX_TIMESTEP\"], hyperparameters[\"INPUT_SIZE\"]], name=INPUT_TENSOR_NAME)\n", " _index = tf.placeholder(tf.int32, [1, ], name = SL_TENSOR_NAME)\n", " \n", " return tf.estimator.export.build_raw_serving_input_receiver_fn({INPUT_TENSOR_NAME: _input, SL_TENSOR_NAME: _index})()\n", "\n", "def _calculate_sequence_counts(sl, max_timestep):\n", "\n", " sc = [tf.reduce_sum(tf.cast(tf.greater_equal(sl, 1), tf.int32))]\n", " \n", " for i in range(1,max_timestep) :\n", " sc = tf.concat([sc, [tf.reduce_sum(tf.cast(tf.greater_equal(sl, i+1), tf.int32))]], axis=-1)\n", " \n", " return sc\n", "\n", "def metric_timestep_accuracy(acc_tensor, eval_metric_ops) :\n", " \n", " for i in range(acc_tensor.shape[0]) :\n", " eval_metric_ops[\"acc\"+str(i)]= tf.metrics.mean(tf.gather(acc_tensor,i))\n", " \n", " return eval_metric_ops\n", "\n", "def metric_timestep_acc_by_top_qty(metric_tensor, eval_metric_ops) :\n", " \n", " for i in range(metric_tensor.shape[0]) :\n", " eval_metric_ops[\"acc_by_tq\"+str(i)]= tf.metrics.mean(tf.gather(metric_tensor,i))\n", " \n", " return eval_metric_ops\n", " \n", "def metric_timestep_acc_by_times_bought(metric_tensor, eval_metric_ops) :\n", " \n", " for i in range(metric_tensor.shape[0]) :\n", " eval_metric_ops[\"acc_by_tb\"+str(i)]= tf.metrics.mean(tf.gather(metric_tensor,i))\n", " \n", " return eval_metric_ops\n", "\n", "def metric_sequence_counts(metric_tensor, eval_metric_ops) :\n", " \n", " for i in range(metric_tensor.shape[0]) :\n", " eval_metric_ops[\"sc\"+str(i)]= tf.metrics.mean(tf.gather(metric_tensor,i))\n", " \n", " return eval_metric_ops\n", "\n", "def generate_output(top_k, pred_sequences, index):\n", " \n", " begin= tf.constant([0,0],dtype=tf.int32)\n", " end = tf.concat([[tf.constant(1, dtype=tf.int32)],index],0)\n", " valid_pred_seqs = tf.slice(pred_sequences,begin,end)\n", " valid_pred_seqs.set_shape([1,None])\n", " \n", " export_predictions = {\n", " \"prod_indices\": top_k,\n", " \"top_ts_preds\": valid_pred_seqs\n", " }\n", " \n", " export_outputs = {\n", " \"inference_data\": PredictOutput(export_predictions)\n", " }\n", " \n", " return export_outputs\n", "\n", "def model_fn(features, labels, mode, hyperparameters):\n", " \n", " with tf.name_scope(\"RNN_layers\"):\n", " \n", " if (mode == tf.estimator.ModeKeys.PREDICT or mode == tf.estimator.ModeKeys.EVAL): \n", " hyperparameters[\"DROPOUT_RNN_STATE_KEEP_PROB\"]=1\n", " hyperparameters[\"DROPOUT_RNN_INPUT_KEEP_PROB\"]=1\n", " hyperparameters[\"L2_REG_DENSE\"] = 0\n", " \n", " cell = tf.nn.rnn_cell.DropoutWrapper(tf.nn.rnn_cell.BasicLSTMCell(hyperparameters[\"LSTM_UNITS\"], \n", " reuse=tf.get_variable_scope().reuse),\n", " state_keep_prob=hyperparameters[\"DROPOUT_RNN_STATE_KEEP_PROB\"],\n", " input_keep_prob=hyperparameters[\"DROPOUT_RNN_INPUT_KEEP_PROB\"])\n", " \n", " with tf.name_scope('inputs'):\n", " # [mini-batch, time_step, feature dims]\n", " index = features[SL_TENSOR_NAME]\n", " x = features[INPUT_TENSOR_NAME]\n", " y = labels\n", " sc = _calculate_sequence_counts(index,hyperparameters[\"MAX_TIMESTEP\"])\n", " \n", " with tf.name_scope(\"RNN_forward\"):\n", " out, _ = tf.nn.dynamic_rnn(cell, x, sequence_length=index, dtype=tf.float32) \n", " \n", " dense_decoder= Dense(hyperparameters[\"OUTPUT_SIZE\"], \\\n", " kernel_initializer='glorot_uniform', bias_initializer='zeros',\n", " kernel_regularizer= l2(hyperparameters[\"L2_REG_DENSE\"]))\n", " \n", " fc_o1 = TimeDistributed(dense_decoder, \\\n", " input_shape = (None, hyperparameters[\"MAX_TIMESTEP\"], hyperparameters[\"LSTM_UNITS\"])) (out)\n", " \n", " with tf.name_scope('predictions'): \n", " \n", " a_o1 = tf.nn.sigmoid(fc_o1)\n", " predictions = tf.argmax(a_o1, axis=2, name=\"inference_predictions\")\n", " one_hot_predictions = tf.one_hot(predictions, hyperparameters[\"OUTPUT_SIZE\"]) \n", " tf.summary.histogram('predictions', predictions)\n", " \n", " if mode == tf.estimator.ModeKeys.PREDICT:\n", " \n", " last_time_slice = tf.subtract(index,1)\n", " pred_next_time_slice = tf.gather(a_o1, last_time_slice, axis=1)\n", " k_v, k_i = tf.nn.top_k(pred_next_time_slice, k=hyperparameters[\"K_PREDICTIONS\"], sorted=True)\n", " \n", " export_outputs= generate_output(k_i, predictions, index)\n", " \n", " return tf.estimator.EstimatorSpec(mode=mode, \n", " predictions={\"predictions\": k_i},\n", " export_outputs= export_outputs)\n", " \n", " with tf.name_scope('loss'):\n", " \n", " cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(logits=tf.reshape(fc_o1, [-1, hyperparameters[\"OUTPUT_SIZE\"]]),\n", " labels=tf.reshape(y, [-1, hyperparameters[\"OUTPUT_SIZE\"]]))\n", " \n", " loss = tf.reduce_mean(cross_entropy, name=\"metric_loss\")\n", " tf.summary.scalar('loss', loss)\n", " \n", " with tf.name_scope('train') :\n", " optimizer= tf.train.AdamOptimizer(learning_rate=hyperparameters[\"LEARNING_RATE\"])\n", " train_op = optimizer.minimize(loss=loss, global_step=tf.train.get_or_create_global_step())\n", " \n", " with tf.name_scope('validation') :\n", " correct_predictions = tf.reduce_sum(tf.cast( \\\n", " tf.greater(tf.multiply(one_hot_predictions, y),0.), tf.float32), axis=2, name=\"validate_correct\")\n", " correct_pred_indices = tf.multiply(tf.cast(predictions, tf.float32), \\\n", " correct_predictions, name=\"validate_correct_indices\")\n", " \n", " total_correct = tf.reduce_sum(correct_predictions, axis=0) \n", " valid_predictions_per_slice = tf.cast(tf.maximum(sc, tf.ones(sc.shape, tf.int32)), tf.float32)\n", " accuracy = tf.divide(total_correct, valid_predictions_per_slice, name=\"metric_acc\")\n", " tf.summary.histogram('accuracy', accuracy)\n", " \n", " eval_metric_ops = {}\n", " eval_metric_ops = metric_timestep_accuracy(accuracy,eval_metric_ops)\n", " if mode == tf.estimator.ModeKeys.TRAIN:\n", " \n", " training_hooks = [tf.train.LoggingTensorHook(tensors = {\"accuracy\": accuracy},every_n_iter=100)]\n", " \n", " return tf.estimator.EstimatorSpec(mode=mode, \n", " loss=loss, \n", " train_op=train_op,\n", " training_hooks=training_hooks)\n", " \n", " predict_by_top_qty = tf.reduce_sum(tf.reduce_sum(tf.cast( \\\n", " tf.greater(tf.multiply(tf.one_hot(hyperparameters[\"TOP_PROD_BY_QTYBOUGHT\"],\n", " hyperparameters[\"OUTPUT_SIZE\"]), y),0.), \\\n", " tf.float32), axis=2, name=\"validate_correct_by_top_qty\"), axis=0)\n", " \n", " predict_by_times_bought = tf.reduce_sum(tf.reduce_sum(tf.cast( \\\n", " tf.greater(tf.multiply(tf.one_hot(hyperparameters[\"TOP_PROD_BY_TIMESBOUGHT\"], \n", " hyperparameters[\"OUTPUT_SIZE\"]),y),0.), \\\n", " tf.float32), axis=2, name=\"validate_correct_by_times_bought\"), axis=0)\n", "\n", " acc_by_top_qty = tf.divide(predict_by_top_qty,valid_predictions_per_slice, name=\"metric_acc_by_top_qty\")\n", " acc_by_times_bought = tf.divide(predict_by_times_bought,valid_predictions_per_slice, name=\"metric_acc_by_times_bought\")\n", " \n", " if mode == tf.estimator.ModeKeys.EVAL:\n", " \n", " eval_metric_ops = metric_timestep_acc_by_top_qty(acc_by_top_qty,eval_metric_ops)\n", " eval_metric_ops = metric_timestep_acc_by_times_bought(acc_by_times_bought,eval_metric_ops)\n", " eval_metric_ops = metric_sequence_counts(sc,eval_metric_ops)\n", " \n", " eval_hooks = [tf.train.LoggingTensorHook(tensors = {\"accuracy\": accuracy, \"sc\": sc},every_n_iter=100)]\n", " \n", " return tf.estimator.EstimatorSpec(mode=mode, \n", " loss=loss,\n", " evaluation_hooks= eval_hooks,\n", " eval_metric_ops=eval_metric_ops)\n", " \n", " with tf.name_scope('tensorboard') :\n", " merged = tf.summary.merge_all()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This code block contains wrappers around the custom model above. Sagemaker training is performed from an external cluster of servers, so the code needs to include logic to read the datasets from S3. Again, this will slow down develop when we want to perform local training. Since our dataset fits in memory, there is no need that re-read the datasets from S3 with each local training job. The wrappers below simply utilize the data sets that are already loaded into our notebook.\n", "\n", "Run the codeblock below to perform local training." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Using default config.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Using default config.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Using config: {'_model_dir': './rnn_purchase_predictor/', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_service': None, '_cluster_spec': , '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Using config: {'_model_dir': './rnn_purchase_predictor/', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_service': None, '_cluster_spec': , '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Calling model_fn.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/ec2-user/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/ipykernel/__main__.py:11: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", "/home/ec2-user/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/ipykernel/__main__.py:12: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", "/home/ec2-user/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/ipykernel/__main__.py:13: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", "INFO:tensorflow:Calling model_fn.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Done calling model_fn.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Done calling model_fn.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Create CheckpointSaverHook.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Create CheckpointSaverHook.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Graph was finalized.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Graph was finalized.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Running local_init_op.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Running local_init_op.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Done running local_init_op.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Done running local_init_op.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Saving checkpoints for 0 into ./rnn_purchase_predictor/model.ckpt.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Saving checkpoints for 0 into ./rnn_purchase_predictor/model.ckpt.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.6931945, step = 0\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.6931945, step = 0\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0. 0. 0. 0. 0.03846154 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0. 0. 0. 0. 0.03846154 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 3.9744\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 3.9744\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.55061764, step = 100 (25.163 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.55061764, step = 100 (25.163 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.1875 0.09375 0.09375 0.03125 0.06896552 0.05555556\n", " 0.0625 0.07692308 0. 0. 0. 0.\n", " 0. 0.5 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (25.163 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.1875 0.09375 0.09375 0.03125 0.06896552 0.05555556\n", " 0.0625 0.07692308 0. 0. 0. 0.\n", " 0. 0.5 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (25.163 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.52515\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.52515\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.51103324, step = 200 (22.099 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.51103324, step = 200 (22.099 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0. 0.0625 0.03125 0.125 0.12 0.09090909\n", " 0.0625 0.2 0.25 0. 0. 0.\n", " 0. 0. 0. 0. 0.5 0.5\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.099 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0. 0.0625 0.03125 0.125 0.12 0.09090909\n", " 0.0625 0.2 0.25 0. 0. 0.\n", " 0. 0. 0. 0. 0.5 0.5\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.099 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.60866\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.60866\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.46967027, step = 300 (21.698 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.46967027, step = 300 (21.698 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.15625 0.125 0.15625 0.05882353 0.16666667\n", " 0.09090909 0. 0. 0.125 0.125 0.14285715\n", " 0. 0.2 0.2 0.25 0. 0.\n", " 0. 0. 1. 1. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 1. 0. 1. 1. 0. 0.\n", " 1. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.698 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.15625 0.125 0.15625 0.05882353 0.16666667\n", " 0.09090909 0. 0. 0.125 0.125 0.14285715\n", " 0. 0.2 0.2 0.25 0. 0.\n", " 0. 0. 1. 1. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 1. 0. 1. 1. 0. 0.\n", " 1. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.698 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.65142\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.65142\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.43665704, step = 400 (21.499 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.43665704, step = 400 (21.499 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.1875 0.09375 0.125 0.0625 0.08333334 0.15\n", " 0. 0.08333334 0.1 0.2 0. 0.\n", " 0. 0. 0. 0. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.498 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.1875 0.09375 0.125 0.0625 0.08333334 0.15\n", " 0. 0.08333334 0.1 0.2 0. 0.\n", " 0. 0. 0. 0. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.498 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.63745\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.63745\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.41027504, step = 500 (21.564 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.41027504, step = 500 (21.564 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.03125 0.03125 0.0625 0.04166667 0.1\n", " 0.13333334 0.15384616 0.1 0.14285715 0. 0.\n", " 0. 0. 0. 0. 0.5 0.5\n", " 0.5 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.564 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.03125 0.03125 0.0625 0.04166667 0.1\n", " 0.13333334 0.15384616 0.1 0.14285715 0. 0.\n", " 0. 0. 0. 0. 0.5 0.5\n", " 0.5 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.564 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.61072\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.61072\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.37481058, step = 600 (21.689 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.37481058, step = 600 (21.689 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.03125 0.09375 0. 0.09375 0.05263158 0.\n", " 0. 0.125 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.33333334\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.689 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.03125 0.09375 0. 0.09375 0.05263158 0.\n", " 0. 0.125 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.33333334\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.689 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.572\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.572\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.35307625, step = 700 (21.872 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.35307625, step = 700 (21.872 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.03125 0.03125 0.0625 0.04166667 0.05263158\n", " 0. 0. 0. 0.11111111 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.872 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.03125 0.03125 0.0625 0.04166667 0.05263158\n", " 0. 0. 0. 0.11111111 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.872 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57166\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57166\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.3256288, step = 800 (21.874 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.3256288, step = 800 (21.874 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0. 0.03125 0. 0.0625 0.03846154 0.04545455\n", " 0. 0. 0. 0. 0. 0.\n", " 0.33333334 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.874 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0. 0.03125 0. 0.0625 0.03846154 0.04545455\n", " 0. 0. 0. 0. 0. 0.\n", " 0.33333334 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.874 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57675\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57675\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.31225303, step = 900 (21.850 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.31225303, step = 900 (21.850 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.21875 0.09375 0.0625 0.15 0.2\n", " 0.09090909 0.1 0.33333334 0.125 0.14285715 0.\n", " 0.25 0. 0. 0. 0. 0.\n", " 0. 0.5 0.5 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.849 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.21875 0.09375 0.0625 0.15 0.2\n", " 0.09090909 0.1 0.33333334 0.125 0.14285715 0.\n", " 0.25 0. 0. 0. 0. 0.\n", " 0. 0.5 0.5 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.849 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.52382\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.52382\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.2992087, step = 1000 (22.105 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.2992087, step = 1000 (22.105 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.1875 0.09375 0.0625 0.04166667 0.11764706\n", " 0.09090909 0.11111111 0. 0.16666667 0. 0.\n", " 0.5 0. 0.5 0.5 0.5 0.5\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.105 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.1875 0.09375 0.0625 0.04166667 0.11764706\n", " 0.09090909 0.11111111 0. 0.16666667 0. 0.\n", " 0.5 0. 0.5 0.5 0.5 0.5\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.105 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.58896\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.58896\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.2647883, step = 1100 (21.792 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.2647883, step = 1100 (21.792 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.125 0. 0.03125 0.11111111 0.04545455\n", " 0.05263158 0. 0. 0. 0.125 0.\n", " 0.14285715 0.2 0.2 0.2 0. 0.2\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.792 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.125 0. 0.03125 0.11111111 0.04545455\n", " 0.05263158 0. 0. 0. 0.125 0.\n", " 0.14285715 0.2 0.2 0.2 0. 0.2\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.792 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.58048\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.58048\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.24592708, step = 1200 (21.835 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.24592708, step = 1200 (21.835 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.09375 0.09375 0. 0. 0.18181819\n", " 0.04761905 0.07142857 0.07692308 0.18181819 0. 0.125\n", " 0. 0. 0. 0. 0. 0.25\n", " 0. 0.33333334 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.835 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.09375 0.09375 0. 0. 0.18181819\n", " 0.04761905 0.07142857 0.07692308 0.18181819 0. 0.125\n", " 0. 0. 0. 0. 0. 0.25\n", " 0. 0.33333334 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.835 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.6162\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.6162\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.23732421, step = 1300 (21.660 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.23732421, step = 1300 (21.660 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.03125 0.0625 0. 0.09375 0.08695652 0.\n", " 0.0625 0.07142857 0. 0.125 0.2 0.\n", " 0. 0. 0. 0.33333334 0.33333334 0.33333334\n", " 0.33333334 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.659 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.03125 0.0625 0. 0.09375 0.08695652 0.\n", " 0.0625 0.07142857 0. 0.125 0.2 0.\n", " 0. 0. 0. 0.33333334 0.33333334 0.33333334\n", " 0.33333334 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.659 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57144\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57144\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.22829875, step = 1400 (21.875 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.22829875, step = 1400 (21.875 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.03125 0.03125 0.09375 0.09375 0.04166667 0.\n", " 0.08333334 0.33333334 0. 0. 0. 0.25\n", " 0. 0. 0. 0.33333334 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.876 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.03125 0.03125 0.09375 0.09375 0.04166667 0.\n", " 0.08333334 0.33333334 0. 0. 0. 0.25\n", " 0. 0. 0. 0.33333334 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.876 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.58551\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.58551\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.2046446, step = 1500 (21.807 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.2046446, step = 1500 (21.807 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.03125 0.09375 0.125 0. 0.03703704 0.08333334\n", " 0. 0.06666667 0. 0.07692308 0. 0.11111111\n", " 0. 0. 0. 0.2 0.25 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.806 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.03125 0.09375 0.125 0. 0.03703704 0.08333334\n", " 0. 0.06666667 0. 0.07692308 0. 0.11111111\n", " 0. 0. 0. 0.2 0.25 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.806 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.62925\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.62925\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.19104613, step = 1600 (21.602 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.19104613, step = 1600 (21.602 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.28125 0.15625 0.21875 0.03703704 0.2\n", " 0.0625 0.07142857 0.23076923 0.16666667 0.5 0.\n", " 0.4 0. 0. 0.2 0.25 0.5\n", " 0. 0. 0.5 0. 0. 0.\n", " 0. 0.5 0. 0. 0. 0.\n", " 1. 0. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.603 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.28125 0.15625 0.21875 0.03703704 0.2\n", " 0.0625 0.07142857 0.23076923 0.16666667 0.5 0.\n", " 0.4 0. 0. 0.2 0.25 0.5\n", " 0. 0. 0.5 0. 0. 0.\n", " 0. 0.5 0. 0. 0. 0.\n", " 1. 0. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.603 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.66834\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.66834\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.1837324, step = 1700 (21.421 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.1837324, step = 1700 (21.421 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.03125 0.125 0.0625 0.04166667 0.\n", " 0. 0.07692308 0. 0. 0.11111111 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.420 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.03125 0.125 0.0625 0.04166667 0.\n", " 0. 0.07692308 0. 0. 0.11111111 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.420 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54867\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54867\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.17323127, step = 1800 (21.987 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.17323127, step = 1800 (21.987 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.03125 0.125 0.03125 0.04347826 0.05263158\n", " 0.0625 0. 0. 0.2 0.125 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.987 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.03125 0.125 0.03125 0.04347826 0.05263158\n", " 0.0625 0. 0. 0.2 0.125 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.987 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.53012\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.53012\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.15787101, step = 1900 (22.072 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.15787101, step = 1900 (22.072 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.03125 0.15625 0.15625 0.09375 0.07692308 0.09090909\n", " 0.11111111 0. 0. 0. 0.09090909 0.11111111\n", " 0.25 0. 0. 0.14285715 0.14285715 0.16666667\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.072 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.03125 0.15625 0.15625 0.09375 0.07692308 0.09090909\n", " 0.11111111 0. 0. 0. 0.09090909 0.11111111\n", " 0.25 0. 0. 0.14285715 0.14285715 0.16666667\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.072 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57669\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57669\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.15870146, step = 2000 (21.849 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.15870146, step = 2000 (21.849 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.1875 0. 0.0625 0.04545455 0.14285715\n", " 0.07692308 0.08333334 0. 0.1 0.125 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0.5 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.849 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.1875 0. 0.0625 0.04545455 0.14285715\n", " 0.07692308 0.08333334 0. 0.1 0.125 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0.5 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.849 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.60552\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.60552\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.1455093, step = 2100 (21.714 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.1455093, step = 2100 (21.714 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.1875 0.09375 0.21875 0.21875 0.16666667 0.125\n", " 0.15 0.3529412 0.07692308 0.25 0.2857143 0.4\n", " 0.2 0.6 0. 0. 0.25 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.714 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.1875 0.09375 0.21875 0.21875 0.16666667 0.125\n", " 0.15 0.3529412 0.07692308 0.25 0.2857143 0.4\n", " 0.2 0.6 0. 0. 0.25 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.714 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57692\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57692\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.13614386, step = 2200 (21.850 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.13614386, step = 2200 (21.850 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.0625 0.125 0.0625 0.08333334 0.14285715\n", " 0.10526316 0. 0.09090909 0.25 0.125 0.\n", " 0. 0.2 0.33333334 0. 0. 0.\n", " 0. 0. 0. 0.5 0. 0.\n", " 1. 0. 0. 0. 0. 0.\n", " 0. 1. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.850 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.0625 0.125 0.0625 0.08333334 0.14285715\n", " 0.10526316 0. 0.09090909 0.25 0.125 0.\n", " 0. 0.2 0.33333334 0. 0. 0.\n", " 0. 0. 0. 0.5 0. 0.\n", " 1. 0. 0. 0. 0. 0.\n", " 0. 1. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.850 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.63807\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.63807\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.1271522, step = 2300 (21.559 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.1271522, step = 2300 (21.559 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.125 0. 0.03125 0. 0.\n", " 0. 0. 0. 0.11111111 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.559 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.125 0. 0.03125 0. 0.\n", " 0. 0. 0. 0.11111111 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.559 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.63943\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.63943\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.12672609, step = 2400 (21.555 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.12672609, step = 2400 (21.555 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.15625 0.125 0.125 0.08 0.0952381\n", " 0.125 0. 0. 0.22222222 0. 0.\n", " 0. 0. 0.5 0. 0. 0.\n", " 1. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.554 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.15625 0.125 0.125 0.08 0.0952381\n", " 0.125 0. 0. 0.22222222 0. 0.\n", " 0. 0. 0.5 0. 0. 0.\n", " 1. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.554 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.62018\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.62018\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.1166962, step = 2500 (21.644 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.1166962, step = 2500 (21.644 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.0625 0.125 0.25 0.125 0.1\n", " 0.1875 0.21428572 0.4 0.25 0.16666667 0.16666667\n", " 0.4 0. 0. 0.33333334 0.33333334 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.645 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.0625 0.125 0.25 0.125 0.1\n", " 0.1875 0.21428572 0.4 0.25 0.16666667 0.16666667\n", " 0.4 0. 0. 0.33333334 0.33333334 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.645 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.50045\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.50045\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.11488509, step = 2600 (22.220 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.11488509, step = 2600 (22.220 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.21875 0.3125 0.1875 0.09375 0.10344828 0.14285715\n", " 0.18181819 0.375 0.14285715 0. 0.2 0.\n", " 0. 0. 0.5 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.219 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.21875 0.3125 0.1875 0.09375 0.10344828 0.14285715\n", " 0.18181819 0.375 0.14285715 0. 0.2 0.\n", " 0. 0. 0.5 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.219 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.51998\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.51998\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.10554565, step = 2700 (22.124 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.10554565, step = 2700 (22.124 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.03125 0.125 0.0625 0. 0.\n", " 0.21428572 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.33333334 0. 0.\n", " 0. 0. 0. 0.33333334 0. 0.\n", " 0.5 0. 0. 0. 0. 0.\n", " 0. 0. 0.5 0. 0. 0.\n", " 0. 1. 0. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.124 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.03125 0.125 0.0625 0. 0.\n", " 0.21428572 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.33333334 0. 0.\n", " 0. 0. 0. 0.33333334 0. 0.\n", " 0.5 0. 0. 0. 0. 0.\n", " 0. 0. 0.5 0. 0. 0.\n", " 0. 1. 0. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.124 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Saving checkpoints for 2719 into ./rnn_purchase_predictor/model.ckpt.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Saving checkpoints for 2719 into ./rnn_purchase_predictor/model.ckpt.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.53954\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.53954\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.09656328, step = 2800 (22.030 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.09656328, step = 2800 (22.030 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.25 0.125 0.0625 0.03125 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ] (22.030 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.25 0.125 0.0625 0.03125 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ] (22.030 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.48426\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.48426\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.093306735, step = 2900 (22.298 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.093306735, step = 2900 (22.298 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.15625 0.15625 0.09375 0.03846154 0.14285715\n", " 0.0625 0.07692308 0.07692308 0. 0.11111111 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0.33333334 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 1.\n", " 0. 1. 0. 0. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.298 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.15625 0.15625 0.09375 0.03846154 0.14285715\n", " 0.0625 0.07692308 0.07692308 0. 0.11111111 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0.33333334 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 1.\n", " 0. 1. 0. 0. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.298 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.62339\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.62339\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.09007642, step = 3000 (21.629 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.09007642, step = 3000 (21.629 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.03125 0.03125 0.0625 0.04166667 0.05\n", " 0.07142857 0.1 0.11111111 0.125 0. 0.16666667\n", " 0.16666667 0.2 0. 0. 0.2 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.629 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.03125 0.03125 0.0625 0.04166667 0.05\n", " 0.07142857 0.1 0.11111111 0.125 0. 0.16666667\n", " 0.16666667 0.2 0. 0. 0.2 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.629 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.55391\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.55391\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.08475442, step = 3100 (21.959 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.08475442, step = 3100 (21.959 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.125 0.15625 0.1875 0.11538462 0.33333334\n", " 0.05263158 0.25 0.125 0.08333334 0.2 0.\n", " 0. 0.2 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.959 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.125 0.15625 0.1875 0.11538462 0.33333334\n", " 0.05263158 0.25 0.125 0.08333334 0.2 0.\n", " 0. 0.2 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.959 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56205\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56205\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.081762135, step = 3200 (21.921 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.081762135, step = 3200 (21.921 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.03125 0.03125 0.0625 0.12 0.04545455\n", " 0. 0. 0.16666667 0.2 0. 0.2\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 1. 0.\n", " 0. 0. 0. 1. 0. 0.\n", " 0. 1. 1. 0. 0. 0.\n", " 1. 1. 1. 1. 0. 0.\n", " 0. ] (21.921 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.03125 0.03125 0.0625 0.12 0.04545455\n", " 0. 0. 0.16666667 0.2 0. 0.2\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 1. 0.\n", " 0. 0. 0. 1. 0. 0.\n", " 0. 1. 1. 0. 0. 0.\n", " 1. 1. 1. 1. 0. 0.\n", " 0. ] (21.921 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54885\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54885\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.07605326, step = 3300 (21.985 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.07605326, step = 3300 (21.985 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.125 0.0625 0.125 0.11111111 0.1\n", " 0.06666667 0.36363637 0. 0.125 0.125 0.14285715\n", " 0. 0.2 0. 0.5 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.33333334 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.985 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.125 0.0625 0.125 0.11111111 0.1\n", " 0.06666667 0.36363637 0. 0.125 0.125 0.14285715\n", " 0. 0.2 0. 0.5 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.33333334 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.985 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56196\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56196\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.067951776, step = 3400 (21.918 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.067951776, step = 3400 (21.918 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.09375 0.03125 0.09375 0.22727273 0.15789473\n", " 0.0625 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.919 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.09375 0.03125 0.09375 0.22727273 0.15789473\n", " 0.0625 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.919 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.61656\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.61656\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.06891817, step = 3500 (21.661 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.06891817, step = 3500 (21.661 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.0625 0.0625 0.0625 0.04 0.04761905\n", " 0. 0.05882353 0. 0.1 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0.5 0.5 0. 0. 0.\n", " 0. 1. 1. 0. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.662 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.0625 0.0625 0.0625 0.04 0.04761905\n", " 0. 0.05882353 0. 0.1 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0.5 0.5 0. 0. 0.\n", " 0. 1. 1. 0. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.662 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57214\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57214\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.06790454, step = 3600 (21.872 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.06790454, step = 3600 (21.872 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.09375 0.125 0.21875 0.12 0.04545455\n", " 0.05263158 0.06666667 0.09090909 0. 0. 0.\n", " 0. 0.33333334 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.871 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.09375 0.125 0.21875 0.12 0.04545455\n", " 0.05263158 0.06666667 0.09090909 0. 0. 0.\n", " 0. 0.33333334 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.871 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.69515\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.69515\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.06491037, step = 3700 (21.298 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.06491037, step = 3700 (21.298 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.0625 0.125 0.09375 0.04545455 0.\n", " 0.07692308 0.11111111 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.298 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.0625 0.125 0.09375 0.04545455 0.\n", " 0.07692308 0.11111111 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.298 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.55363\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.55363\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.059896108, step = 3800 (21.963 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.059896108, step = 3800 (21.963 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.0625 0.125 0.125 0.03571429 0.17391305\n", " 0.1764706 0.16666667 0.11111111 0.125 0.14285715 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0.33333334 0. 0.33333334 0. 0. 0.\n", " 0. 0. 0. 0. 0. 1.\n", " 0. 1. 0. 0. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.962 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.0625 0.125 0.125 0.03571429 0.17391305\n", " 0.1764706 0.16666667 0.11111111 0.125 0.14285715 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0.33333334 0. 0.33333334 0. 0. 0.\n", " 0. 0. 0. 0. 0. 1.\n", " 0. 1. 0. 0. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.962 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.58294\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.58294\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.059833437, step = 3900 (21.818 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.059833437, step = 3900 (21.818 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0. 0.03125 0.0625 0.0625 0.17391305 0.13333334\n", " 0.18181819 0.3 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.819 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0. 0.03125 0.0625 0.0625 0.17391305 0.13333334\n", " 0.18181819 0.3 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.819 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56877\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56877\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.05671288, step = 4000 (21.887 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.05671288, step = 4000 (21.887 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.125 0.09375 0.0625 0.1 0.07142857\n", " 0.16666667 0.1 0. 0.125 0.25 0.14285715\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.887 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.125 0.09375 0.0625 0.1 0.07142857\n", " 0.16666667 0.1 0. 0.125 0.25 0.14285715\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.887 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.53487\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.53487\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.05050173, step = 4100 (22.052 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.05050173, step = 4100 (22.052 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.125 0.09375 0.15625 0.07142857 0.04\n", " 0.09090909 0.05263158 0.125 0.07142857 0.08333334 0.\n", " 0. 0. 0.16666667 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.053 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.125 0.09375 0.15625 0.07142857 0.04\n", " 0.09090909 0.05263158 0.125 0.07142857 0.08333334 0.\n", " 0. 0. 0.16666667 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.053 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.64304\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.64304\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.050435744, step = 4200 (21.537 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.050435744, step = 4200 (21.537 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.15625 0.21875 0.125 0.14814815 0.15789473\n", " 0.13333334 0.15384616 0.09090909 0. 0. 0.25\n", " 0.33333334 0.6666667 0. 0. 0. 0.33333334\n", " 0.33333334 0. 0. 1. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.536 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.15625 0.21875 0.125 0.14814815 0.15789473\n", " 0.13333334 0.15384616 0.09090909 0. 0. 0.25\n", " 0.33333334 0.6666667 0. 0. 0. 0.33333334\n", " 0.33333334 0. 0. 1. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.536 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.51801\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.51801\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.046726093, step = 4300 (22.133 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.046726093, step = 4300 (22.133 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.0625 0.15625 0.0625 0.12 0.23809524\n", " 0.125 0. 0.07692308 0.18181819 0. 0.33333334\n", " 0.16666667 0. 0. 0. 0. 0.\n", " 0.33333334 0. 0.33333334 0. 0. 0.33333334\n", " 0. 0.5 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.133 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.0625 0.15625 0.0625 0.12 0.23809524\n", " 0.125 0. 0.07692308 0.18181819 0. 0.33333334\n", " 0.16666667 0. 0. 0. 0. 0.\n", " 0.33333334 0. 0.33333334 0. 0. 0.33333334\n", " 0. 0.5 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.133 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54902\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54902\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.04521239, step = 4400 (21.983 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.04521239, step = 4400 (21.983 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.28125 0.125 0.09375 0.10344828 0.08695652\n", " 0.10526316 0.06666667 0.06666667 0.07692308 0.1 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.983 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.28125 0.125 0.09375 0.10344828 0.08695652\n", " 0.10526316 0.06666667 0.06666667 0.07692308 0.1 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.983 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56203\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56203\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.042905793, step = 4500 (21.920 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.042905793, step = 4500 (21.920 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.1875 0. 0.0625 0.16 0.0952381\n", " 0.23529412 0.0625 0. 0.18181819 0.22222222 0.16666667\n", " 0. 0.2 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.919 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.1875 0. 0.0625 0.16 0.0952381\n", " 0.23529412 0.0625 0. 0.18181819 0.22222222 0.16666667\n", " 0. 0.2 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.919 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56225\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56225\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.041337498, step = 4600 (21.919 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.041337498, step = 4600 (21.919 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.09375 0.03125 0.03125 0.11538462 0.04545455\n", " 0.10526316 0.13333334 0.15384616 0.1 0. 0.\n", " 0. 0.16666667 0. 0.2 0. 0.\n", " 0. 1. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.919 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.09375 0.03125 0.03125 0.11538462 0.04545455\n", " 0.10526316 0.13333334 0.15384616 0.1 0. 0.\n", " 0. 0.16666667 0. 0.2 0. 0.\n", " 0. 1. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.919 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.49243\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.49243\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.039956026, step = 4700 (22.260 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.039956026, step = 4700 (22.260 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.125 0.09375 0.125 0.11538462 0.04761905\n", " 0. 0. 0.09090909 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.260 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.125 0.09375 0.125 0.11538462 0.04761905\n", " 0. 0. 0.09090909 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.260 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.52433\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.52433\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.0382339, step = 4800 (22.103 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.0382339, step = 4800 (22.103 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.125 0.03125 0.0625 0.16666667 0.15789473\n", " 0. 0.07692308 0.33333334 0.125 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.102 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.125 0.03125 0.0625 0.16666667 0.15789473\n", " 0. 0.07692308 0.33333334 0.125 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.102 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.62927\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.62927\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.035971675, step = 4900 (21.602 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.035971675, step = 4900 (21.602 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.03125 0.0625 0.15625 0.14814815 0.05\n", " 0.07692308 0.09090909 0. 0.33333334 0. 0.\n", " 0. 0.5 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.603 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.03125 0.0625 0.15625 0.14814815 0.05\n", " 0.07692308 0.09090909 0. 0.33333334 0. 0.\n", " 0. 0.5 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.603 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.51749\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.51749\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.03294082, step = 5000 (22.136 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.03294082, step = 5000 (22.136 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.09375 0.0625 0.03125 0.03846154 0.\n", " 0.11764706 0.08333334 0.18181819 0.1 0. 0.25\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.33333334 0.33333334 0.\n", " 0. 0. 0. 0. 0.5 0.\n", " 0. 0. 0. 0.5 0. 0.\n", " 0. 0.5 0.5 0. 0. 0.\n", " 1. 1. 1. 1. 0. 0.\n", " 0. ] (22.135 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.09375 0.0625 0.03125 0.03846154 0.\n", " 0.11764706 0.08333334 0.18181819 0.1 0. 0.25\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.33333334 0.33333334 0.\n", " 0. 0. 0. 0. 0.5 0.\n", " 0. 0. 0. 0.5 0. 0.\n", " 0. 0.5 0.5 0. 0. 0.\n", " 1. 1. 1. 1. 0. 0.\n", " 0. ] (22.135 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.68483\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.68483\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.03313499, step = 5100 (21.346 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.03313499, step = 5100 (21.346 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.0625 0.125 0.15625 0.07692308 0.1\n", " 0.13333334 0.3 0.11111111 0.11111111 0.125 0.16666667\n", " 0.16666667 0.2 0.5 0. 0. 0.5\n", " 0. 0. 0. 0.5 0.5 0.5\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.346 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.0625 0.125 0.15625 0.07692308 0.1\n", " 0.13333334 0.3 0.11111111 0.11111111 0.125 0.16666667\n", " 0.16666667 0.2 0.5 0. 0. 0.5\n", " 0. 0. 0. 0.5 0.5 0.5\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.346 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.55174\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.55174\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.031098016, step = 5200 (21.969 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.031098016, step = 5200 (21.969 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.125 0.125 0.03125 0.08 0.2173913\n", " 0.1 0.06666667 0.15384616 0.18181819 0.11111111 0.14285715\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.969 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.125 0.125 0.03125 0.08 0.2173913\n", " 0.1 0.06666667 0.15384616 0.18181819 0.11111111 0.14285715\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.969 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54486\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54486\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.031178243, step = 5300 (22.003 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.031178243, step = 5300 (22.003 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.09375 0.09375 0.0625 0. 0. 0. 0.1 0.\n", " 0. 0. 0. 0. 0.5 0.5 0. 0.5 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ] (22.003 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.09375 0.09375 0.0625 0. 0. 0. 0.1 0.\n", " 0. 0. 0. 0. 0.5 0.5 0. 0.5 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ] (22.003 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.59552\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.59552\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.0291475, step = 5400 (21.761 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.0291475, step = 5400 (21.761 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.21875 0.03125 0.09375 0.1875 0.07407407 0.2\n", " 0. 0. 0.11111111 0.11111111 0. 0.16666667\n", " 0.5 0.33333334 0.33333334 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.761 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.21875 0.03125 0.09375 0.1875 0.07407407 0.2\n", " 0. 0. 0.11111111 0.11111111 0. 0.16666667\n", " 0.5 0.33333334 0.33333334 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.761 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Saving checkpoints for 5462 into ./rnn_purchase_predictor/model.ckpt.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Saving checkpoints for 5462 into ./rnn_purchase_predictor/model.ckpt.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.55062\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.55062\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.027625417, step = 5500 (21.975 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.027625417, step = 5500 (21.975 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.28125 0.34375 0.125 0.22727273 0.05263158\n", " 0.125 0. 0.15384616 0.18181819 0.25 0.14285715\n", " 0.14285715 0. 0. 0. 0. 0.6666667\n", " 0. 0. 0.5 0.5 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.976 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.28125 0.34375 0.125 0.22727273 0.05263158\n", " 0.125 0. 0.15384616 0.18181819 0.25 0.14285715\n", " 0.14285715 0. 0. 0. 0. 0.6666667\n", " 0. 0. 0.5 0.5 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.976 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.55742\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.55742\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.026461031, step = 5600 (21.942 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.026461031, step = 5600 (21.942 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.15625 0.09375 0.15625 0.20833333 0.05263158\n", " 0.15384616 0.16666667 0.2 0. 0. 0.\n", " 0.2 0.25 0.33333334 0. 0. 0.\n", " 0.33333334 0.33333334 0. 0.6666667 0.33333334 0.33333334\n", " 0. 0. 0. 1. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.941 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.15625 0.09375 0.15625 0.20833333 0.05263158\n", " 0.15384616 0.16666667 0.2 0. 0. 0.\n", " 0.2 0.25 0.33333334 0. 0. 0.\n", " 0.33333334 0.33333334 0. 0.6666667 0.33333334 0.33333334\n", " 0. 0. 0. 1. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.941 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56377\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56377\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.025271941, step = 5700 (21.914 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.025271941, step = 5700 (21.914 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.125 0.09375 0.0625 0.04 0.1904762\n", " 0.125 0.15384616 0.16666667 0.1 0.14285715 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.914 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.125 0.09375 0.0625 0.04 0.1904762\n", " 0.125 0.15384616 0.16666667 0.1 0.14285715 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.914 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.59337\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.59337\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.02412256, step = 5800 (21.769 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.02412256, step = 5800 (21.769 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.1875 0.25 0.09375 0.13793103 0.1\n", " 0.07142857 0.09090909 0.125 0.125 0. 0.16666667\n", " 0.2 0.4 0. 0.2 0.25 0.\n", " 0.33333334 0.33333334 0.33333334 0.33333334 0.33333334 0.33333334\n", " 0. 0. 0.5 1. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.769 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.1875 0.25 0.09375 0.13793103 0.1\n", " 0.07142857 0.09090909 0.125 0.125 0. 0.16666667\n", " 0.2 0.4 0. 0.2 0.25 0.\n", " 0.33333334 0.33333334 0.33333334 0.33333334 0.33333334 0.33333334\n", " 0. 0. 0.5 1. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.769 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54095\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54095\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.024086088, step = 5900 (22.021 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.024086088, step = 5900 (22.021 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.125 0.0625 0.0625 0. 0.05555556\n", " 0.2857143 0.16666667 0.4 0. 0.2 0.25\n", " 0.5 0.5 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.021 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.125 0.0625 0.0625 0. 0.05555556\n", " 0.2857143 0.16666667 0.4 0. 0.2 0.25\n", " 0.5 0.5 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.021 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.59683\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.59683\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.021972055, step = 6000 (21.755 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.021972055, step = 6000 (21.755 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.21875 0.09375 0.1875 0.09375 0.11111111 0.08\n", " 0.2777778 0.125 0. 0. 0. 0.\n", " 0.16666667 0. 0. 0. 0. 0.5\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 1. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.755 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.21875 0.09375 0.1875 0.09375 0.11111111 0.08\n", " 0.2777778 0.125 0. 0. 0. 0.\n", " 0.16666667 0. 0. 0. 0. 0.5\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 1. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.755 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.6152\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.6152\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.02167849, step = 6100 (21.668 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.02167849, step = 6100 (21.668 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.125 0.15625 0.0625 0.08695652 0.05263158\n", " 0.23076923 0.25 0. 0.2 0.5 0.5\n", " 0. 0.4 0. 0. 0. 0.\n", " 0. 0. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.668 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.125 0.15625 0.0625 0.08695652 0.05263158\n", " 0.23076923 0.25 0. 0.2 0.5 0.5\n", " 0. 0.4 0. 0. 0. 0.\n", " 0. 0. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.668 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.46423\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.46423\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.02127928, step = 6200 (22.401 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.02127928, step = 6200 (22.401 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.25 0.125 0.125 0.08333334 0.0625\n", " 0.27272728 0.2 0. 0.16666667 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.401 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.09375 0.25 0.125 0.125 0.08333334 0.0625\n", " 0.27272728 0.2 0. 0.16666667 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.401 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.53349\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.53349\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.019440543, step = 6300 (22.059 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.019440543, step = 6300 (22.059 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.21875 0.125 0.125 0. 0.1\n", " 0.21428572 0.3 0. 0.11111111 0.375 0.\n", " 0. 0.2 0. 0. 0.2 0.4\n", " 0.2 0.6666667 0.33333334 0. 0.5 0.\n", " 0. 0. 0. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.059 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.21875 0.125 0.125 0. 0.1\n", " 0.21428572 0.3 0. 0.11111111 0.375 0.\n", " 0. 0.2 0. 0. 0.2 0.4\n", " 0.2 0.6666667 0.33333334 0. 0.5 0.\n", " 0. 0. 0. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.059 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54839\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54839\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.018077549, step = 6400 (21.984 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.018077549, step = 6400 (21.984 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.15625 0.03125 0.09375 0. 0.04761905\n", " 0. 0. 0. 0. 0.125 0.125\n", " 0. 0. 0.14285715 0.14285715 0.4 0.2\n", " 0.2 0.2 0.25 0.25 0.25 0.\n", " 0.33333334 0.33333334 0.33333334 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.984 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.15625 0.03125 0.09375 0. 0.04761905\n", " 0. 0. 0. 0. 0.125 0.125\n", " 0. 0. 0.14285715 0.14285715 0.4 0.2\n", " 0.2 0.2 0.25 0.25 0.25 0.\n", " 0.33333334 0.33333334 0.33333334 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.984 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.59754\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.59754\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.017525611, step = 6500 (21.753 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.017525611, step = 6500 (21.753 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.15625 0.15625 0.09375 0.125 0.0625\n", " 0.06666667 0.21428572 0. 0.1 0.11111111 0.14285715\n", " 0. 0. 0. 0.16666667 0. 0.\n", " 0. 0. 0.33333334 0.33333334 0.33333334 0.\n", " 0.33333334 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.753 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.15625 0.15625 0.09375 0.125 0.0625\n", " 0.06666667 0.21428572 0. 0.1 0.11111111 0.14285715\n", " 0. 0. 0. 0.16666667 0. 0.\n", " 0. 0. 0.33333334 0.33333334 0.33333334 0.\n", " 0.33333334 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.753 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.63575\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.63575\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.01760184, step = 6600 (21.569 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.01760184, step = 6600 (21.569 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.09375 0.15625 0.21875 0.04 0.1904762\n", " 0.16666667 0.13333334 0.15384616 0.2 0.14285715 0.4\n", " 0. 1. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.570 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.09375 0.15625 0.21875 0.04 0.1904762\n", " 0.16666667 0.13333334 0.15384616 0.2 0.14285715 0.4\n", " 0. 1. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.570 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.5784\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.5784\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.01708032, step = 6700 (21.843 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.01708032, step = 6700 (21.843 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.28125 0.15625 0.21875 0.09090909 0.25\n", " 0.3 0.33333334 0.16666667 0.16666667 0.33333334 0.16666667\n", " 0. 0.25 1. 0.5 0. 0.\n", " 0. 0. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.843 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.28125 0.15625 0.21875 0.09090909 0.25\n", " 0.3 0.33333334 0.16666667 0.16666667 0.33333334 0.16666667\n", " 0. 0.25 1. 0.5 0. 0.\n", " 0. 0. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.843 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57562\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.57562\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.016406652, step = 6800 (21.855 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.016406652, step = 6800 (21.855 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.125 0.03125 0.125 0.15 0.07142857\n", " 0.16666667 0.08333334 0.125 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.854 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.125 0.03125 0.125 0.15 0.07142857\n", " 0.16666667 0.08333334 0.125 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.854 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.60262\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.60262\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.015160312, step = 6900 (21.726 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.015160312, step = 6900 (21.726 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.28125 0.15625 0.15625 0.1875 0.11538462 0.125\n", " 0.23529412 0.0625 0.26666668 0.3 0.125 0.\n", " 0. 0. 0. 0.33333334 0.5 0.5\n", " 0.5 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.726 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.28125 0.15625 0.15625 0.1875 0.11538462 0.125\n", " 0.23529412 0.0625 0.26666668 0.3 0.125 0.\n", " 0. 0. 0. 0.33333334 0.5 0.5\n", " 0.5 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.726 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.47123\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.47123\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.014798359, step = 7000 (22.365 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.014798359, step = 7000 (22.365 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.1875 0.25 0.15625 0.1875 0.04 0.16666667\n", " 0.2 0.18181819 0.2 0.125 0.25 0.\n", " 0.25 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.365 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.1875 0.25 0.15625 0.1875 0.04 0.16666667\n", " 0.2 0.18181819 0.2 0.125 0.25 0.\n", " 0.25 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.365 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.58944\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.58944\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.014052469, step = 7100 (21.789 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.014052469, step = 7100 (21.789 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.1875 0.0625 0.125 0.08333334 0.15789473\n", " 0.0625 0.15384616 0.2 0.25 0. 0.\n", " 0. 0.2 0.2 0. 0. 0.\n", " 0. 0. 1. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.789 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.1875 0.0625 0.125 0.08333334 0.15789473\n", " 0.0625 0.15384616 0.2 0.25 0. 0.\n", " 0. 0.2 0.2 0. 0. 0.\n", " 0. 0. 1. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.789 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.51604\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.51604\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.01366843, step = 7200 (22.143 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.01366843, step = 7200 (22.143 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.15625 0.15625 0.21875 0.23076923 0.05555556\n", " 0. 0.14285715 0.14285715 0.42857143 0.25 0.25\n", " 0.25 0. 0. 0. 0. 0.\n", " 1. 0. 1. 0. 0. 1.\n", " 0. 1. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.143 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.15625 0.15625 0.21875 0.23076923 0.05555556\n", " 0. 0.14285715 0.14285715 0.42857143 0.25 0.25\n", " 0.25 0. 0. 0. 0. 0.\n", " 1. 0. 1. 0. 0. 1.\n", " 0. 1. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.143 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.67114\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.67114\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.01261655, step = 7300 (21.408 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.01261655, step = 7300 (21.408 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.09375 0.0625 0.25 0.24 0.15\n", " 0.08333334 0.25 0.16666667 0.11111111 0.125 0.\n", " 0. 0.2857143 0.33333334 0.2 0. 0.\n", " 0. 0. 0.33333334 0.33333334 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.408 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.125 0.09375 0.0625 0.25 0.24 0.15\n", " 0.08333334 0.25 0.16666667 0.11111111 0.125 0.\n", " 0. 0.2857143 0.33333334 0.2 0. 0.\n", " 0. 0. 0.33333334 0.33333334 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.408 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.62129\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.62129\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.012630177, step = 7400 (21.642 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.012630177, step = 7400 (21.642 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.125 0.09375 0.21875 0.13043478 0.11111111\n", " 0.07142857 0.08333334 0. 0. 0. 0.33333334\n", " 0. 0. 0.5 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.642 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.125 0.09375 0.21875 0.13043478 0.11111111\n", " 0.07142857 0.08333334 0. 0. 0. 0.33333334\n", " 0. 0. 0.5 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.642 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.64241\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.64241\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.011950979, step = 7500 (21.538 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.011950979, step = 7500 (21.538 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.1875 0.15625 0.21875 0.23076923 0.3125\n", " 0.16666667 0.625 0.4 0.25 0.25 0.5\n", " 0.33333334 0.33333334 0.33333334 0. 0.5 0.\n", " 0.5 0.5 0.5 0.5 0. 0.5\n", " 0. 1. 0. 0. 0. 0.\n", " 0. 0. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 1. 0. 0. 0.\n", " 0. ] (21.538 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.1875 0.15625 0.21875 0.23076923 0.3125\n", " 0.16666667 0.625 0.4 0.25 0.25 0.5\n", " 0.33333334 0.33333334 0.33333334 0. 0.5 0.\n", " 0.5 0.5 0.5 0.5 0. 0.5\n", " 0. 1. 0. 0. 0. 0.\n", " 0. 0. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 1. 0. 0. 0.\n", " 0. ] (21.538 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.53883\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.53883\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.011776161, step = 7600 (22.032 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.011776161, step = 7600 (22.032 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.25 0.09375 0.1875 0.16 0.14285715\n", " 0. 0. 0. 0. 0.33333334 0.\n", " 0.33333334 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.032 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.25 0.09375 0.1875 0.16 0.14285715\n", " 0. 0. 0. 0. 0.33333334 0.\n", " 0.33333334 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.032 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.47166\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.47166\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.010360282, step = 7700 (22.363 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.010360282, step = 7700 (22.363 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.1875 0.21875 0.1875 0.1875 0.13793103 0.2\n", " 0.13636364 0.05 0.23529412 0.05882353 0.33333334 0.11111111\n", " 0.25 0.33333334 0.16666667 0.4 0.25 0.5\n", " 0.25 0. 0.33333334 0.33333334 0.33333334 0.5\n", " 0. 0. 0.5 0. 0. 1.\n", " 1. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.363 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.1875 0.21875 0.1875 0.1875 0.13793103 0.2\n", " 0.13636364 0.05 0.23529412 0.05882353 0.33333334 0.11111111\n", " 0.25 0.33333334 0.16666667 0.4 0.25 0.5\n", " 0.25 0. 0.33333334 0.33333334 0.33333334 0.5\n", " 0. 0. 0.5 0. 0. 1.\n", " 1. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.363 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56296\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.56296\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.010813688, step = 7800 (21.915 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.010813688, step = 7800 (21.915 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.21875 0.1875 0.125 0.125 0.13636364 0.11764706\n", " 0.13333334 0.13333334 0.125 0. 0. 0.\n", " 0. 0. 1. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.915 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.21875 0.1875 0.125 0.125 0.13636364 0.11764706\n", " 0.13333334 0.13333334 0.125 0. 0. 0.\n", " 0. 0. 1. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.915 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.64711\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.64711\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.009761978, step = 7900 (21.519 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.009761978, step = 7900 (21.519 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.15625 0.34375 0.21875 0.14285715 0.2631579\n", " 0.33333334 0.2777778 0.23529412 0.14285715 0.41666666 0.\n", " 0.25 0.14285715 0.2 0.33333334 0. 0.\n", " 0. 0. 0. 0. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.519 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.0625 0.15625 0.34375 0.21875 0.14285715 0.2631579\n", " 0.33333334 0.2777778 0.23529412 0.14285715 0.41666666 0.\n", " 0.25 0.14285715 0.2 0.33333334 0. 0.\n", " 0. 0. 0. 0. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.519 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.61224\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.61224\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.009604121, step = 8000 (21.681 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.009604121, step = 8000 (21.681 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.1875 0.3125 0.3125 0.125 0.32 0.18181819\n", " 0.46153846 0.25 0.3 0.125 0.5 0.2\n", " 0.2 0.2 0.5 0.33333334 0. 0.\n", " 0. 0.5 0. 0.5 1. 0.\n", " 0.5 0.5 0. 0.5 0. 0.\n", " 0. 0. 1. 0. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.682 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.1875 0.3125 0.3125 0.125 0.32 0.18181819\n", " 0.46153846 0.25 0.3 0.125 0.5 0.2\n", " 0.2 0.2 0.5 0.33333334 0. 0.\n", " 0. 0.5 0. 0.5 1. 0.\n", " 0.5 0.5 0. 0.5 0. 0.\n", " 0. 0. 1. 0. 1. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.682 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.41228\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.41228\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.009565782, step = 8100 (22.664 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.009565782, step = 8100 (22.664 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.1875 0.3125 0.15625 0.13043478 0.16666667\n", " 0.06666667 0.27272728 0.14285715 0.25 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 1. 1. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.663 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.15625 0.1875 0.3125 0.15625 0.13043478 0.16666667\n", " 0.06666667 0.27272728 0.14285715 0.25 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 1. 1. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.663 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Saving checkpoints for 8200 into ./rnn_purchase_predictor/model.ckpt.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Saving checkpoints for 8200 into ./rnn_purchase_predictor/model.ckpt.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.48088\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.48088\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.008838883, step = 8200 (22.317 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.008838883, step = 8200 (22.317 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.03125 0.125 0.15625 0.15625 0.22222222 0.16666667\n", " 0.1904762 0.1875 0.4 0.21428572 0.1 0.\n", " 0.14285715 0. 0.5 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.318 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.03125 0.125 0.15625 0.15625 0.22222222 0.16666667\n", " 0.1904762 0.1875 0.4 0.21428572 0.1 0.\n", " 0.14285715 0. 0.5 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (22.318 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54935\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:global_step/sec: 4.54935\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.008825085, step = 8300 (21.981 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:loss = 0.008825085, step = 8300 (21.981 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.28125 0.34375 0.25 0.28125 0.14285715 0.11764706\n", " 0.35714287 0.1 0. 0. 0. 0.\n", " 0. 0. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.981 sec)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.28125 0.34375 0.25 0.28125 0.14285715 0.11764706\n", " 0.35714287 0.1 0. 0. 0. 0.\n", " 0. 0. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (21.981 sec)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Saving checkpoints for 8400 into ./rnn_purchase_predictor/model.ckpt.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Saving checkpoints for 8400 into ./rnn_purchase_predictor/model.ckpt.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Loss for final step: 0.007885598.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Loss for final step: 0.007885598.\n" ] } ], "source": [ "def _local_train_input_fn(training_dir, hyperparameters):\n", "\n", " return _local_input_fn(X_train_df,Y_train_df,SL_train_df, None, True, hyperparameters)\n", "\n", "def _local_eval_input_fn(training_dir, hyperparameters):\n", " \n", " return _local_input_fn(X_val_df,Y_val_df,SL_val_df, 1, False, hyperparameters)\n", "\n", "def _local_input_fn(x,y,sl, epochs, do_shuffle, hyperparameters):\n", "\n", " X = x.as_matrix().reshape(-1,hyperparameters[\"MAX_TIMESTEP\"], hyperparameters[\"INPUT_SIZE\"])\n", " Y = y.as_matrix().reshape(-1,hyperparameters[\"MAX_TIMESTEP\"], hyperparameters[\"INPUT_SIZE\"])\n", " SL = sl.as_matrix().reshape(X.shape[0],)\n", " \n", " return tf.estimator.inputs.numpy_input_fn(\n", " x = {INPUT_TENSOR_NAME: X, SL_TENSOR_NAME: SL},\n", " y = Y,\n", " batch_size = hyperparameters[\"BATCH_SIZE\"],\n", " num_epochs=epochs,\n", " shuffle=do_shuffle)()\n", "\n", "def _local_model_fn_wrapper(features, labels, mode, params):\n", " return model_fn(features, labels, mode, params)\n", "\n", "def train_local(hyperparameters):\n", " \n", " custom_estimator = tf.estimator.Estimator(model_fn=_local_model_fn_wrapper,\n", " params=hyperparameters,\n", " model_dir=SAVE_PATH)\n", " \n", " # Load datasets\n", " loss = custom_estimator.train(input_fn=lambda: _local_train_input_fn(training_dir, hyperparameters), \\\n", " steps=training_steps)\n", " \n", " return custom_estimator\n", "\n", "tf.reset_default_graph() \n", "\n", "hyperparameters = {\n", "\"MAX_TIMESTEP\" : TIME_STEPS,\n", "\"INPUT_SIZE\" : INPUT_SIZE,\n", "\"OUTPUT_SIZE\" : OUTPUT_SIZE,\n", "\"BATCH_SIZE\" : BATCH_SIZE,\n", "\"LSTM_UNITS\" : LSTM_UNITS,\n", "\"MAX_EPOCHS\" : EPOCHS,\n", "\"POSITIVE_THRESHOLD\" : POSITIVE_THRESHOLD,\n", "\"LEARNING_RATE\" : LEARNING_RATE,\n", "\"DROPOUT_RNN_STATE_KEEP_PROB\" : DROPOUT_RNN_STATE_KEEP_PROB,\n", "\"DROPOUT_RNN_INPUT_KEEP_PROB\" : DROPOUT_RNN_INPUT_KEEP_PROB,\n", "\"TOP_PROD_BY_QTYBOUGHT\" : TOP_PROD_BY_QTYBOUGHT,\n", "\"TOP_PROD_BY_TIMESBOUGHT\" : TOP_PROD_BY_TIMESBOUGHT,\n", "\"K_PREDICTIONS\" : K_PREDICTIONS,\n", "\"L2_REG_DENSE\" : L2_REG_DENSE}\n", "\n", "local_estimator= train_local(hyperparameters) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The model created from local training can be evaluated (for accuracy) as demonstrated below:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Calling model_fn.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/ec2-user/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/ipykernel/__main__.py:11: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", "/home/ec2-user/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/ipykernel/__main__.py:12: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", "/home/ec2-user/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/ipykernel/__main__.py:13: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", "INFO:tensorflow:Calling model_fn.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Done calling model_fn.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Done calling model_fn.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Starting evaluation at 2019-02-10-22:53:55\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Starting evaluation at 2019-02-10-22:53:55\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Graph was finalized.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Graph was finalized.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from ./rnn_purchase_predictor/model.ckpt-8400\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from ./rnn_purchase_predictor/model.ckpt-8400\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Running local_init_op.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Running local_init_op.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Done running local_init_op.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Done running local_init_op.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [1/7]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [1/7]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.21875 0.125 0.25 0.125 0.2962963 0.22727273\n", " 0.4375 0.25 0.2 0.375 0.33333334 0.33333334\n", " 0.6666667 0.75 1. 0.33333334 0.33333334 0.\n", " 0. 1. 1. 1. 0. 0.\n", " 1. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ], sc = [32 32 32 32 27 22 16 12 10 8 6 6 6 4 3 3 3 3 1 1 1 1 1 1\n", " 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:accuracy = [0.21875 0.125 0.25 0.125 0.2962963 0.22727273\n", " 0.4375 0.25 0.2 0.375 0.33333334 0.33333334\n", " 0.6666667 0.75 1. 0.33333334 0.33333334 0.\n", " 0. 1. 1. 1. 0. 0.\n", " 1. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ], sc = [32 32 32 32 27 22 16 12 10 8 6 6 6 4 3 3 3 3 1 1 1 1 1 1\n", " 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [2/7]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [2/7]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [3/7]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [3/7]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [4/7]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [4/7]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [5/7]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [5/7]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [6/7]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [6/7]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [7/7]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Evaluation [7/7]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Finished evaluation at 2019-02-10-22:53:59\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Finished evaluation at 2019-02-10-22:53:59\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Saving dict for global step 8400: acc0 = 0.1771978, acc1 = 0.19951923, acc10 = 0.22437645, acc11 = 0.18951763, acc12 = 0.24876316, acc13 = 0.36277056, acc14 = 0.31190476, acc15 = 0.10714286, acc16 = 0.11904763, acc17 = 0.051587302, acc18 = 0.11904763, acc19 = 0.26587301, acc2 = 0.18578298, acc20 = 0.2585034, acc21 = 0.21428572, acc22 = 0.21428572, acc23 = 0.21428572, acc24 = 0.30952382, acc25 = 0.04761905, acc26 = 0.14285715, acc27 = 0.2857143, acc28 = 0.071428575, acc29 = 0.14285715, acc3 = 0.17239012, acc30 = 0.0, acc31 = 0.0, acc32 = 0.14285715, acc33 = 0.0, acc34 = 0.0, acc35 = 0.14285715, acc36 = 0.0, acc37 = 0.0, acc38 = 0.0, acc39 = 0.0, acc4 = 0.14890604, acc40 = 0.0, acc41 = 0.0, acc42 = 0.0, acc43 = 0.14285715, acc44 = 0.0, acc45 = 0.0, acc46 = 0.14285715, acc47 = 0.0, acc48 = 0.0, acc5 = 0.16235891, acc6 = 0.2114243, acc7 = 0.16264391, acc8 = 0.18442748, acc9 = 0.22232492, acc_by_tb0 = 0.10817308, acc_by_tb1 = 0.09100275, acc_by_tb10 = 0.060884356, acc_by_tb11 = 0.09319728, acc_by_tb12 = 0.052380953, acc_by_tb13 = 0.035714287, acc_by_tb14 = 0.20238097, acc_by_tb15 = 0.061904762, acc_by_tb16 = 0.17857143, acc_by_tb17 = 0.12301587, acc_by_tb18 = 0.10714286, acc_by_tb19 = 0.15476191, acc_by_tb2 = 0.11916209, acc_by_tb20 = 0.11904763, acc_by_tb21 = 0.11904763, acc_by_tb22 = 0.16666667, acc_by_tb23 = 0.04761905, acc_by_tb24 = 0.14285715, acc_by_tb25 = 0.0, acc_by_tb26 = 0.0, acc_by_tb27 = 0.0, acc_by_tb28 = 0.071428575, acc_by_tb29 = 0.0, acc_by_tb3 = 0.08928572, acc_by_tb30 = 0.071428575, acc_by_tb31 = 0.071428575, acc_by_tb32 = 0.0, acc_by_tb33 = 0.0, acc_by_tb34 = 0.0, acc_by_tb35 = 0.0, acc_by_tb36 = 0.0, acc_by_tb37 = 0.0, acc_by_tb38 = 0.0, acc_by_tb39 = 0.0, acc_by_tb4 = 0.08103873, acc_by_tb40 = 0.0, acc_by_tb41 = 0.0, acc_by_tb42 = 0.0, acc_by_tb43 = 0.0, acc_by_tb44 = 0.0, acc_by_tb45 = 0.0, acc_by_tb46 = 0.0, acc_by_tb47 = 0.0, acc_by_tb48 = 0.0, acc_by_tb5 = 0.10851859, acc_by_tb6 = 0.098015785, acc_by_tb7 = 0.09164051, acc_by_tb8 = 0.12592408, acc_by_tb9 = 0.057142857, acc_by_tq0 = 0.026785715, acc_by_tq1 = 0.03331044, acc_by_tq10 = 0.0, acc_by_tq11 = 0.04761905, acc_by_tq12 = 0.044217687, acc_by_tq13 = 0.028571429, acc_by_tq14 = 0.083333336, acc_by_tq15 = 0.0, acc_by_tq16 = 0.051587302, acc_by_tq17 = 0.035714287, acc_by_tq18 = 0.0, acc_by_tq19 = 0.0, acc_by_tq2 = 0.047733516, acc_by_tq20 = 0.0, acc_by_tq21 = 0.0, acc_by_tq22 = 0.0, acc_by_tq23 = 0.14285715, acc_by_tq24 = 0.071428575, acc_by_tq25 = 0.04761905, acc_by_tq26 = 0.0, acc_by_tq27 = 0.0, acc_by_tq28 = 0.0, acc_by_tq29 = 0.0, acc_by_tq3 = 0.013392857, acc_by_tq30 = 0.0, acc_by_tq31 = 0.0, acc_by_tq32 = 0.0, acc_by_tq33 = 0.0, acc_by_tq34 = 0.0, acc_by_tq35 = 0.0, acc_by_tq36 = 0.0, acc_by_tq37 = 0.0, acc_by_tq38 = 0.0, acc_by_tq39 = 0.0, acc_by_tq4 = 0.040054947, acc_by_tq40 = 0.0, acc_by_tq41 = 0.0, acc_by_tq42 = 0.0, acc_by_tq43 = 0.0, acc_by_tq44 = 0.0, acc_by_tq45 = 0.0, acc_by_tq46 = 0.0, acc_by_tq47 = 0.0, acc_by_tq48 = 0.0, acc_by_tq5 = 0.030285448, acc_by_tq6 = 0.01845238, acc_by_tq7 = 0.020833334, acc_by_tq8 = 0.03809524, acc_by_tq9 = 0.010989011, global_step = 8400, loss = 0.015102133, sc0 = 31.142857, sc1 = 31.142857, sc10 = 8.428572, sc11 = 7.142857, sc12 = 7.0, sc13 = 6.285714, sc14 = 5.142857, sc15 = 4.857143, sc16 = 4.285714, sc17 = 4.142857, sc18 = 3.7142856, sc19 = 3.7142856, sc2 = 31.142857, sc20 = 3.142857, sc21 = 2.857143, sc22 = 2.857143, sc23 = 2.7142856, sc24 = 2.142857, sc25 = 1.5714285, sc26 = 1.4285715, sc27 = 1.1428572, sc28 = 1.0, sc29 = 0.85714287, sc3 = 31.142857, sc30 = 0.71428573, sc31 = 0.71428573, sc32 = 0.5714286, sc33 = 0.5714286, sc34 = 0.42857143, sc35 = 0.42857143, sc36 = 0.42857143, sc37 = 0.42857143, sc38 = 0.2857143, sc39 = 0.2857143, sc4 = 24.714285, sc40 = 0.2857143, sc41 = 0.2857143, sc42 = 0.2857143, sc43 = 0.2857143, sc44 = 0.2857143, sc45 = 0.2857143, sc46 = 0.2857143, sc47 = 0.14285715, sc48 = 0.14285715, sc5 = 19.857143, sc6 = 16.0, sc7 = 14.428572, sc8 = 11.857142, sc9 = 10.428572\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Saving dict for global step 8400: acc0 = 0.1771978, acc1 = 0.19951923, acc10 = 0.22437645, acc11 = 0.18951763, acc12 = 0.24876316, acc13 = 0.36277056, acc14 = 0.31190476, acc15 = 0.10714286, acc16 = 0.11904763, acc17 = 0.051587302, acc18 = 0.11904763, acc19 = 0.26587301, acc2 = 0.18578298, acc20 = 0.2585034, acc21 = 0.21428572, acc22 = 0.21428572, acc23 = 0.21428572, acc24 = 0.30952382, acc25 = 0.04761905, acc26 = 0.14285715, acc27 = 0.2857143, acc28 = 0.071428575, acc29 = 0.14285715, acc3 = 0.17239012, acc30 = 0.0, acc31 = 0.0, acc32 = 0.14285715, acc33 = 0.0, acc34 = 0.0, acc35 = 0.14285715, acc36 = 0.0, acc37 = 0.0, acc38 = 0.0, acc39 = 0.0, acc4 = 0.14890604, acc40 = 0.0, acc41 = 0.0, acc42 = 0.0, acc43 = 0.14285715, acc44 = 0.0, acc45 = 0.0, acc46 = 0.14285715, acc47 = 0.0, acc48 = 0.0, acc5 = 0.16235891, acc6 = 0.2114243, acc7 = 0.16264391, acc8 = 0.18442748, acc9 = 0.22232492, acc_by_tb0 = 0.10817308, acc_by_tb1 = 0.09100275, acc_by_tb10 = 0.060884356, acc_by_tb11 = 0.09319728, acc_by_tb12 = 0.052380953, acc_by_tb13 = 0.035714287, acc_by_tb14 = 0.20238097, acc_by_tb15 = 0.061904762, acc_by_tb16 = 0.17857143, acc_by_tb17 = 0.12301587, acc_by_tb18 = 0.10714286, acc_by_tb19 = 0.15476191, acc_by_tb2 = 0.11916209, acc_by_tb20 = 0.11904763, acc_by_tb21 = 0.11904763, acc_by_tb22 = 0.16666667, acc_by_tb23 = 0.04761905, acc_by_tb24 = 0.14285715, acc_by_tb25 = 0.0, acc_by_tb26 = 0.0, acc_by_tb27 = 0.0, acc_by_tb28 = 0.071428575, acc_by_tb29 = 0.0, acc_by_tb3 = 0.08928572, acc_by_tb30 = 0.071428575, acc_by_tb31 = 0.071428575, acc_by_tb32 = 0.0, acc_by_tb33 = 0.0, acc_by_tb34 = 0.0, acc_by_tb35 = 0.0, acc_by_tb36 = 0.0, acc_by_tb37 = 0.0, acc_by_tb38 = 0.0, acc_by_tb39 = 0.0, acc_by_tb4 = 0.08103873, acc_by_tb40 = 0.0, acc_by_tb41 = 0.0, acc_by_tb42 = 0.0, acc_by_tb43 = 0.0, acc_by_tb44 = 0.0, acc_by_tb45 = 0.0, acc_by_tb46 = 0.0, acc_by_tb47 = 0.0, acc_by_tb48 = 0.0, acc_by_tb5 = 0.10851859, acc_by_tb6 = 0.098015785, acc_by_tb7 = 0.09164051, acc_by_tb8 = 0.12592408, acc_by_tb9 = 0.057142857, acc_by_tq0 = 0.026785715, acc_by_tq1 = 0.03331044, acc_by_tq10 = 0.0, acc_by_tq11 = 0.04761905, acc_by_tq12 = 0.044217687, acc_by_tq13 = 0.028571429, acc_by_tq14 = 0.083333336, acc_by_tq15 = 0.0, acc_by_tq16 = 0.051587302, acc_by_tq17 = 0.035714287, acc_by_tq18 = 0.0, acc_by_tq19 = 0.0, acc_by_tq2 = 0.047733516, acc_by_tq20 = 0.0, acc_by_tq21 = 0.0, acc_by_tq22 = 0.0, acc_by_tq23 = 0.14285715, acc_by_tq24 = 0.071428575, acc_by_tq25 = 0.04761905, acc_by_tq26 = 0.0, acc_by_tq27 = 0.0, acc_by_tq28 = 0.0, acc_by_tq29 = 0.0, acc_by_tq3 = 0.013392857, acc_by_tq30 = 0.0, acc_by_tq31 = 0.0, acc_by_tq32 = 0.0, acc_by_tq33 = 0.0, acc_by_tq34 = 0.0, acc_by_tq35 = 0.0, acc_by_tq36 = 0.0, acc_by_tq37 = 0.0, acc_by_tq38 = 0.0, acc_by_tq39 = 0.0, acc_by_tq4 = 0.040054947, acc_by_tq40 = 0.0, acc_by_tq41 = 0.0, acc_by_tq42 = 0.0, acc_by_tq43 = 0.0, acc_by_tq44 = 0.0, acc_by_tq45 = 0.0, acc_by_tq46 = 0.0, acc_by_tq47 = 0.0, acc_by_tq48 = 0.0, acc_by_tq5 = 0.030285448, acc_by_tq6 = 0.01845238, acc_by_tq7 = 0.020833334, acc_by_tq8 = 0.03809524, acc_by_tq9 = 0.010989011, global_step = 8400, loss = 0.015102133, sc0 = 31.142857, sc1 = 31.142857, sc10 = 8.428572, sc11 = 7.142857, sc12 = 7.0, sc13 = 6.285714, sc14 = 5.142857, sc15 = 4.857143, sc16 = 4.285714, sc17 = 4.142857, sc18 = 3.7142856, sc19 = 3.7142856, sc2 = 31.142857, sc20 = 3.142857, sc21 = 2.857143, sc22 = 2.857143, sc23 = 2.7142856, sc24 = 2.142857, sc25 = 1.5714285, sc26 = 1.4285715, sc27 = 1.1428572, sc28 = 1.0, sc29 = 0.85714287, sc3 = 31.142857, sc30 = 0.71428573, sc31 = 0.71428573, sc32 = 0.5714286, sc33 = 0.5714286, sc34 = 0.42857143, sc35 = 0.42857143, sc36 = 0.42857143, sc37 = 0.42857143, sc38 = 0.2857143, sc39 = 0.2857143, sc4 = 24.714285, sc40 = 0.2857143, sc41 = 0.2857143, sc42 = 0.2857143, sc43 = 0.2857143, sc44 = 0.2857143, sc45 = 0.2857143, sc46 = 0.2857143, sc47 = 0.14285715, sc48 = 0.14285715, sc5 = 19.857143, sc6 = 16.0, sc7 = 14.428572, sc8 = 11.857142, sc9 = 10.428572\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 8400: ./rnn_purchase_predictor/model.ckpt-8400\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 8400: ./rnn_purchase_predictor/model.ckpt-8400\n" ] } ], "source": [ "hyperparameters[\"DROPOUT_RNN_STATE_KEEP_PROB\"]=1\n", "hyperparameters[\"DROPOUT_RNN_INPUT_KEEP_PROB\"]=1\n", "hyperparameters[\"L2_REG_DENSE\"] = 0\n", "\n", "metrics = local_estimator.evaluate(input_fn=lambda: _local_eval_input_fn(training_dir, hyperparameters),steps=evaluation_steps)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can plot the results and compare the accuracy of our model against the predictive accuracy of a naive strategy that performs predictions via the most popular product by quantity bought and frequency. These are the products that were identified in the first notebook." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
accscacc_by_tqacc_by_tb
00.17719831.1428570.0267860.108173
10.19951931.1428570.0333100.091003
20.18578331.1428570.0477340.119162
30.17239031.1428570.0133930.089286
40.14890624.7142850.0400550.081039
50.16235919.8571430.0302850.108519
60.21142416.0000000.0184520.098016
70.16264414.4285720.0208330.091641
80.18442711.8571420.0380950.125924
90.22232510.4285720.0109890.057143
100.2243768.4285720.0000000.060884
110.1895187.1428570.0476190.093197
120.2487637.0000000.0442180.052381
130.3627716.2857140.0285710.035714
140.3119055.1428570.0833330.202381
150.1071434.8571430.0000000.061905
160.1190484.2857140.0515870.178571
170.0515874.1428570.0357140.123016
180.1190483.7142860.0000000.107143
190.2658733.7142860.0000000.154762
200.2585033.1428570.0000000.119048
210.2142862.8571430.0000000.119048
220.2142862.8571430.0000000.166667
230.2142862.7142860.1428570.047619
240.3095242.1428570.0714290.142857
250.0476191.5714290.0476190.000000
260.1428571.4285710.0000000.000000
270.2857141.1428570.0000000.000000
280.0714291.0000000.0000000.071429
290.1428570.8571430.0000000.000000
300.0000000.7142860.0000000.071429
310.0000000.7142860.0000000.071429
320.1428570.5714290.0000000.000000
330.0000000.5714290.0000000.000000
340.0000000.4285710.0000000.000000
350.1428570.4285710.0000000.000000
360.0000000.4285710.0000000.000000
370.0000000.4285710.0000000.000000
380.0000000.2857140.0000000.000000
390.0000000.2857140.0000000.000000
400.0000000.2857140.0000000.000000
410.0000000.2857140.0000000.000000
420.0000000.2857140.0000000.000000
430.1428570.2857140.0000000.000000
440.0000000.2857140.0000000.000000
450.0000000.2857140.0000000.000000
460.1428570.2857140.0000000.000000
470.0000000.1428570.0000000.000000
480.0000000.1428570.0000000.000000
\n", "
" ], "text/plain": [ " acc sc acc_by_tq acc_by_tb\n", "0 0.177198 31.142857 0.026786 0.108173\n", "1 0.199519 31.142857 0.033310 0.091003\n", "2 0.185783 31.142857 0.047734 0.119162\n", "3 0.172390 31.142857 0.013393 0.089286\n", "4 0.148906 24.714285 0.040055 0.081039\n", "5 0.162359 19.857143 0.030285 0.108519\n", "6 0.211424 16.000000 0.018452 0.098016\n", "7 0.162644 14.428572 0.020833 0.091641\n", "8 0.184427 11.857142 0.038095 0.125924\n", "9 0.222325 10.428572 0.010989 0.057143\n", "10 0.224376 8.428572 0.000000 0.060884\n", "11 0.189518 7.142857 0.047619 0.093197\n", "12 0.248763 7.000000 0.044218 0.052381\n", "13 0.362771 6.285714 0.028571 0.035714\n", "14 0.311905 5.142857 0.083333 0.202381\n", "15 0.107143 4.857143 0.000000 0.061905\n", "16 0.119048 4.285714 0.051587 0.178571\n", "17 0.051587 4.142857 0.035714 0.123016\n", "18 0.119048 3.714286 0.000000 0.107143\n", "19 0.265873 3.714286 0.000000 0.154762\n", "20 0.258503 3.142857 0.000000 0.119048\n", "21 0.214286 2.857143 0.000000 0.119048\n", "22 0.214286 2.857143 0.000000 0.166667\n", "23 0.214286 2.714286 0.142857 0.047619\n", "24 0.309524 2.142857 0.071429 0.142857\n", "25 0.047619 1.571429 0.047619 0.000000\n", "26 0.142857 1.428571 0.000000 0.000000\n", "27 0.285714 1.142857 0.000000 0.000000\n", "28 0.071429 1.000000 0.000000 0.071429\n", "29 0.142857 0.857143 0.000000 0.000000\n", "30 0.000000 0.714286 0.000000 0.071429\n", "31 0.000000 0.714286 0.000000 0.071429\n", "32 0.142857 0.571429 0.000000 0.000000\n", "33 0.000000 0.571429 0.000000 0.000000\n", "34 0.000000 0.428571 0.000000 0.000000\n", "35 0.142857 0.428571 0.000000 0.000000\n", "36 0.000000 0.428571 0.000000 0.000000\n", "37 0.000000 0.428571 0.000000 0.000000\n", "38 0.000000 0.285714 0.000000 0.000000\n", "39 0.000000 0.285714 0.000000 0.000000\n", "40 0.000000 0.285714 0.000000 0.000000\n", "41 0.000000 0.285714 0.000000 0.000000\n", "42 0.000000 0.285714 0.000000 0.000000\n", "43 0.142857 0.285714 0.000000 0.000000\n", "44 0.000000 0.285714 0.000000 0.000000\n", "45 0.000000 0.285714 0.000000 0.000000\n", "46 0.142857 0.285714 0.000000 0.000000\n", "47 0.000000 0.142857 0.000000 0.000000\n", "48 0.000000 0.142857 0.000000 0.000000" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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uF/96ld57rnnqKur46GHHmJwcJC/+Iu/YNeuXQAcPHiQa6+9Vv8+mrvvvpu2tjbOOeccqqqq2LJlC/fffz8/+MEPKCsrY/Xq1VitVv7jP/4ju5/PKFSkP8NoH/DElGtqlBaaWVFfonx4FNOS++67j507d7Jjxw7uvvtuOjs7+dznPscjjzzCu+++yx//+Ecg1k9/z549nHvuuQnHHBoaYt26dezdu5ezzjqL7373uyxcuJDS0lJ2794NwP33389NN90U9/ovfelLzJo1iy1btrBlyxba29u58847eeONN3j99dfZt29f3OuyRUX6M4z2AQ8rZ5XEfW3Tgkp+u+0YHn8Qm9k4yTNTzAjGicgnirvvvptHH30UYFw//Yceeki/LpmfvsFg0I3abrjhBq666ioAbrnlFu6//35++tOf8oc//IG33347pTm+9dZbnH322VRXVwNw7bXX8sEHH6T5ScdHRfozCG8gSI/Lq1swjGbjgkp8gRC7W1S9vmL6EO2n/+6777J27VrWrMl9iw8hBABXX301mzdv5sknn+TUU0+lsrIy5++VDUr0ZxCdA15gbOWOxmmNFRiE8tdXTC8myk8/FArxpz/9CYAHHniAj3zkIwDYbDYuuOACvvCFLyRM7WgUFxfjdDoB2LBhA6+88goOhwO/36+nnHKNEv0ZRFukeUp9WXzRLy0ws3JWqcrrK6YVE+Wnb7fbefvttznppJN46aWX+M53dGcaPv3pT2MwGDj//POTzu3WW2/lwgsv5JxzzqG+vp5//Md/ZNOmTZxxxhksX748Nz+AUaic/gxipEY/fnoHwqWb//Omyusrpg8T5afvcrkSvvb6669z0003YTQm/xu6/fbbuf322/Xvb7rpJv3p4De/+Q07duxIaS7poER/BqFH+gnSOxD24fnVax+yq7mP0xdWTdbUFIppw5VXXsnhw4d56aWX8j2VuCjRn0G093sosZmwWxP/b183P5zX33akV4m+QkE41+71emOO/e53v2PVqlVxz9eqhKK58sor9fUDjR/96EdccMEFCd/3xhtv5MYbb0x/wuOgRH8G0T7gifHciUeJzcxJs1VeX6HQeOutt7IeI96NIF+ohdwZRPvAcNLUjsaS2mJaeyd3a/iJwBuHejjmGMr3NBSKrFCiP4NItBt3NCU2M4OewCTM6MRBSsnn/3cnv3hFdftU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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "pd.set_option(\"display.max_rows\", TIME_STEPS)\n", "merged_metrics = np.zeros((TIME_STEPS,4))\n", "for i in range(TIME_STEPS) :\n", " merged_metrics[i,:] = [metrics[\"acc\"+str(i)],metrics[\"sc\"+str(i)],metrics[\"acc_by_tq\"+str(i)],metrics[\"acc_by_tb\"+str(i)]]\n", "\n", "plt.figure()\n", "avg_metrics_df = pd.DataFrame(merged_metrics, columns=[\"acc\",\"sc\",\"acc_by_tq\",\"acc_by_tb\"])\n", "avg_metrics_df[\"acc\"].plot()\n", "avg_metrics_df[\"acc_by_tq\"].plot()\n", "avg_metrics_df[\"acc_by_tb\"].plot()\n", "plt.legend()\n", "display(avg_metrics_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Model artifacts were created as part of the training. You can run the following to get a Tensorboard visualization of our data model.\n", "\n", "You will need to modify SAVE_FILENAME to the name of a checkpoint file that was produced in your training run. Refer to the output of your local training job." ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from ./rnn_purchase_predictor/model.ckpt-4200\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from ./rnn_purchase_predictor/model.ckpt-4200\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from __future__ import print_function\n", "from io import BytesIO\n", "from functools import partial\n", "import PIL.Image\n", "from IPython.display import clear_output, Image, display, HTML\n", "\n", "SAVE_FILENAME = \"model.ckpt-4200\"\n", "\n", "# Helper functions for TF Graph visualization\n", "def strip_consts(graph_def, max_const_size=32):\n", " \"\"\"Strip large constant values from graph_def.\"\"\"\n", " strip_def = tf.GraphDef()\n", " for n0 in graph_def.node:\n", " n = strip_def.node.add() \n", " n.MergeFrom(n0)\n", " if n.op == 'Const':\n", " tensor = n.attr['value'].tensor\n", " size = len(tensor.tensor_content)\n", " if size > max_const_size:\n", " tensor.tensor_content = tf.compat.as_bytes(\"\"%size)\n", " return strip_def\n", " \n", "def rename_nodes(graph_def, rename_func):\n", " res_def = tf.GraphDef()\n", " for n0 in graph_def.node:\n", " n = res_def.node.add() \n", " n.MergeFrom(n0)\n", " n.name = rename_func(n.name)\n", " for i, s in enumerate(n.input):\n", " n.input[i] = rename_func(s) if s[0]!='^' else '^'+rename_func(s[1:])\n", " return res_def\n", " \n", "def show_graph(graph_def, max_const_size=32):\n", " \"\"\"Visualize TensorFlow graph.\"\"\"\n", " if hasattr(graph_def, 'as_graph_def'):\n", " graph_def = graph_def.as_graph_def()\n", " strip_def = strip_consts(graph_def, max_const_size=max_const_size)\n", " code = \"\"\"\n", " \n", " \n", "
\n", " \n", "
\n", " \"\"\".format(data=repr(str(strip_def)), id='graph'+str(np.random.rand()))\n", " \n", " iframe = \"\"\"\n", " \n", " \"\"\".format(code.replace('\"', '"'))\n", " display(HTML(iframe))\n", "\n", "tf.reset_default_graph()\n", "\n", "with tf.Session() as sess:\n", " \n", " metadata_file = SAVE_PATH+SAVE_FILENAME+\".meta\"\n", " saver = tf.train.import_meta_graph(metadata_file) \n", " restore_path = SAVE_PATH\n", " saver.restore(sess, tf.train.latest_checkpoint(restore_path)) \n", "\n", " show_graph(tf.get_default_graph())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Great! Now we're ready to try remote training. We simply need to create a Sagemaker Tensorflow object and run the fit method:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:sagemaker:No framework_version specified, defaulting to version 1.11.\n", "INFO:sagemaker:Creating training-job with name: sagemaker-tensorflow-2019-02-10-22-55-00-815\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "2019-02-10 22:55:01 Starting - Starting the training job...\n", "2019-02-10 22:55:03 Starting - Launching requested ML instances......\n", "2019-02-10 22:56:05 Starting - Preparing the instances for training......\n", "2019-02-10 22:57:23 Downloading - Downloading input data\n", "2019-02-10 22:57:23 Training - Downloading the training image...\n", "2019-02-10 22:57:56 Training - Training image download completed. Training in progress..\n", "\u001b[31m2019-02-10 22:57:57,059 INFO - root - running container entrypoint\u001b[0m\n", "\u001b[31m2019-02-10 22:57:57,059 INFO - root - starting train task\u001b[0m\n", "\u001b[31m2019-02-10 22:57:57,081 INFO - container_support.training - Training starting\u001b[0m\n", "\u001b[31mDownloading s3://awslabs-ml-samples/code/rnn_purchase_predictor//sagemaker-tensorflow-2019-02-10-22-55-00-815/source/sourcedir.tar.gz to /tmp/script.tar.gz\u001b[0m\n", "\u001b[31m2019-02-10 22:58:00,054 INFO - tf_container - ----------------------TF_CONFIG--------------------------\u001b[0m\n", "\u001b[31m2019-02-10 22:58:00,054 INFO - tf_container - {\"environment\": \"cloud\", \"cluster\": {\"master\": [\"algo-1:2222\"]}, \"task\": {\"index\": 0, \"type\": \"master\"}}\u001b[0m\n", "\u001b[31m2019-02-10 22:58:00,054 INFO - tf_container - ---------------------------------------------------------\u001b[0m\n", "\u001b[31m2019-02-10 22:58:00,054 INFO - tf_container - creating RunConfig:\u001b[0m\n", "\u001b[31m2019-02-10 22:58:00,054 INFO - tf_container - {'save_checkpoints_secs': 300}\u001b[0m\n", "\u001b[31m2019-02-10 22:58:00,054 INFO - tensorflow - TF_CONFIG environment variable: {u'environment': u'cloud', u'cluster': {u'master': [u'algo-1:2222']}, u'task': {u'index': 0, u'type': u'master'}}\u001b[0m\n", "\u001b[31m2019-02-10 22:58:00,055 INFO - tf_container - creating an estimator from the user-provided model_fn\u001b[0m\n", "\u001b[31m2019-02-10 22:58:00,055 INFO - tensorflow - Using config: {'_save_checkpoints_secs': 300, '_keep_checkpoint_max': 5, '_task_type': u'master', '_cluster_spec': , '_keep_checkpoint_every_n_hours': 10000, '_service': None, '_num_ps_replicas': 0, '_tf_random_seed': None, '_device_fn': None, '_num_worker_replicas': 1, '_task_id': 0, '_log_step_count_steps': 100, '_evaluation_master': '', '_eval_distribute': None, '_train_distribute': None, '_session_config': device_filters: \"/job:ps\"\u001b[0m\n", "\u001b[31mdevice_filters: \"/job:master\"\u001b[0m\n", "\u001b[31mallow_soft_placement: true\u001b[0m\n", "\u001b[31mgraph_options {\n", " rewrite_options {\n", " meta_optimizer_iterations: ONE\n", " }\u001b[0m\n", "\u001b[31m}\u001b[0m\n", "\u001b[31m, '_global_id_in_cluster': 0, '_is_chief': True, '_protocol': None, '_save_checkpoints_steps': None, '_experimental_distribute': None, '_save_summary_steps': 100, '_model_dir': u's3://awslabs-ml-samples/models/rnn_purchase_predictor/sagemaker-tensorflow-2019-02-10-22-55-00-815/checkpoints', '_master': ''}\u001b[0m\n", "\u001b[31m2019-02-10 22:58:00,056 INFO - tensorflow - Skip starting Tensorflow server as there is only one node in the cluster.\u001b[0m\n", "\u001b[31m2019-02-10 22:58:00.122434: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 22:58:00.122992: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m/opt/ml/code/rnn_purchase_predictor_custom_tf_model.py:39: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", " X = xdf.as_matrix().reshape(-1, hyperparameters[\"MAX_TIMESTEP\"], hyperparameters[\"INPUT_SIZE\"])\u001b[0m\n", "\u001b[31m/opt/ml/code/rnn_purchase_predictor_custom_tf_model.py:40: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", " Y = ydf.as_matrix().reshape(-1, hyperparameters[\"MAX_TIMESTEP\"], hyperparameters[\"INPUT_SIZE\"])\u001b[0m\n", "\u001b[31m/opt/ml/code/rnn_purchase_predictor_custom_tf_model.py:41: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", " SL = sldf.as_matrix().reshape(-1,)\u001b[0m\n", "\u001b[31m2019-02-10 22:58:58,264 WARNING - tensorflow - From /usr/local/lib/python2.7/dist-packages/tensorflow/python/estimator/inputs/queues/feeding_queue_runner.py:62: __init__ (from tensorflow.python.training.queue_runner_impl) is deprecated and will be removed in a future version.\u001b[0m\n", "\u001b[31mInstructions for updating:\u001b[0m\n", "\u001b[31mTo construct input pipelines, use the `tf.data` module.\u001b[0m\n", "\u001b[31m2019-02-10 22:58:58,266 WARNING - tensorflow - From /usr/local/lib/python2.7/dist-packages/tensorflow/python/estimator/inputs/queues/feeding_functions.py:500: add_queue_runner (from tensorflow.python.training.queue_runner_impl) is deprecated and will be removed in a future version.\u001b[0m\n", "\u001b[31mInstructions for updating:\u001b[0m\n", "\u001b[31mTo construct input pipelines, use the `tf.data` module.\u001b[0m\n", "\u001b[31m2019-02-10 22:58:58,297 INFO - tensorflow - Calling model_fn.\u001b[0m\n", "\u001b[31m2019-02-10 22:58:58,297 WARNING - tensorflow - From /opt/ml/code/rnn_purchase_predictor_custom_tf_model.py:123: __init__ (from tensorflow.python.ops.rnn_cell_impl) is deprecated and will be removed in a future version.\u001b[0m\n", "\u001b[31mInstructions for updating:\u001b[0m\n", "\u001b[31mThis class is deprecated, please use tf.nn.rnn_cell.LSTMCell, which supports all the feature this cell currently has. Please replace the existing code with tf.nn.rnn_cell.LSTMCell(name='basic_lstm_cell').\u001b[0m\n", "\u001b[31m2019-02-10 22:59:00,055 INFO - tensorflow - Done calling model_fn.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:00,057 INFO - tensorflow - Create CheckpointSaverHook.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:00.106808: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 22:59:00.106850: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:00.125491: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 22:59:00.125526: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:00.145608: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 22:59:00.145685: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:00.166540: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 22:59:00.166573: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:01,138 INFO - tensorflow - Graph was finalized.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:02.391438: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 22:59:02.391488: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:03,070 INFO - tensorflow - Running local_init_op.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:03,173 INFO - tensorflow - Done running local_init_op.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:03,253 WARNING - tensorflow - From /usr/local/lib/python2.7/dist-packages/tensorflow/python/training/monitored_session.py:804: start_queue_runners (from tensorflow.python.training.queue_runner_impl) is deprecated and will be removed in a future version.\u001b[0m\n", "\u001b[31mInstructions for updating:\u001b[0m\n", "\u001b[31mTo construct input pipelines, use the `tf.data` module.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:03.371026: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 22:59:03.371107: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:04,835 INFO - tensorflow - Saving checkpoints for 0 into s3://awslabs-ml-samples/models/rnn_purchase_predictor/sagemaker-tensorflow-2019-02-10-22-55-00-815/checkpoints/model.ckpt.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:11.960103: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 22:59:11.960147: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 22:59:16,824 INFO - tensorflow - loss = 0.69316334, step = 0\u001b[0m\n", "\u001b[31m2019-02-10 22:59:16,825 INFO - tensorflow - accuracy = [0.0625 0.0625 0.03125 0. 0.03571429 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.16666667\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ]\u001b[0m\n", "\u001b[31m2019-02-10 22:59:43,974 INFO - tensorflow - global_step/sec: 3.68312\u001b[0m\n", "\u001b[31m2019-02-10 22:59:43,975 INFO - tensorflow - loss = 0.533302, step = 100 (27.151 sec)\u001b[0m\n", "\u001b[31m2019-02-10 22:59:43,976 INFO - tensorflow - accuracy = [0.03125 0. 0.09375 0. 0.03703704 0.09090909\n", " 0.11111111 0. 0. 0. 0. 0.\n", " 0.33333334 0.33333334 0.33333334 0. 0.33333334 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (27.151 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:00:07,816 INFO - tensorflow - global_step/sec: 4.19432\u001b[0m\n", "\u001b[31m2019-02-10 23:00:07,817 INFO - tensorflow - loss = 0.47767484, step = 200 (23.842 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:00:07,818 INFO - tensorflow - accuracy = [0.03125 0. 0. 0.03125 0.04 0.05882353\n", " 0. 0. 0. 0.11111111 0. 0.\n", " 0.14285715 0. 0. 0. 0. 0.\n", " 0.25 0.25 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.33333334\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (23.842 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:00:31,533 INFO - tensorflow - global_step/sec: 4.21639\u001b[0m\n", "\u001b[31m2019-02-10 23:00:31,533 INFO - tensorflow - loss = 0.47574335, step = 300 (23.717 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:00:31,534 INFO - tensorflow - accuracy = [0. 0.03125 0.03125 0.09375 0.09090909 0.2\n", " 0.1 0. 0. 0. 0. 0.25\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (23.717 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:00:55,675 INFO - tensorflow - global_step/sec: 4.14207\u001b[0m\n", "\u001b[31m2019-02-10 23:00:55,676 INFO - tensorflow - loss = 0.4190046, step = 400 (24.143 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:00:55,677 INFO - tensorflow - accuracy = [0.25 0.0625 0.15625 0.15625 0.08695652 0.0625\n", " 0.06666667 0.08333334 0.08333334 0.08333334 0.18181819 0.\n", " 0. 0. 0.16666667 0. 0.16666667 0.\n", " 0.33333334 0.5 0. 0. 0. 0.\n", " 0. 0. 0. 0.5 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (24.143 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:01:19,651 INFO - tensorflow - global_step/sec: 4.17077\u001b[0m\n", "\u001b[31m2019-02-10 23:01:19,819 INFO - tensorflow - loss = 0.40334862, step = 500 (24.142 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:01:19,820 INFO - tensorflow - accuracy = [0.125 0.125 0.0625 0.09375 0.14814815 0.0952381\n", " 0.11111111 0.18181819 0.2 0.1 0. 0.14285715\n", " 0.14285715 0.2857143 0.33333334 0.33333334 0.25 0.5\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (24.143 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:01:43,487 INFO - tensorflow - global_step/sec: 4.19537\u001b[0m\n", "\u001b[31m2019-02-10 23:01:43,488 INFO - tensorflow - loss = 0.37716356, step = 600 (23.670 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:01:43,489 INFO - tensorflow - accuracy = [0.1875 0.125 0.0625 0.15625 0.16 0.\n", " 0.125 0.16666667 0.125 0.125 0.14285715 0.2\n", " 0. 0. 0.33333334 0.5 0.5 0.\n", " 0. 0.5 0. 0.5 0.5 0.5\n", " 0. 0.5 0.5 0.5 0. 0.\n", " 0. 1. 1. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (23.669 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:02:07,674 INFO - tensorflow - global_step/sec: 4.13453\u001b[0m\n", "\u001b[31m2019-02-10 23:02:07,675 INFO - tensorflow - loss = 0.35704514, step = 700 (24.187 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:02:07,676 INFO - tensorflow - accuracy = [0.03125 0.0625 0.03125 0.03125 0.15384616 0.1\n", " 0.11764706 0. 0.1 0.11111111 0. 0.\n", " 0. 0. 0.25 0.25 0.33333334 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (24.186 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:02:31,686 INFO - tensorflow - global_step/sec: 4.1645\u001b[0m\n", "\u001b[31m2019-02-10 23:02:31,687 INFO - tensorflow - loss = 0.32448426, step = 800 (24.012 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:02:31,688 INFO - tensorflow - accuracy = [0.03125 0.09375 0.03125 0.03125 0.08 0.11111111\n", " 0.30769232 0.09090909 0. 0.18181819 0. 0.\n", " 0.14285715 0.6 0.6666667 0.33333334 0.6666667 0.\n", " 0. 0.33333334 0.6666667 0.5 0. 0.\n", " 0.5 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (24.013 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:02:55,808 INFO - tensorflow - global_step/sec: 4.14564\u001b[0m\n", "\u001b[31m2019-02-10 23:02:55,809 INFO - tensorflow - loss = 0.32098904, step = 900 (24.122 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:02:55,810 INFO - tensorflow - accuracy = [0.03125 0.15625 0.09375 0.125 0.12 0.23529412\n", " 0.08333334 0. 0.14285715 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (24.122 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:03:19,785 INFO - tensorflow - global_step/sec: 4.17064\u001b[0m\n", "\u001b[31m2019-02-10 23:03:19,929 INFO - tensorflow - loss = 0.26338267, step = 1000 (24.120 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:03:19,931 INFO - tensorflow - accuracy = [0.125 0.1875 0.09375 0.09375 0.08695652 0.04347826\n", " 0.2 0. 0.05882353 0.05882353 0. 0.1\n", " 0.1 0.1 0.11111111 0.14285715 0.14285715 0.2857143\n", " 0.16666667 0. 0. 0.25 0. 0.\n", " 0.25 0.33333334 0.33333334 0. 0. 0.\n", " 0.33333334 0. 0. 0. 0.5 1.\n", " 0. 1. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (24.120 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:03:43,629 INFO - tensorflow - global_step/sec: 4.19393\u001b[0m\n", "\u001b[31m2019-02-10 23:03:43,630 INFO - tensorflow - loss = 0.2657217, step = 1100 (23.701 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:03:43,631 INFO - tensorflow - accuracy = [0.125 0.125 0.15625 0.125 0.03846154 0.13636364\n", " 0.05555556 0.14285715 0.1 0.375 0. 0.4\n", " 0.4 0. 0. 0. 0. 0.25\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.5 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (23.701 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:04:07,698 INFO - tensorflow - global_step/sec: 4.15471\u001b[0m\n", "\u001b[31m2019-02-10 23:04:07,699 INFO - tensorflow - loss = 0.24543852, step = 1200 (24.069 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:04:07,700 INFO - tensorflow - accuracy = [0.125 0.03125 0. 0.03125 0.03846154 0.16\n", " 0. 0. 0. 0. 0. 0.125\n", " 0.125 0.16666667 0. 0. 0. 0.\n", " 0. 0.33333334 0.33333334 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (24.069 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:04:12,473 INFO - tensorflow - Saving checkpoints for 1221 into s3://awslabs-ml-samples/models/rnn_purchase_predictor/sagemaker-tensorflow-2019-02-10-22-55-00-815/checkpoints/model.ckpt.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:20.223303: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:20.223345: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:35,373 INFO - tensorflow - Calling model_fn.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:40,045 INFO - tensorflow - Done calling model_fn.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:40,069 INFO - tensorflow - Starting evaluation at 2019-02-10-23:04:40\u001b[0m\n", "\u001b[31m2019-02-10 23:04:40,625 INFO - tensorflow - Graph was finalized.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:40,803 INFO - tensorflow - Restoring parameters from s3://awslabs-ml-samples/models/rnn_purchase_predictor/sagemaker-tensorflow-2019-02-10-22-55-00-815/checkpoints/model.ckpt-1221\u001b[0m\n", "\u001b[31m2019-02-10 23:04:42,707 INFO - tensorflow - Running local_init_op.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:43,055 INFO - tensorflow - Done running local_init_op.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:44,333 INFO - tensorflow - Evaluation [1/7]\u001b[0m\n", "\u001b[31m2019-02-10 23:04:44,336 INFO - tensorflow - accuracy = [0.09375 0.0625 0.0625 0.0625 0.125 0.14285715\n", " 0.11764706 0.21428572 0. 0. 0. 0.25\n", " 0.25 0. 0. 0.33333334 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ], sc = [32 32 32 32 24 21 17 14 11 8 7 4 4 3 3 3 3 2 2 1 1 1 1 1\n", " 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0]\u001b[0m\n", "\u001b[31m2019-02-10 23:04:45,338 INFO - tensorflow - Evaluation [2/7]\u001b[0m\n", "\u001b[31m2019-02-10 23:04:45,431 INFO - tensorflow - Evaluation [3/7]\u001b[0m\n", "\u001b[31m2019-02-10 23:04:45,513 INFO - tensorflow - Evaluation [4/7]\u001b[0m\n", "\u001b[31m2019-02-10 23:04:45,614 INFO - tensorflow - Evaluation [5/7]\u001b[0m\n", "\u001b[31m2019-02-10 23:04:45,729 INFO - tensorflow - Evaluation [6/7]\u001b[0m\n", "\u001b[31m2019-02-10 23:04:45,811 INFO - tensorflow - Evaluation [7/7]\u001b[0m\n", "\u001b[31m2019-02-10 23:04:46,272 INFO - tensorflow - Finished evaluation at 2019-02-10-23:04:46\u001b[0m\n", "\u001b[31m2019-02-10 23:04:46,272 INFO - tensorflow - Saving dict for global step 1221: acc0 = 0.10130495, acc1 = 0.11469781, acc10 = 0.05612245, acc11 = 0.10714286, acc12 = 0.10714286, acc13 = 0.071428575, acc14 = 0.04761905, acc15 = 0.04761905, acc16 = 0.0, acc17 = 0.0, acc18 = 0.04761905, acc19 = 0.0, acc2 = 0.07692308, acc20 = 0.0, acc21 = 0.0, acc22 = 0.0, acc23 = 0.0, acc24 = 0.0, acc25 = 0.0, acc26 = 0.0, acc27 = 0.0, acc28 = 0.0, acc29 = 0.0, acc3 = 0.09031594, acc30 = 0.0, acc31 = 0.0, acc32 = 0.0, acc33 = 0.0, acc34 = 0.0, acc35 = 0.0, acc36 = 0.0, acc37 = 0.0, acc38 = 0.0, acc39 = 0.0, acc4 = 0.07450242, acc40 = 0.0, acc41 = 0.0, acc42 = 0.0, acc43 = 0.0, acc44 = 0.0, acc45 = 0.0, acc46 = 0.0, acc47 = 0.0, acc48 = 0.0, acc5 = 0.052906074, acc6 = 0.085893594, acc7 = 0.0811617, acc8 = 0.06235828, acc9 = 0.09183674, acc_by_tb0 = 0.103365384, acc_by_tb1 = 0.15590659, acc_by_tb10 = 0.052380953, acc_by_tb11 = 0.04642857, acc_by_tb12 = 0.0, acc_by_tb13 = 0.0, acc_by_tb14 = 0.14285715, acc_by_tb15 = 0.0, acc_by_tb16 = 0.0, acc_by_tb17 = 0.0, acc_by_tb18 = 0.0, acc_by_tb19 = 0.0, acc_by_tb2 = 0.09237637, acc_by_tb20 = 0.0, acc_by_tb21 = 0.0, acc_by_tb22 = 0.14285715, acc_by_tb23 = 0.0, acc_by_tb24 = 0.0, acc_by_tb25 = 0.0, acc_by_tb26 = 0.0, acc_by_tb27 = 0.0, acc_by_tb28 = 0.0, acc_by_tb29 = 0.0, acc_by_tb3 = 0.103365384, acc_by_tb30 = 0.0, acc_by_tb31 = 0.0, acc_by_tb32 = 0.0, acc_by_tb33 = 0.0, acc_by_tb34 = 0.0, acc_by_tb35 = 0.0, acc_by_tb36 = 0.0, acc_by_tb37 = 0.0, acc_by_tb38 = 0.0, acc_by_tb39 = 0.0, acc_by_tb4 = 0.085690565, acc_by_tb40 = 0.0, acc_by_tb41 = 0.0, acc_by_tb42 = 0.0, acc_by_tb43 = 0.0, acc_by_tb44 = 0.0, acc_by_tb45 = 0.0, acc_by_tb46 = 0.0, acc_by_tb47 = 0.0, acc_by_tb48 = 0.0, acc_by_tb5 = 0.0936866, acc_by_tb6 = 0.10161372, acc_by_tb7 = 0.07425432, acc_by_tb8 = 0.09653838, acc_by_tb9 = 0.05357143, acc_by_tq0 = 0.017857144, acc_by_tq1 = 0.02232143, acc_by_tq10 = 0.0, acc_by_tq11 = 0.028571429, acc_by_tq12 = 0.028571429, acc_by_tq13 = 0.0, acc_by_tq14 = 0.0, a\u001b[0m\n", "\u001b[31m2019-02-10 23:04:46.283024: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:46.283061: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:46.305348: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:46.305382: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:46.326157: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:46.326197: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47,414 INFO - tensorflow - Saving 'checkpoint_path' summary for global step 1221: s3://awslabs-ml-samples/models/rnn_purchase_predictor/sagemaker-tensorflow-2019-02-10-22-55-00-815/checkpoints/model.ckpt-1221\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47.540942: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47.540991: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47.563496: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47.563538: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47.579301: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47.579336: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47.595552: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47.595591: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47.615512: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47.615551: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47.630992: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47.631031: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:47,703 INFO - tensorflow - Calling model_fn.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:48,352 INFO - tensorflow - Done calling model_fn.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:48,353 INFO - tensorflow - Signatures INCLUDED in export for Eval: None\u001b[0m\n", "\u001b[31m2019-02-10 23:04:48,353 INFO - tensorflow - Signatures INCLUDED in export for Classify: None\u001b[0m\n", "\u001b[31m2019-02-10 23:04:48,353 INFO - tensorflow - Signatures INCLUDED in export for Regress: None\u001b[0m\n", "\u001b[31m2019-02-10 23:04:48,353 INFO - tensorflow - Signatures INCLUDED in export for Predict: ['serving_default', 'inference_data']\u001b[0m\n", "\u001b[31m2019-02-10 23:04:48,353 INFO - tensorflow - Signatures INCLUDED in export for Train: None\u001b[0m\n", "\u001b[31m2019-02-10 23:04:48,426 INFO - tensorflow - Restoring parameters from s3://awslabs-ml-samples/models/rnn_purchase_predictor/sagemaker-tensorflow-2019-02-10-22-55-00-815/checkpoints/model.ckpt-1221\u001b[0m\n", "\u001b[31m2019-02-10 23:04:49,157 WARNING - tensorflow - From /usr/local/lib/python2.7/dist-packages/tensorflow/python/estimator/estimator.py:1018: calling add_meta_graph_and_variables (from tensorflow.python.saved_model.builder_impl) with legacy_init_op is deprecated and will be removed in a future version.\u001b[0m\n", "\u001b[31mInstructions for updating:\u001b[0m\n", "\u001b[31mPass your op to the equivalent parameter main_op instead.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:49,157 INFO - tensorflow - Assets added to graph.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:49,157 INFO - tensorflow - No assets to write.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:49.167440: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:49.167475: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:49.185140: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:49.185181: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:49.200288: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:49.200327: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:52.862021: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:52.862073: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:52,911 INFO - tensorflow - SavedModel written to: s3://awslabs-ml-samples/models/rnn_purchase_predictor/sagemaker-tensorflow-2019-02-10-22-55-00-815/checkpoints/export/Servo/temp-1549839887/saved_model.pb\u001b[0m\n", "\u001b[31m2019-02-10 23:04:52.918686: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:52.918723: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:54.195834: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:54.195890: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:04:54.213958: E tensorflow/core/platform/s3/aws_logging.cc:60] No response body. Response code: 404\u001b[0m\n", "\u001b[31m2019-02-10 23:04:54.214009: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.\u001b[0m\n", "\u001b[31m2019-02-10 23:05:13,471 INFO - tensorflow - global_step/sec: 1.52038\u001b[0m\n", "\u001b[31m2019-02-10 23:05:13,472 INFO - tensorflow - loss = 0.24581215, step = 1300 (65.773 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:05:13,473 INFO - tensorflow - accuracy = [0.1875 0.125 0.1875 0.15625 0.04166667 0.\n", " 0.1 0. 0.375 0.14285715 0.14285715 0.\n", " 0.33333334 0.33333334 0. 0. 0. 0.\n", " 0. 0. 0. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (65.772 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:05:37,377 INFO - tensorflow - global_step/sec: 4.18299\u001b[0m\n", "\u001b[31m2019-02-10 23:05:37,487 INFO - tensorflow - loss = 0.21741389, step = 1400 (24.015 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:05:37,489 INFO - tensorflow - accuracy = [0.0625 0. 0.0625 0.0625 0.04545455 0.05555556\n", " 0.0625 0.06666667 0.09090909 0.11111111 0. 0.16666667\n", " 0.16666667 0.16666667 0. 0. 0. 0.\n", " 0.25 0.25 0.33333334 0.33333334 0.33333334 0.33333334\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (24.015 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:06:00,906 INFO - tensorflow - global_step/sec: 4.25012\u001b[0m\n", "\u001b[31m2019-02-10 23:06:00,907 INFO - tensorflow - loss = 0.20013198, step = 1500 (23.420 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:06:00,908 INFO - tensorflow - accuracy = [0.125 0.0625 0.0625 0.0625 0.04545455 0.05\n", " 0.05882353 0.08333334 0.09090909 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.2 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (23.420 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:06:25,576 INFO - tensorflow - global_step/sec: 4.0536\u001b[0m\n", "\u001b[31m2019-02-10 23:06:25,577 INFO - tensorflow - loss = 0.1918194, step = 1600 (24.669 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:06:25,578 INFO - tensorflow - accuracy = [0.09375 0.125 0.0625 0.0625 0.11538462 0.04166667\n", " 0.15789473 0.125 0. 0.18181819 0. 0.16666667\n", " 0. 0.4 0. 0. 0.25 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 1. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (24.669 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:06:49,547 INFO - tensorflow - global_step/sec: 4.17164\u001b[0m\n", "\u001b[31m2019-02-10 23:06:49,548 INFO - tensorflow - loss = 0.17914025, step = 1700 (23.972 sec)\u001b[0m\n", "\u001b[31m2019-02-10 23:06:49,549 INFO - tensorflow - accuracy = [0.15625 0.03125 0.03125 0.15625 0.12 0.04761905\n", " 0.05555556 0. 0.06666667 0.07142857 0.08333334 0.1\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0.5 1.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. ] (23.972 sec)\u001b[0m\n" ] } ], "source": [ "hyperparameters = {\n", " \"MAX_TIMESTEP\" : TIME_STEPS,\n", " \"INPUT_SIZE\" : INPUT_SIZE,\n", " \"OUTPUT_SIZE\" : OUTPUT_SIZE,\n", " \"BATCH_SIZE\" : BATCH_SIZE,\n", " \"LSTM_UNITS\" : LSTM_UNITS,\n", " \"MAX_EPOCHS\" : EPOCHS,\n", " \"POSITIVE_THRESHOLD\" : POSITIVE_THRESHOLD,\n", " \"LEARNING_RATE\" : LEARNING_RATE,\n", " \"DROPOUT_RNN_STATE_KEEP_PROB\" : DROPOUT_RNN_STATE_KEEP_PROB,\n", " \"DROPOUT_RNN_INPUT_KEEP_PROB\" : DROPOUT_RNN_INPUT_KEEP_PROB,\n", " \"TOP_PROD_BY_QTYBOUGHT\" : TOP_PROD_BY_QTYBOUGHT,\n", " \"TOP_PROD_BY_TIMESBOUGHT\" : TOP_PROD_BY_TIMESBOUGHT,\n", " \"K_PREDICTIONS\" : K_PREDICTIONS,\n", " \"L2_REG_DENSE\" : L2_REG_DENSE\n", "}\n", "\n", "tf_estimator = TensorFlow(entry_point = \"./\"+CUSTOM_TF_MODEL_FILENAME, \n", " role = iamRole,\n", " training_steps = training_steps, \n", " evaluation_steps = evaluation_steps,\n", " train_instance_count = TRAINING_INSTANCE_COUNT, \n", " train_instance_type = TRAINING_INSTANCE_TYPE,\n", " output_path = model_dir,\n", " hyperparameters = hyperparameters,\n", " code_location = code_dir)\n", "\n", "tf_estimator.fit(training_dir)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Training is complete! We can now deploy an endpoint for our model by simply calling the \"deploy\" method on our Sagemaker Tensorflow object. A RealTimePredictor object can then be created to handle the serialization and deserialization of request and responses from our newly created endpoint using protobuf encoded streams." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "endpoint = tf_estimator.deploy(initial_instance_count=1, instance_type='ml.c4.xlarge').endpoint\n", "rnn_purchase_predictor = RealTimePredictor(endpoint=endpoint,\n", " deserializer=tf_deserializer, \n", " serializer=tf_serializer,\n", " content_type=CONTENT_TYPE_OCTET_STREAM)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's predict what is the most likely product that will be purchased next using our validation set as the input." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": true }, "outputs": [], "source": [ "n_previous_purchases = range(10)\n", "customer_ids= [i for i,v in enumerate(SL_val) if v in n_previous_purchases]\n", "\n", "predictions = np.zeros((len(customer_ids),4))\n", "\n", "i=0\n", "for id in customer_ids:\n", " \n", " request = predict_pb2.PredictRequest()\n", " request.model_spec.name = \"generic_model\"\n", " request.model_spec.signature_name = DEFAULT_SERVING_SIGNATURE_DEF_KEY\n", " request.inputs['ph_inputs'].CopyFrom(tf.contrib.util.make_tensor_proto(X_val[id], shape=[1,49,3648]))\n", " request.inputs[\"ph_sequence_lengths\"].CopyFrom(tf.contrib.util.make_tensor_proto(SL_val[id], shape=[1,])) \n", "\n", " result = rnn_purchase_predictor.predict(request)\n", "\n", " predictions[i,:] = [id,\n", " result.outputs[\"prod_indices\"].int_val[0],\n", " result.outputs[\"prod_indices\"].int_val[1],\n", " result.outputs[\"prod_indices\"].int_val[2]]\n", " i=i+1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot the results:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n1KzniWb2BjN73tTXcuqZ2TJmZjNdjzbp+1l68Fe4jiVblp9WuN53l5RrWWdbXQ+f4u09wcz2zixf\n3cw2rnn9RWa2WuE2p62NhkeHqf5tle5z03mcLL1OQzuCQAXM7AYzu77yV33++5aybzOz1dNjM7ND\nzezPZnaRma2bKfp/hdVdu7CcJBX9oM3sYDN7dnr8eEmXSvq2pIvNbOtM0cMlnWZme1cbmyNu+/Op\nEbSomZ1uZneb2XaZImdWyp4+tOz4TLnj6hqxZvZxSW9vqeOq1YtAM3uZmX3JzP7HzBbLlHt/5fGW\nQ8s+kym3tJl90My+bGavTPvdeyRdL+ktLXU9w8x+3vA3/HlVFe13ZvZ2M3t6emxm9k0zu8fMLjOz\n57aUXSX3lym3hZntVnl+fuX3/ObMJi8ysxeM/J9sl/vdHa6C34iZ/W/ur6X4qZJmp/WsLuk8SU+T\ntJuZfTZT7nQzW6amLq+U9MNMXe9N3/k96fHg+X1m9mBLXU+3miCZmb1N0hcz2yz9TW5gZitUnu9g\nZiekz3XZlnqO/Nmo8Jhc2eYcK+hNVHrsaVnnPpnFu5rZyVYQuBpj/yna5hjHSFXPTTZ0AWnljfsD\nM9t7vpldamZ/N7PzzGzNEdZbdBwwsx+Z2Vrp8YqSrpD0NknfMbPdM+VeV/0uzOyjqe4nmtlTcxUt\nPaanbTwzPV7czM6Q9HtJd5jZyzPldsj95epaWcdzzez7ZvZri/bgxWZ2UYdyu5jZ7ZJ+p/hsr0z/\n5sqsZGbrD45tZrZ8+h1f27K5WV3+LzXeVlhunLqWtkFWNrND0n67i0Vw7QDF55u7kflFSffWvP5P\nZc49aZvjtNEWNrPlKs8XM7NdzeyqTJmdzex9lee3Vo6X2ZuY6fNZuvL8xWZ2gJn9t2XaJKXHSSu/\nZio+P1the6CUmR1Tefy5oWVtgdei39aY+1zRcTKzvjXM7NDMW86svLfzdVrpPtcr7s7fiH+Snjj0\nN0vSbpJukHRsS9krJC2aHr9V0sWSniRpM0lnZ8pdVFjXqyWtJ+m5dX8tZW+R9D9Nf5lyV1Ye7y7p\n+PR4BUkXt2xzSUmfUwSO9uqyvaHyl6R/3yDpW5KWlXRp5v0X1z2uez607HmKg+UL0nOTdLCkn0ta\nuqWO50t6cnq8rqS7Je2Z6vv1LvvA8P6Q2z8knaAIHrxD0jGSfirpLEnrdvg8n1fzt5ukmyT9Zqr3\n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\nzih0rKTTBhdDXRtLNkIGtPT+xgmMvTKWuKZcYxduKRsIrAY5DvI0eWSHeq7v3e9MD5etywa4rGLI\n5JLu/vaGciN9lh3qYYrfdGPPJIt5Mr6g2M/20MQwIlNcyDc2bhvWt4Zi4tKm/+PcLH4WGQMPdfej\nhpc1lM31QPuXpOu95i6rzTs3yzGKuVmyw8SajjcDmePO8oqLk9UVx7zPdjnejXmx+VHF/uWp3GAy\n0OdLutQzk4FO07Fnnl43Q8uLUruOuf+MvM2hc8GkRYrz5zKZshvVnU/Tb+Stmf3nCndfy6JX1S3u\nvkJl2dxsXDXlhu/Gn6pIZf6gYkha0914WWQmfIO732Zm6yp653xWcdHwb3evnadhjN/WOGmB/6Xo\neVQ795G3ZFFrWOdj3f2fDcuqGdC+Iukud98nPe+UlTQFgWelOt+ZO9dNFzPb3933an/nyOs9WNJB\n7n6lxY2d8yQ9pDjn7eXuRxasc7rqWnSONbMXSbrJKynTK8uybQUrzw423OYZ3Ew6x9Ncc1NtjCBZ\nUVvSzG7WvPP1LSHpN4qMt/N83pWypefnzyvaCgcPvb6HoufnBzLbHCfAtpri2swUPcI6ZxdM7ebV\n09Prmo5VHdazquIckZt3r6nsyorzVq6nXVPZ57v7+Q3LblDznI2Nx/PpOA882hAEKmAxtvQvihPZ\npoo7cYtJeq8XTDZWWW8uCPSA4i7GMYpJuCbt1E0NIqtMSJfuHC3r7rtZpCa+0DOT1Q0fmAcNzw7/\nj3MUvYWWVlw07q6JwMqnmg4uKaL9csVdt9coPt8jJZ1YekDrUNdLPYbKmOIEvkplWWPjrTQSnsqW\nplmd0gBAWmfbHapfKe4w3CHpGknP84mJbK9292c2la2so3OjwSZPYHyUJiYwbp2zxSZSCp+iuOAf\n/o00nfAbU2e3bO9iRfDuSEXmmimZHDz3PWcuOCU1Bx/HbNSUNqTWVnS9f7Ji7qCDFJmBnq+4U107\nZM5ifrTTFMOFDpP0VHf/a2rkXOCpl0dD2VwDbBHFUN5f+lDQPB1fz1P0/hvMzdIl5fa73b2xC3ym\n3KmKu75nKyYyXsrdd+pQrvhi0yKov64aJgPNHdvHuDD6el1wIAXCT+1yPinYZvH+U7i9cc4FpRdU\nRb3zrPBufCp7madeVGa2v6SH3f39KXhxiTf3sCr9bX3GC+dzGGN/zd3A2rnpQt7MrlD0wHrQzK5W\n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\nHlRSywAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "pred_df = pd.DataFrame(predictions,columns=[\"id\",\"pred_1\",\"pred_2\",\"pred_3\"])\n", "#display(pred_df)\n", "grouped = pred_df.groupby('pred_1')\n", "pred_counts = grouped['pred_1'].agg(['count']).sort_values(by=['count'])\n", "plot_data = pred_counts.join(products).sort_values(by=\"count\")\n", "#display(plot_data[[\"Description\",\"count\"]])\n", "\n", "plt.figure(figsize=(20, 5))\n", "plt.bar(plot_data[\"Description\"],plot_data['count'])\n", "plt.xticks(rotation='vertical')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you download and deploy the model that I have provided here, you will see that the model predicts that a number of customers will buy the \"Rabbit Night Light\" next. Let's run a product promotion \n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's create a sample CSV file that can be imported into Amazon Pinpoint to run a campaign. Feel free to modify YOUR_EMAIL_ADDRESS so that you can send an email to yourself for testing.\n", "\n", "PROMO_PRODUCT_ID has been set to 29 as it represents the product index for the \"Rabbit Night Light.\"" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ChannelTypeUser.UserAttributes.IdAttributes.Prediction_ProductIDAddressDemographic.Platform
0EMAIL129your@email.comAndroid
1EMAIL2529customer25@amazon.comIOS
2EMAIL3329customer33@amazon.comIOS
3EMAIL5129customer51@amazon.comAndroid
4EMAIL5329customer53@amazon.comIOS
5EMAIL6629customer66@amazon.comAndroid
6EMAIL6729customer67@amazon.comAndroid
7EMAIL7629customer76@amazon.comIOS
8EMAIL7829customer78@amazon.comIOS
9EMAIL8429customer84@amazon.comAndroid
10EMAIL9329customer93@amazon.comIOS
11EMAIL9529customer95@amazon.comIOS
12EMAIL9629customer96@amazon.comAndroid
13EMAIL9829customer98@amazon.comIOS
14EMAIL10329customer103@amazon.comIOS
15EMAIL12229customer122@amazon.comIOS
16EMAIL15429customer154@amazon.comIOS
17EMAIL19529customer195@amazon.comAndroid
18EMAIL19729customer197@amazon.comIOS
19EMAIL20429customer204@amazon.comIOS
20EMAIL20929customer209@amazon.comIOS
21EMAIL21429customer214@amazon.comIOS
\n", "
" ], "text/plain": [ " ChannelType User.UserAttributes.Id Attributes.Prediction_ProductID \\\n", "0 EMAIL 1 29 \n", "1 EMAIL 25 29 \n", "2 EMAIL 33 29 \n", "3 EMAIL 51 29 \n", "4 EMAIL 53 29 \n", "5 EMAIL 66 29 \n", "6 EMAIL 67 29 \n", "7 EMAIL 76 29 \n", "8 EMAIL 78 29 \n", "9 EMAIL 84 29 \n", "10 EMAIL 93 29 \n", "11 EMAIL 95 29 \n", "12 EMAIL 96 29 \n", "13 EMAIL 98 29 \n", "14 EMAIL 103 29 \n", "15 EMAIL 122 29 \n", "16 EMAIL 154 29 \n", "17 EMAIL 195 29 \n", "18 EMAIL 197 29 \n", "19 EMAIL 204 29 \n", "20 EMAIL 209 29 \n", "21 EMAIL 214 29 \n", "\n", " Address Demographic.Platform \n", "0 your@email.com Android \n", "1 customer25@amazon.com IOS \n", "2 customer33@amazon.com IOS \n", "3 customer51@amazon.com Android \n", "4 customer53@amazon.com IOS \n", "5 customer66@amazon.com Android \n", "6 customer67@amazon.com Android \n", "7 customer76@amazon.com IOS \n", "8 customer78@amazon.com IOS \n", "9 customer84@amazon.com Android \n", "10 customer93@amazon.com IOS \n", "11 customer95@amazon.com IOS \n", "12 customer96@amazon.com Android \n", "13 customer98@amazon.com IOS \n", "14 customer103@amazon.com IOS \n", "15 customer122@amazon.com IOS \n", "16 customer154@amazon.com IOS \n", "17 customer195@amazon.com Android \n", "18 customer197@amazon.com IOS \n", "19 customer204@amazon.com IOS \n", "20 customer209@amazon.com IOS \n", "21 customer214@amazon.com IOS " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "YOUR_EMAIL_ADDRESS= \"your@email.com\"\n", "N_CHANNEL_TYPES = 4\n", "N_ATTR = 2\n", "SMS, APNS, EMAIL, GCM = range(N_CHANNEL_TYPES)\n", "PROMO_PRODUCT_ID = 29 #RABBIT_NIGHT_LIGHT\n", "PLATFORMS = ['Android', 'IOS']\n", "CHANNEL_TYPES = ['SMS', 'APNS','EMAIL','GCM']\n", "cohort = []\n", "for i in range(predictions.shape[0]) :\n", "\n", " if predictions[i,1] == PROMO_PRODUCT_ID :\n", " address = \"customer\"+str(int(predictions[i,0]))+\"@amazon.com\"\n", " cohort.append([CHANNEL_TYPES[EMAIL]] + \n", " predictions[i,0:2].astype(np.int32).tolist() + \n", " [address, PLATFORMS[np.random.randint(2)]])\n", "\n", "cohort[0][3]= YOUR_EMAIL_ADDRESS \n", "cohort_df = pd.DataFrame(cohort, columns=[\"ChannelType\",\"User.UserAttributes.Id\",\"Attributes.Prediction_ProductID\", \"Address\",\"Demographic.Platform\"])\n", "display(cohort_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's write this file out to S3, so that it can be imported into Amazon Pinpoint. Modify S3_BUCKET and the PINPOINT_ENDPOINT_DIR to where you want to write out this file." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Amazon Pinpoint endpoint file name: product_29_cohort.csv\n" ] } ], "source": [ "S3_BUCKET = \"awslabs-ml-samples\"\n", "PINPOINT_ENDPOINT_DIR = \"pinpoint/endpoints/\"\n", "PINPOINT_ENDPOINT_DATA = \"product_\"+str(PROMO_PRODUCT_ID)+\"_cohort.csv\"\n", "print(\"Amazon Pinpoint endpoint file name: \"+PINPOINT_ENDPOINT_DATA)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Write out the file to S3. Note that you may need to replicate or move this file to us-east-1. At the time of writing, Amazon Pinpoint is only available in that region. Follow the steps outlined in my blog to get an idea of how you can run your \"predictive\" campaign from Amazon Pinpoint." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "s3_resource = boto3.resource('s3')\n", "\n", "csv_buffer = cohort_df.to_csv(None, index=False).encode()\n", "s3_object = s3_resource.Object(S3_BUCKET, PINPOINT_ENDPOINT_DIR+PINPOINT_ENDPOINT_DATA)\n", "s3_object.put(Body=csv_buffer)" ] } ], "metadata": { "kernelspec": { "display_name": "conda_tensorflow_p36", "language": "python", "name": "conda_tensorflow_p36" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }