neural network for binary classification

 import numpy as np

import tensorflow as tf

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense

import matplotlib.pyplot as plt

from autils import *

%matplotlib inline


import logging

logging.getLogger("tensorflow").setLevel(logging.ERROR)

tf.autograph.set_verbosity(0)

# load dataset

X, y = load_data()

print ('The shape of X is: ' + str(X.shape))

print ('The shape of y is: ' + str(y.shape))

import warnings

warnings.simplefilter(action='ignore', category=FutureWarning)

# You do not need to modify anything in this cell


m, n = X.shape


fig, axes = plt.subplots(8,8, figsize=(8,8))

fig.tight_layout(pad=0.1)


for i,ax in enumerate(axes.flat):

    # Select random indices

    random_index = np.random.randint(m)

    

    # Select rows corresponding to the random indices and

    # reshape the image

    X_random_reshaped = X[random_index].reshape((20,20)).T

    

    # Display the image

    ax.imshow(X_random_reshaped, cmap='gray')

    

    # Display the label above the image

    ax.set_title(y[random_index,0])

    ax.set_axis_off()


model = Sequential(

    [               

        tf.keras.Input(shape=(400,)),    #specify input size

        ### START CODE HERE ### 

        Dense(25, activation = 'sigmoid'),

        Dense(15, activation = 'sigmoid'),

        Dense(1, activation = 'sigmoid')

        ### END CODE HERE ### 

    ], name = "my_model" 

)  

model.summary()

# UNIT TESTS

from public_tests import *


test_c1(model)

L1_num_params = 400 * 25 + 25  # W1 parameters  + b1 parameters

L2_num_params = 25 * 15 + 15   # W2 parameters  + b2 parameters

L3_num_params = 15 * 1 + 1     # W3 parameters  + b3 parameters

print("L1 params = ", L1_num_params, ", L2 params = ", L2_num_params, ",  L3 params = ", L3_num_params )

[layer1, layer2, layer3] = model.layers

#### Examine Weights shapes

W1,b1 = layer1.get_weights()

W2,b2 = layer2.get_weights()

W3,b3 = layer3.get_weights()

print(f"W1 shape = {W1.shape}, b1 shape = {b1.shape}")

print(f"W2 shape = {W2.shape}, b2 shape = {b2.shape}")

print(f"W3 shape = {W3.shape}, b3 shape = {b3.shape}")

model.compile(

    loss=tf.keras.losses.BinaryCrossentropy(),

    optimizer=tf.keras.optimizers.Adam(0.001),

)


model.fit(

    X,y,

    epochs=20

)

prediction = model.predict(X[0].reshape(1,400))  # a zero

print(f" predicting a zero: {prediction}")

prediction = model.predict(X[500].reshape(1,400))  # a one

print(f" predicting a one:  {prediction}")

if prediction >= 0.5:

    yhat = 1

else:

    yhat = 0

print(f"prediction after threshold: {yhat}")

import warnings

warnings.simplefilter(action='ignore', category=FutureWarning)

# You do not need to modify anything in this cell


m, n = X.shape


fig, axes = plt.subplots(8,8, figsize=(8,8))

fig.tight_layout(pad=0.1,rect=[0, 0.03, 1, 0.92]) #[left, bottom, right, top]


for i,ax in enumerate(axes.flat):

    # Select random indices

    random_index = np.random.randint(m)

    

    # Select rows corresponding to the random indices and

    # reshape the image

    X_random_reshaped = X[random_index].reshape((20,20)).T

    

    # Display the image

    ax.imshow(X_random_reshaped, cmap='gray')

    

    # Predict using the Neural Network

    prediction = model.predict(X[random_index].reshape(1,400))

    if prediction >= 0.5:

        yhat = 1

    else:

        yhat = 0

    

    # Display the label above the image

    ax.set_title(f"{y[random_index,0]},{yhat}")

    ax.set_axis_off()

fig.suptitle("Label, yhat", fontsize=16)

plt.show()

def my_dense(a_in, W, b, g):

    """

    Computes dense layer

    Args:

      a_in (ndarray (n, )) : Data, 1 example 

      W    (ndarray (n,j)) : Weight matrix, n features per unit, j units

      b    (ndarray (j, )) : bias vector, j units  

      g    activation function (e.g. sigmoid, relu..)

    Returns

      a_out (ndarray (j,))  : j units

    """

    units = W.shape[1]

    a_out = np.zeros(units)

### START CODE HERE ### 

    for j in range(units):

        w = W[:, j]

        z = np.dot(w, a_in) + b[j]

        a_out[j] = g(z)

        

### END CODE HERE ### 

    return(a_out)

x_tst = 0.1*np.arange(1,3,1).reshape(2,)  # (1 examples, 2 features)

W_tst = 0.1*np.arange(1,7,1).reshape(2,3) # (2 input features, 3 output features)

b_tst = 0.1*np.arange(1,4,1).reshape(3,)  # (3 features)

