Skip to content

Batches and epochs #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 27 additions & 6 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
saver = tf.train.Saver(variables)
saver.restore(sess, "wine_quality/data/softmax_regression.ckpt")
def simple(x1):
return sess.run(y1, feed_dict={x: x1})
return sess.run(y1, feed_dict={x: x1}).flatten().tolist()


csrf = CsrfProtect()
Expand All @@ -48,11 +48,30 @@ def hello_world():
def test_parameters():
form = TestParameterForm(request.form)
if request.method == 'POST' and form.validate():
volatile_acidity = float(form.volatile_acidity.data)
citric_acid = float(form.citric_acid.data)
residual_sugar = float(form.residual_sugar.data)
chlorides = float(form.chlorides.data)
free_sulfur_dioxide = float(form.free_sulfur_dioxide.data)
total_sulfur_dioxide = float(form.total_sulfur_dioxide.data)
density = float(form.density.data)
ph = float(form.ph.data)
sulphates = float(form.sulphates.data)
alcohol = float(form.alcohol.data)
input_list = [volatile_acidity, citric_acid, residual_sugar, chlorides, free_sulfur_dioxide,
total_sulfur_dioxide, density, ph, sulphates, alcohol]
print(form.__dict__)
# VALUES TO USE: [0.7, 0, 1.9, 0.076, 11, 34, 0.99780, 3.51, 0.56, 9.4]
# simple([[0.7, 0, 1.9, 0.076, 11, 34, 0.99780, 3.51, 0.56, 9.4]])
results = simple([[0.7, 0, 1.9, 0.076, 11, 34, 0.99780, 3.51, 0.56, 9.4]])
return render_template('test_parameters.html', form=form, result=results[0])
return render_template('test_parameters.html', form=form)
# results = simple([[0.7, 0, 1.9, 0.076, 11, 34, 0.99780, 3.51, 0.56, 9.4]]) # Bad wine
# results = simple([[0.35, 0.46, 3.6, 0.078, 15, 37, 0.99730, 3.35, 0.86, 12.8]]) # Good wine
results = simple([input_list])
# return render_template('test_parameters.html', form=form, result=results)
print(results)
else:
results = None

return render_template('test_parameters.html', form=form, result=results)


@app.route('/train/', methods=('GET', 'POST'))
Expand All @@ -66,8 +85,10 @@ def upload():
print(form.__dict__)
# Save to Redis here
form.training_data.data.save('wine_quality/data/' + filename)
dataframe = pd.read_csv('wine_quality/data/' + filename, sep=';')
train_model(dataframe, learning_rate, batch_size)
dataframe = pd.read_csv('wine_quality/data/' + filename, sep=',')
model_log = train_model(dataframe, learning_rate, batch_size)
return render_template('test_data_upload.html', form=form, filename=filename, model_log=model_log,
learning_rate=learning_rate, batch_size=batch_size)
else:
filename = None
return render_template('test_data_upload.html', form=form, filename=filename)
Expand Down
74 changes: 60 additions & 14 deletions templates/test_data_upload.html
Original file line number Diff line number Diff line change
@@ -1,19 +1,65 @@
<head></head>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Model Training</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>

<div>
<h2>Input</h2>
{% from "_formhelpers.html" import render_field %}
<form method=post action="/train/" enctype="multipart/form-data">
{{ form.csrf_token }}
<dl>
{{ render_field(form.training_data ) }}
{{ render_field(form.learning_rate ) }}
{{ render_field(form.batch_size ) }}
{{ render_field(form.model_name ) }}
</dl>
<p><input type=submit value=Submit>
</form>
<nav class="navbar navbar-inverse">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="/test"></a>
</div>
<ul class="nav navbar-nav">
<li><a href="/test">Home</a></li>
<li class="active"><a href="/train">Training Page</a></li>
</ul>
</div>
</nav>

<div class="container-fluid">
<div style="color:white; background:#8181F7 !important" class="jumbotron">
<h1>Model Training</h1>
<p>Load a csv with your wine data set. Then choose a learning rate, batch size and output model name. Press submit
to train the model.</p>
</div>

<div class="row">
<div class="col-sm-4">
<h2>Input</h2>
{% from "_formhelpers.html" import render_field %}
<form method=post action="/train/" enctype="multipart/form-data">
{{ form.csrf_token }}
<dl>
{{ render_field(form.training_data ) }}
{{ render_field(form.learning_rate ) }}
{{ render_field(form.batch_size ) }}
{{ render_field(form.model_name ) }}
</dl>
<p><input type=submit value=Submit>
</form>
</div>

<div class="col-sm-8">
{% if model_log %}
<h2>Model</h2>
<h3>Training Parameters</h3>
<p>Learning rate = {{ learning_rate }}</p>
<p>Batch size = {{ batch_size}}</p>
<h3>Model Training Log</h3>
<p>
{% for log_entry in model_log %}
{{ log_entry }}<br>
{% endfor %}
</p>
{% endif %}
</div>
</div>
</div>
</body>

81 changes: 57 additions & 24 deletions templates/test_parameters.html
Original file line number Diff line number Diff line change
@@ -1,29 +1,62 @@
<head></head>
<head>
<title>Fit Model</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>

<body>

