#!/usr/bin/env python # coding: utf-8 # Deep Learning Models -- A collection of various deep learning architectures, models, and tips for TensorFlow and PyTorch in Jupyter Notebooks. # - Author: Sebastian Raschka # - GitHub Repository: https://github.com/rasbt/deeplearning-models # In[1]: get_ipython().run_line_magic('load_ext', 'watermark') get_ipython().run_line_magic('watermark', "-a 'Sebastian Raschka' -v -p tensorflow") # # Model Zoo -- Logistic Regression # Implementation of *classic* logistic regression for binary class labels. # In[2]: get_ipython().run_line_magic('matplotlib', 'inline') import matplotlib.pyplot as plt import numpy as np from io import BytesIO ########################## ### DATASET ########################## ds = np.lib.DataSource() fp = ds.open('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data') x = np.genfromtxt(BytesIO(fp.read().encode()), delimiter=',', usecols=range(2), max_rows=100) y = np.zeros(100) y[50:] = 1 np.random.seed(1) idx = np.arange(y.shape[0]) np.random.shuffle(idx) x_test, y_test = x[idx[:25]], y[idx[:25]] x_train, y_train = x[idx[25:]], y[idx[25:]] mu, std = np.mean(x_train, axis=0), np.std(x_train, axis=0) x_train, x_test = (x_train - mu) / std, (x_test - mu) / std fig, ax = plt.subplots(1, 2, figsize=(7, 2.5)) ax[0].scatter(x_train[y_train == 1, 0], x_train[y_train == 1, 1]) ax[0].scatter(x_train[y_train == 0, 0], x_train[y_train == 0, 1]) ax[1].scatter(x_test[y_test == 1, 0], x_test[y_test == 1, 1]) ax[1].scatter(x_test[y_test == 0, 0], x_test[y_test == 0, 1]) plt.show() # In[3]: ########################## ### HELPER FUNCTIONS ########################## def iterate_minibatches(arrays, batch_size, shuffle=False, seed=None): rgen = np.random.RandomState(seed) indices = np.arange(arrays[0].shape[0]) if shuffle: rgen.shuffle(indices) for start_idx in range(0, indices.shape[0] - batch_size + 1, batch_size): index_slice = indices[start_idx:start_idx + batch_size] yield (ary[index_slice] for ary in arrays) # In[4]: import tensorflow as tf ########################## ### SETTINGS ########################## n_features = x.shape[1] n_samples = x.shape[0] learning_rate = 0.05 training_epochs = 15 batch_size = 10 ########################## ### GRAPH DEFINITION ########################## g = tf.Graph() with g.as_default() as g: # Input data tf_x = tf.placeholder(dtype=tf.float32, shape=[None, n_features], name='inputs') tf_y = tf.placeholder(dtype=tf.float32, shape=[None], name='targets') # Model parameters params = { 'weights': tf.Variable(tf.zeros(shape=[n_features, 1], dtype=tf.float32), name='weights'), 'bias': tf.Variable([[0.]], dtype=tf.float32, name='bias')} # Logistic Regression linear = tf.matmul(tf_x, params['weights']) + params['bias'] pred_proba = tf.sigmoid(linear, name='predict_probas') # Loss and optimizer r = tf.reshape(pred_proba, [-1]) cost = tf.reduce_mean(tf.reduce_sum((-tf_y * tf.log(r)) - ((1. - tf_y) * tf.log(1. - r))), name='cost') optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate) train = optimizer.minimize(cost, name='train') # Class prediction pred_labels = tf.round(tf.reshape(pred_proba, [-1]), name='predict_labels') correct_prediction = tf.equal(tf_y, pred_labels) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32), name='accuracy') ########################## ### TRAINING & EVALUATION ########################## with tf.Session(graph=g) as sess: sess.run(tf.global_variables_initializer()) avg_cost = np.nan count = 1 for epoch in range(training_epochs): train_acc = sess.run('accuracy:0', feed_dict={tf_x: x_train, tf_y: y_train}) valid_acc = sess.run('accuracy:0', feed_dict={tf_x: x_test, tf_y: y_test}) print("Epoch: %03d | AvgCost: %.3f" % (epoch, avg_cost / count), end="") print(" | Train/Valid ACC: %.2f/%.2f" % (train_acc, valid_acc)) avg_cost = 0. for x_batch, y_batch in iterate_minibatches(arrays=[x_train, y_train], batch_size=batch_size, shuffle=True, seed=123): feed_dict = {'inputs:0': x_batch, 'targets:0': y_batch} _, c = sess.run(['train', 'cost:0'], feed_dict=feed_dict) avg_cost += c count += 1 weights, bias = sess.run(['weights:0', 'bias:0']) print('\nWeights:\n', weights) print('\nBias:\n', bias)