A_tst = my_dense(x_tst, W_tst, b_tst, sigmoid)

print(A_tst)

def my_sequential(x, W1, b1, W2, b2, W3, b3):

    a1 = my_dense(x,  W1, b1, sigmoid)

    a2 = my_dense(a1, W2, b2, sigmoid)

    a3 = my_dense(a2, W3, b3, sigmoid)

    return(a3)

# make predictions

prediction = my_sequential(X[0], W1_tmp, b1_tmp, W2_tmp, b2_tmp, W3_tmp, b3_tmp )

if prediction >= 0.5:

    yhat = 1

else:

    yhat = 0

print( "yhat = ", yhat, " label= ", y[0,0])

prediction = my_sequential(X[500], W1_tmp, b1_tmp, W2_tmp, b2_tmp, W3_tmp, b3_tmp )

if prediction >= 0.5:

    yhat = 1

else:

    yhat = 0

print( "yhat = ", yhat, " label= ", y[500,0])

import warnings

warnings.simplefilter(action='ignore', category=FutureWarning)

# You do not need to modify anything in this cell


m, n = X.shape


fig, axes = plt.subplots(8,8, figsize=(8,8))

fig.tight_layout(pad=0.1,rect=[0, 0.03, 1, 0.92]) #[left, bottom, right, top]


for i,ax in enumerate(axes.flat):

    # Select random indices

    random_index = np.random.randint(m)

    

    # Select rows corresponding to the random indices and

    # reshape the image

    X_random_reshaped = X[random_index].reshape((20,20)).T

    

    # Display the image

    ax.imshow(X_random_reshaped, cmap='gray')


    # Predict using the Neural Network implemented in Numpy

    my_prediction = my_sequential(X[random_index], W1_tmp, b1_tmp, W2_tmp, b2_tmp, W3_tmp, b3_tmp )

    my_yhat = int(my_prediction >= 0.5)


    # Predict using the Neural Network implemented in Tensorflow

    tf_prediction = model.predict(X[random_index].reshape(1,400))

    tf_yhat = int(tf_prediction >= 0.5)

    

    # Display the label above the image

    ax.set_title(f"{y[random_index,0]},{tf_yhat},{my_yhat}")

    ax.set_axis_off() 

fig.suptitle("Label, yhat Tensorflow, yhat Numpy", fontsize=16)

plt.show()

x = X[0].reshape(-1,1)         # column vector (400,1)

z1 = np.matmul(x.T,W1) + b1    # (1,400)(400,25) = (1,25)

a1 = sigmoid(z1)

print(a1.shape)

def my_dense_v(A_in, W, b, g):

    """

    Computes dense layer

    Args:

      A_in (ndarray (m,n)) : Data, m examples, n features each

      W    (ndarray (n,j)) : Weight matrix, n features per unit, j units

      b    (ndarray (1,j)) : bias vector, j units  

      g    activation function (e.g. sigmoid, relu..)

    Returns

      A_out (tf.Tensor or ndarray (m,j)) : m examples, j units

    """

### START CODE HERE ### 

    z = np.matmul(A_in, W) + b

    A_out = g(z) 

    

### END CODE HERE ### 

    return(A_out)

X_tst = 0.1*np.arange(1,9,1).reshape(4,2) # (4 examples, 2 features)

W_tst = 0.1*np.arange(1,7,1).reshape(2,3) # (2 input features, 3 output features)

b_tst = 0.1*np.arange(1,4,1).reshape(1,3) # (1,3 features)

A_tst = my_dense_v(X_tst, W_tst, b_tst, sigmoid)

print(A_tst)

def my_sequential_v(X, W1, b1, W2, b2, W3, b3):

    A1 = my_dense_v(X,  W1, b1, sigmoid)

    A2 = my_dense_v(A1, W2, b2, sigmoid)

    A3 = my_dense_v(A2, W3, b3, sigmoid)

    return(A3)

W1_tmp,b1_tmp = layer1.get_weights()

W2_tmp,b2_tmp = layer2.get_weights()

W3_tmp,b3_tmp = layer3.get_weights()

import warnings

warnings.simplefilter(action='ignore', category=FutureWarning)

# You do not need to modify anything in this cell


m, n = X.shape


fig, axes = plt.subplots(8, 8, figsize=(8, 8))

fig.tight_layout(pad=0.1, rect=[0, 0.03, 1, 0.92]) #[left, bottom, right, top]


for i, ax in enumerate(axes.flat):

    # Select random indices

    random_index = np.random.randint(m)

    

    # Select rows corresponding to the random indices and

    # reshape the image

    X_random_reshaped = X[random_index].reshape((20, 20)).T

    

    # Display the image

    ax.imshow(X_random_reshaped, cmap='gray')

   

    # Display the label above the image

    ax.set_title(f"{y[random_index,0]}, {Yhat[random_index, 0]}")

    ax.set_axis_off() 

fig.suptitle("Label, Yhat", fontsize=16)

plt.show()



Yorumlar