<div>
<h2>Input</h2>
{% from "_formhelpers.html" import render_field %}
<form method=post action="/test/">
{{ form.csrf_token }}
<dl>
{{ render_field(form.alcohol ) }}
{{ render_field(form.volatile_acidity ) }}
{{ render_field(form.citric_acid ) }}
{{ render_field(form.residual_sugar ) }}
{{ render_field(form.chlorides ) }}
{{ render_field(form.free_sulfur_dioxide ) }}
{{ render_field(form.total_sulfur_dioxide) }}
{{ render_field(form.density ) }}
{{ render_field(form.ph ) }}
{{ render_field(form.sulphates ) }}
</dl>
<p><input type=submit value=Submit>
</form>
</div>
<div>
<h2>Result</h2>
<p>{{result}}</p>
<nav class="navbar navbar-inverse">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="/test"></a>
</div>
<ul class="nav navbar-nav">
<li class="active"><a href="/test">Home</a></li>
<li><a href="/train">Training Page</a></li>
</ul>
</div>
</nav>

<div class="container-fluid">

<div style="color:white; background:#8181F7 !important" class="jumbotron">
<h1>Wine Quality Tester</h1>
<p>Enter the chemical properties for your wine below. Press submit to discover whether your wine is of good or
bad quality</p>
</div>

<div class="row">
<div class="col-sm-4">
<h2>Input</h2>
{% from "_formhelpers.html" import render_field %}
<form method=post action="/test/">
{{ form.csrf_token }}
<dl>
{{ render_field(form.volatile_acidity ) }}
{{ render_field(form.citric_acid ) }}
{{ render_field(form.residual_sugar ) }}
{{ render_field(form.chlorides ) }}
{{ render_field(form.free_sulfur_dioxide ) }}
{{ render_field(form.total_sulfur_dioxide) }}
{{ render_field(form.density ) }}
{{ render_field(form.ph ) }}
{{ render_field(form.sulphates ) }}
{{ render_field(form.alcohol ) }}
</dl>
<p><input type=submit value=Submit>
</form>
</div>

<div class="col-sm-4">
{% if result %}
<h2>Result</h2>
<p>Prediction accuracy: {{ result[0] }}</p>
{% endif %}
</div>
</div>
</div>
</body>
47 changes: 33 additions & 14 deletions wine_quality/training.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,17 +42,15 @@ def train_model(training_df, learning_rate=0.001, batch_size=126):
bins = [3, 5, 8]
red_wine_newcats['category'] = pd.cut(red_wine_newcats.quality, bins, labels=['Bad', 'Good'], include_lowest=True)


y_red_wine = red_wine_newcats[['category']].get_values()
# Removing fixed_acidity and quality
X_red_wine = red_wine_newcats.iloc[:,1:-2].get_values()

y_red_wine_raveled = y_red_wine.ravel()
y_red_wine_integers = [y.replace('Bad', '1') for y in y_red_wine_raveled]
y_red_wine_integers = [y.replace('Good', '0') for y in y_red_wine_integers]
y_red_wine_integers = [y.replace('Bad', '0') for y in y_red_wine_raveled]
y_red_wine_integers = [y.replace('Good', '1') for y in y_red_wine_integers]
y_red_wine_integers = [np.int(y) for y in y_red_wine_integers]


y_one_hot = _dense_to_one_hot(y_red_wine_integers, num_classes=2)

X_train, X_test, y_train, y_test = train_test_split(X_red_wine, y_one_hot, test_size=0.2, random_state=42)
Expand All @@ -70,18 +68,39 @@ def train_model(training_df, learning_rate=0.001, batch_size=126):
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

saver = tf.train.Saver(variables)
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
for i in range(100):
average_cost = 0
number_of_batches = int(len(X_train) / batch_size)
for start, end in zip(range(0, len(X_train), batch_size), range(batch_size, len(X_train), batch_size)):
sess.run(optimizer, feed_dict={X: X_train[start:end], y_: y_train[start:end]})
# Compute average loss
average_cost += sess.run(cost, feed_dict={X: X_train[start:end], y_: y_train[start:end]}) / number_of_batches
print(sess.run(accuracy, feed_dict={X: X_test, y_: y_test}))
with tf.Session() as sess:

sess.run(init)
log_list = [] # List to store logging of model progress
for i in range(100):
average_cost = 0
number_of_batches = int(len(X_train) / batch_size)
for start, end in zip(range(0, len(X_train), batch_size), range(batch_size, len(X_train), batch_size)):
sess.run(optimizer, feed_dict={X: X_train[start:end], y_: y_train[start:end]})
# Compute average loss
average_cost += sess.run(cost,
feed_dict={X: X_train[start:end],
y_: y_train[start:end]}) / number_of_batches
if i % 10 == 0:
print("Epoch:", '%04d' % (i + 1), "cost=", "{:.9f}".format(average_cost))
log_cost = "Epoch {:d}: cost = {:.9f}".format(i + 1, average_cost)
# print(log_cost)
log_list.append(log_cost)

print("Accuracy: {0}".format(sess.run(accuracy, feed_dict={X: X_test, y_: y_test})))
log_accuracy = "Accuracy: {0}".format(sess.run(accuracy, feed_dict={X: X_test, y_: y_test}))
# print(log_accuracy)
log_list.append(log_accuracy)

path = saver.save(sess, os.path.join(os.path.dirname(__file__), "data/softmax_regression.ckpt"))
print("Saved:", path)
# log_list.append("Saved: "+path)

print("")
print(log_list)

return log_list

# df = pd.read_csv('data/winequality-red.csv', sep=',')
# train_model(df)