-
Notifications
You must be signed in to change notification settings - Fork 0
/
SMS_keras_script.py
86 lines (67 loc) · 3.07 KB
/
SMS_keras_script.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import numpy as np
import os
import tensorflow as tf
import pandas
import json
from tensorflow.python.estimator.export.export import build_raw_serving_input_receiver_fn
from tensorflow.python.estimator.export.export_output import PredictOutput
INPUT_TENSOR_NAME = 'inputs'
SIGNATURE_NAME = "serving_default"
LEARNING_RATE = 0.01
def model_fn(features, labels, mode, params):
first_hidden_layer = tf.keras.layers.Dense(16, activation='relu', name='input-layer')(features[INPUT_TENSOR_NAME])
second_hidden_layer = tf.keras.layers.Dense(16, activation='relu', name='first-layer')(first_hidden_layer)
output_layer = tf.keras.layers.Dense(1, activation='sigmoid', name='output-layer')(second_hidden_layer)
predictions = output_layer
# Provide an estimator spec for `ModeKeys.PREDICT`.
if mode == tf.estimator.ModeKeys.PREDICT:
return tf.estimator.EstimatorSpec(
mode=mode,
predictions={"spam": predictions},
export_outputs={SIGNATURE_NAME: PredictOutput({"spam": predictions})})
# 2. Define the loss function for training/evaluation using Tensorflow.
loss = tf.losses.log_loss(labels, predictions)
# 3. Define the training operation/optimizer using Tensorflow operation/optimizer.
train_op = tf.contrib.layers.optimize_loss(
loss=loss,
global_step=tf.contrib.framework.get_global_step(),
learning_rate=LEARNING_RATE,
optimizer="SGD")
# 4. Generate predictions as Tensorflow tensors.
predictions_dict = {"spam": predictions}
eval_metric_ops = {
"accuracy": tf.metrics.accuracy(
labels, predictions)
}
# Provide an estimator spec for `ModeKeys.EVAL` and `ModeKeys.TRAIN` modes.
return tf.estimator.EstimatorSpec(
mode=mode,
loss=loss,
train_op=train_op,
eval_metric_ops=eval_metric_ops)
#def keras_model_fn(hyperparameters):
# model = tf.keras.models.Sequential()
# model.add(tf.keras.layers.Dense(16, activation='relu',input_shape=(9013,), name='inputs'))
# model.add(tf.keras.layers.Dense(16, activation='relu'))
# model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
# model.compile(loss='binary_crossentropy',
# optimizer='rmsprop',
# metrics=['accuracy'])
# return model
def train_input_fn(training_dir, params):
return _input_fn(training_dir, 'sms_train_set.gz')
def eval_input_fn(training_dir, params):
return _input_fn(training_dir, 'sms_test_set.gz')
def _input_fn(training_dir, training_filename):
df = pandas.read_csv(os.path.join(training_dir, training_filename))
X = df[df.columns[1:]].values.astype(dtype=np.float32)
# Reshaping labels as expected by TF
y = df[df.columns[0]].values.reshape((-1, 1)).astype(dtype=np.float32)
return tf.estimator.inputs.numpy_input_fn(
x={INPUT_TENSOR_NAME: X},
y=y,
num_epochs=None,
shuffle=True)()
def serving_input_fn(params):
tensor = tf.placeholder(tf.float32, shape=[1, 9013])
return build_raw_serving_input_receiver_fn({INPUT_TENSOR_NAME: tensor})()