-
Notifications
You must be signed in to change notification settings - Fork 22
/
neural-net-tf.py
131 lines (110 loc) · 4.29 KB
/
neural-net-tf.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import numpy as np
import tensorflow as tf
from getEmbeddings import getEmbeddings
import matplotlib.pyplot as plt
import scikitplot.plotters as skplt
import pickle
import os.path
IN_DIM = 300
CLASS_NUM = 2
LEARN_RATE = 0.0001
TRAIN_STEP = 20000
tensorflow_tmp = "tmp_tensorflow/three_layer2"
def plot_cmat(yte, ypred):
'''Plotting confusion matrix'''
skplt.plot_confusion_matrix(yte,ypred)
plt.show()
def dummy_input_fn():
return np.array([1.0] * IN_DIM)
def model_fn(features, labels, mode):
"""The model function for tf.Estimator"""
# Input layer
input_layer = tf.reshape(features["x"], [-1, IN_DIM])
# Dense layer1
dense1 = tf.layers.dense(inputs=input_layer, units=300, \
activation=tf.nn.relu)
# Dropout layer1
dropout1 = tf.layers.dropout(inputs=dense1, rate=0.4, \
training=(mode == tf.estimator.ModeKeys.TRAIN))
# Dense layer2
dense2 = tf.layers.dense(inputs=dropout1, units=300, \
activation=tf.nn.relu)
# Dropout layer2
dropout2 = tf.layers.dropout(inputs=dense2, rate=0.4, \
training=(mode == tf.estimator.ModeKeys.TRAIN))
# Dense layer3
dense3 = tf.layers.dense(inputs=dropout2, units=300, \
activation=tf.nn.relu)
# Dropout layer3
dropout3 = tf.layers.dropout(inputs=dense3, rate=0.4, \
training=(mode == tf.estimator.ModeKeys.TRAIN))
# Logits layer
logits = tf.layers.dense(inputs=dropout3, units=CLASS_NUM)
# prediction result in PREDICT and EVAL phases
predictions = {
# Class id
"classes": tf.argmax(input=logits, axis=1),
# Probabilities
"probabilities": tf.nn.softmax(logits, name="softmax_tensor")
}
if mode == tf.estimator.ModeKeys.PREDICT:
return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
# Calculate Loss for TRAIN and EVAL
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
# Configure the training Op
if mode == tf.estimator.ModeKeys.TRAIN:
optimizer = tf.train.GradientDescentOptimizer(learning_rate=LEARN_RATE)
train_op = optimizer.minimize(\
loss=loss, global_step=tf.train.get_global_step())
return tf.estimator.EstimatorSpec(\
mode=mode, loss=loss, train_op=train_op)
# Add evaluation metrics
eval_metric_ops = {
"accuracy": tf.metrics.accuracy(\
labels=labels, predictions=predictions["classes"])
}
return tf.estimator.EstimatorSpec(\
mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
def main():
# Get the training and testing data from getEmbeddings
train_data, eval_data, train_labels, eval_labels = \
getEmbeddings("datasets/train.csv")
train_labels = train_labels.reshape((-1, 1)).astype(np.int32)
eval_labels = eval_labels.reshape((-1, 1)).astype(np.int32)
# Create the Estimator
classifier = \
tf.estimator.Estimator(model_fn=model_fn, model_dir=tensorflow_tmp)
# Setup logging hook for prediction
tf.logging.set_verbosity(tf.logging.INFO)
tensors_to_log = {"probabilities": "softmax_tensor"}
logging_hook = tf.train.LoggingTensorHook(
tensors=tensors_to_log, every_n_iter=200)
# Train the model
train_input_fn = tf.estimator.inputs.numpy_input_fn(
x={"x": train_data},
y=train_labels,
batch_size=50,
num_epochs=None,
shuffle=True)
classifier.train(
input_fn=train_input_fn,
steps=TRAIN_STEP,
hooks=[logging_hook])
# Evaluate the model and print results
eval_input_fn = tf.estimator.inputs.numpy_input_fn(
x={"x": eval_data},
y=eval_labels,
num_epochs=1,
shuffle=False)
eval_results = classifier.evaluate(input_fn=eval_input_fn)
print(eval_results) # 81.42%
# Draw the confusion matrix
predict_input_fn = tf.estimator.inputs.numpy_input_fn(
x={"x": eval_data},
num_epochs=1,
shuffle=False)
predict_results = classifier.predict(input_fn=predict_input_fn)
predict_labels = [label["classes"] for label in predict_results]
plot_cmat(eval_labels, predict_labels)
if __name__ == "__main__":
main()