119 KiB
119 KiB
In [1]:
%matplotlib inline
import numpy as np
import math
from scipy import signal
import matplotlib.pyplot as plt
# number of points
n = 500
# start and final times
t0 = 0.0
tn = 1.0
# Period
t = np.linspace(t0, tn, n, endpoint=False)
SqrSignal = np.zeros(n)
SqrSignal = 1.0+signal.square(2*np.pi*5*t)
plt.plot(t, SqrSignal)
plt.ylim(-0.5, 2.5)
plt.show()In [2]:
import numpy as np
import math
from scipy import signal
import matplotlib.pyplot as plt
# number of points
n = 500
# start and final times
t0 = 0.0
tn = 1.0
# Period
T =0.2
# Max value of square signal
Fmax= 2.0
# Width of signal
Width = 0.1
t = np.linspace(t0, tn, n, endpoint=False)
SqrSignal = np.zeros(n)
FourierSeriesSignal = np.zeros(n)
SqrSignal = 1.0+signal.square(2*np.pi*5*t+np.pi*Width/T)
a0 = Fmax*Width/T
FourierSeriesSignal = a0
Factor = 2.0*Fmax/np.pi
for i in range(1,500):
FourierSeriesSignal += Factor/(i)*np.sin(np.pi*i*Width/T)*np.cos(i*t*2*np.pi/T)
plt.plot(t, SqrSignal)
plt.plot(t, FourierSeriesSignal)
plt.ylim(-0.5, 2.5)
plt.show()In [3]:
# import necessary packages
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
# ensure the same random numbers appear every time
np.random.seed(0)
# display images in notebook
%matplotlib inline
plt.rcParams['figure.figsize'] = (12,12)
# download MNIST dataset
digits = datasets.load_digits()
# define inputs and labels
inputs = digits.images
labels = digits.target
# RGB images have a depth of 3
# our images are grayscale so they should have a depth of 1
inputs = inputs[:,:,:,np.newaxis]
print("inputs = (n_inputs, pixel_width, pixel_height, depth) = " + str(inputs.shape))
print("labels = (n_inputs) = " + str(labels.shape))
# choose some random images to display
n_inputs = len(inputs)
indices = np.arange(n_inputs)
random_indices = np.random.choice(indices, size=5)
for i, image in enumerate(digits.images[random_indices]):
plt.subplot(1, 5, i+1)
plt.axis('off')
plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
plt.title("Label: %d" % digits.target[random_indices[i]])
plt.show()inputs = (n_inputs, pixel_width, pixel_height, depth) = (1797, 8, 8, 1) labels = (n_inputs) = (1797,)
In [4]:
from tensorflow.keras import datasets, layers, models
from tensorflow.keras.layers import Input
from tensorflow.keras.models import Sequential #This allows appending layers to existing models
from tensorflow.keras.layers import Dense #This allows defining the characteristics of a particular layer
from tensorflow.keras import optimizers #This allows using whichever optimiser we want (sgd,adam,RMSprop)
from tensorflow.keras import regularizers #This allows using whichever regularizer we want (l1,l2,l1_l2)
from tensorflow.keras.utils import to_categorical #This allows using categorical cross entropy as the cost function
#from tensorflow.keras import Conv2D
#from tensorflow.keras import MaxPooling2D
#from tensorflow.keras import Flatten
from sklearn.model_selection import train_test_split
# representation of labels
labels = to_categorical(labels)
# split into train and test data
# one-liner from scikit-learn library
train_size = 0.8
test_size = 1 - train_size
X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,
test_size=test_size)In [5]:
def create_convolutional_neural_network_keras(input_shape, receptive_field,
n_filters, n_neurons_connected, n_categories,
eta, lmbd):
model = Sequential()
model.add(layers.Conv2D(n_filters, (receptive_field, receptive_field), input_shape=input_shape, padding='same',
activation='relu', kernel_regularizer=regularizers.l2(lmbd)))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(n_neurons_connected, activation='relu', kernel_regularizer=regularizers.l2(lmbd)))
model.add(layers.Dense(n_categories, activation='softmax', kernel_regularizer=regularizers.l2(lmbd)))
sgd = optimizers.SGD(lr=eta)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
return model
epochs = 100
batch_size = 100
input_shape = X_train.shape[1:4]
receptive_field = 3
n_filters = 10
n_neurons_connected = 50
n_categories = 10
eta_vals = np.logspace(-5, 1, 7)
lmbd_vals = np.logspace(-5, 1, 7)In [6]:
CNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
for i, eta in enumerate(eta_vals):
for j, lmbd in enumerate(lmbd_vals):
CNN = create_convolutional_neural_network_keras(input_shape, receptive_field,
n_filters, n_neurons_connected, n_categories,
eta, lmbd)
CNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0)
scores = CNN.evaluate(X_test, Y_test)
CNN_keras[i][j] = CNN
print("Learning rate = ", eta)
print("Lambda = ", lmbd)
print("Test accuracy: %.3f" % scores[1])
print()/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/keras/src/layers/convolutional/base_conv.py:107: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead. super().__init__(activity_regularizer=activity_regularizer, **kwargs)
[0;31m---------------------------------------------------------------------------[0m
[0;31mValueError[0m Traceback (most recent call last)
Cell [0;32mIn[6], line 5[0m
[1;32m 3[0m [38;5;28;01mfor[39;00m i, eta [38;5;129;01min[39;00m [38;5;28menumerate[39m(eta_vals):
[1;32m 4[0m [38;5;28;01mfor[39;00m j, lmbd [38;5;129;01min[39;00m [38;5;28menumerate[39m(lmbd_vals):
[0;32m----> 5[0m CNN [38;5;241m=[39m [43mcreate_convolutional_neural_network_keras[49m[43m([49m[43minput_shape[49m[43m,[49m[43m [49m[43mreceptive_field[49m[43m,[49m
[1;32m 6[0m [43m [49m[43mn_filters[49m[43m,[49m[43m [49m[43mn_neurons_connected[49m[43m,[49m[43m [49m[43mn_categories[49m[43m,[49m
[1;32m 7[0m [43m [49m[43meta[49m[43m,[49m[43m [49m[43mlmbd[49m[43m)[49m
[1;32m 8[0m CNN[38;5;241m.[39mfit(X_train, Y_train, epochs[38;5;241m=[39mepochs, batch_size[38;5;241m=[39mbatch_size, verbose[38;5;241m=[39m[38;5;241m0[39m)
[1;32m 9[0m scores [38;5;241m=[39m CNN[38;5;241m.[39mevaluate(X_test, Y_test)
Cell [0;32mIn[5], line 12[0m, in [0;36mcreate_convolutional_neural_network_keras[0;34m(input_shape, receptive_field, n_filters, n_neurons_connected, n_categories, eta, lmbd)[0m
[1;32m 9[0m model[38;5;241m.[39madd(layers[38;5;241m.[39mDense(n_neurons_connected, activation[38;5;241m=[39m[38;5;124m'[39m[38;5;124mrelu[39m[38;5;124m'[39m, kernel_regularizer[38;5;241m=[39mregularizers[38;5;241m.[39ml2(lmbd)))
[1;32m 10[0m model[38;5;241m.[39madd(layers[38;5;241m.[39mDense(n_categories, activation[38;5;241m=[39m[38;5;124m'[39m[38;5;124msoftmax[39m[38;5;124m'[39m, kernel_regularizer[38;5;241m=[39mregularizers[38;5;241m.[39ml2(lmbd)))
[0;32m---> 12[0m sgd [38;5;241m=[39m [43moptimizers[49m[38;5;241;43m.[39;49m[43mSGD[49m[43m([49m[43mlr[49m[38;5;241;43m=[39;49m[43meta[49m[43m)[49m
[1;32m 13[0m model[38;5;241m.[39mcompile(loss[38;5;241m=[39m[38;5;124m'[39m[38;5;124mcategorical_crossentropy[39m[38;5;124m'[39m, optimizer[38;5;241m=[39msgd, metrics[38;5;241m=[39m[[38;5;124m'[39m[38;5;124maccuracy[39m[38;5;124m'[39m])
[1;32m 15[0m [38;5;28;01mreturn[39;00m model
File [0;32m~/miniforge3/envs/myenv/lib/python3.9/site-packages/keras/src/optimizers/sgd.py:60[0m, in [0;36mSGD.__init__[0;34m(self, learning_rate, momentum, nesterov, weight_decay, clipnorm, clipvalue, global_clipnorm, use_ema, ema_momentum, ema_overwrite_frequency, loss_scale_factor, gradient_accumulation_steps, name, **kwargs)[0m
[1;32m 43[0m [38;5;28;01mdef[39;00m [38;5;21m__init__[39m(
[1;32m 44[0m [38;5;28mself[39m,
[1;32m 45[0m learning_rate[38;5;241m=[39m[38;5;241m0.01[39m,
[0;32m (...)[0m
[1;32m 58[0m [38;5;241m*[39m[38;5;241m*[39mkwargs,
[1;32m 59[0m ):
[0;32m---> 60[0m [38;5;28;43msuper[39;49m[43m([49m[43m)[49m[38;5;241;43m.[39;49m[38;5;21;43m__init__[39;49m[43m([49m
[1;32m 61[0m [43m [49m[43mlearning_rate[49m[38;5;241;43m=[39;49m[43mlearning_rate[49m[43m,[49m
[1;32m 62[0m [43m [49m[43mname[49m[38;5;241;43m=[39;49m[43mname[49m[43m,[49m
[1;32m 63[0m [43m [49m[43mweight_decay[49m[38;5;241;43m=[39;49m[43mweight_decay[49m[43m,[49m
[1;32m 64[0m [43m [49m[43mclipnorm[49m[38;5;241;43m=[39;49m[43mclipnorm[49m[43m,[49m
[1;32m 65[0m [43m [49m[43mclipvalue[49m[38;5;241;43m=[39;49m[43mclipvalue[49m[43m,[49m
[1;32m 66[0m [43m [49m[43mglobal_clipnorm[49m[38;5;241;43m=[39;49m[43mglobal_clipnorm[49m[43m,[49m
[1;32m 67[0m [43m [49m[43muse_ema[49m[38;5;241;43m=[39;49m[43muse_ema[49m[43m,[49m
[1;32m 68[0m [43m [49m[43mema_momentum[49m[38;5;241;43m=[39;49m[43mema_momentum[49m[43m,[49m
[1;32m 69[0m [43m [49m[43mema_overwrite_frequency[49m[38;5;241;43m=[39;49m[43mema_overwrite_frequency[49m[43m,[49m
[1;32m 70[0m [43m [49m[43mloss_scale_factor[49m[38;5;241;43m=[39;49m[43mloss_scale_factor[49m[43m,[49m
[1;32m 71[0m [43m [49m[43mgradient_accumulation_steps[49m[38;5;241;43m=[39;49m[43mgradient_accumulation_steps[49m[43m,[49m
[1;32m 72[0m [43m [49m[38;5;241;43m*[39;49m[38;5;241;43m*[39;49m[43mkwargs[49m[43m,[49m
[1;32m 73[0m [43m [49m[43m)[49m
[1;32m 74[0m [38;5;28;01mif[39;00m [38;5;129;01mnot[39;00m [38;5;28misinstance[39m(momentum, [38;5;28mfloat[39m) [38;5;129;01mor[39;00m momentum [38;5;241m<[39m [38;5;241m0[39m [38;5;129;01mor[39;00m momentum [38;5;241m>[39m [38;5;241m1[39m:
[1;32m 75[0m [38;5;28;01mraise[39;00m [38;5;167;01mValueError[39;00m([38;5;124m"[39m[38;5;124m`momentum` must be a float between [0, 1].[39m[38;5;124m"[39m)
File [0;32m~/miniforge3/envs/myenv/lib/python3.9/site-packages/keras/src/backend/tensorflow/optimizer.py:23[0m, in [0;36mTFOptimizer.__init__[0;34m(self, *args, **kwargs)[0m
[1;32m 22[0m [38;5;28;01mdef[39;00m [38;5;21m__init__[39m([38;5;28mself[39m, [38;5;241m*[39margs, [38;5;241m*[39m[38;5;241m*[39mkwargs):
[0;32m---> 23[0m [38;5;28;43msuper[39;49m[43m([49m[43m)[49m[38;5;241;43m.[39;49m[38;5;21;43m__init__[39;49m[43m([49m[38;5;241;43m*[39;49m[43margs[49m[43m,[49m[43m [49m[38;5;241;43m*[39;49m[38;5;241;43m*[39;49m[43mkwargs[49m[43m)[49m
[1;32m 24[0m [38;5;28mself[39m[38;5;241m.[39m_distribution_strategy [38;5;241m=[39m tf[38;5;241m.[39mdistribute[38;5;241m.[39mget_strategy()
File [0;32m~/miniforge3/envs/myenv/lib/python3.9/site-packages/keras/src/optimizers/base_optimizer.py:90[0m, in [0;36mBaseOptimizer.__init__[0;34m(self, learning_rate, weight_decay, clipnorm, clipvalue, global_clipnorm, use_ema, ema_momentum, ema_overwrite_frequency, loss_scale_factor, gradient_accumulation_steps, name, **kwargs)[0m
[1;32m 86[0m warnings[38;5;241m.[39mwarn(
[1;32m 87[0m [38;5;124m"[39m[38;5;124mArgument `decay` is no longer supported and will be ignored.[39m[38;5;124m"[39m
[1;32m 88[0m )
[1;32m 89[0m [38;5;28;01mif[39;00m kwargs:
[0;32m---> 90[0m [38;5;28;01mraise[39;00m [38;5;167;01mValueError[39;00m([38;5;124mf[39m[38;5;124m"[39m[38;5;124mArgument(s) not recognized: [39m[38;5;132;01m{[39;00mkwargs[38;5;132;01m}[39;00m[38;5;124m"[39m)
[1;32m 92[0m [38;5;28;01mif[39;00m name [38;5;129;01mis[39;00m [38;5;28;01mNone[39;00m:
[1;32m 93[0m name [38;5;241m=[39m auto_name([38;5;28mself[39m[38;5;241m.[39m[38;5;18m__class__[39m[38;5;241m.[39m[38;5;18m__name__[39m)
[0;31mValueError[0m: Argument(s) not recognized: {'lr': 1e-05}In [7]:
# visual representation of grid search
# uses seaborn heatmap, could probably do this in matplotlib
import seaborn as sns
sns.set()
train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
for i in range(len(eta_vals)):
for j in range(len(lmbd_vals)):
CNN = CNN_keras[i][j]
train_accuracy[i][j] = CNN.evaluate(X_train, Y_train)[1]
test_accuracy[i][j] = CNN.evaluate(X_test, Y_test)[1]
fig, ax = plt.subplots(figsize = (10, 10))
sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
ax.set_title("Training Accuracy")
ax.set_ylabel("$\eta$")
ax.set_xlabel("$\lambda$")
plt.show()
fig, ax = plt.subplots(figsize = (10, 10))
sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
ax.set_title("Test Accuracy")
ax.set_ylabel("$\eta$")
ax.set_xlabel("$\lambda$")
plt.show()In [8]:
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
# We import the data set
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
# Normalize pixel values to be between 0 and 1 by dividing by 255.
train_images, test_images = train_images / 255.0, test_images / 255.0In [9]:
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i], cmap=plt.cm.binary)
# The CIFAR labels happen to be arrays,
# which is why you need the extra index
plt.xlabel(class_names[train_labels[i][0]])
plt.show()In [10]:
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
# Let's display the architecture of our model so far.
model.summary()In [11]:
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))
Here's the complete architecture of our model.
model.summary()In [12]:
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
history = model.fit(train_images, train_labels, epochs=10,
validation_data=(test_images, test_labels))In [13]:
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.5, 1])
plt.legend(loc='lower right')
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(test_acc)
