Neural Networks in Python: Difference between revisions
(2 intermediate revisions by one other user not shown) | |||
Line 5: | Line 5: | ||
pip install -r requirements.txt | pip install -r requirements.txt | ||
I've got the current list of dependencies on ubfs/Scripts/Python/requirements.txt | I've got the current list of dependencies on ubfs/Scripts/Python/requirements.txt | ||
=A Simple Feedforward Classifier Network= | |||
Keras has defined network templates, but the only one that I've seen well-documented is the '''forward'' model. Fortunately, the forward model is well-suited to the classification task: it takes a set of input values, feeds the values forward over a set of layers, and checks the output values in a set of binary classification units. If the output decision is strictly binary (A vs B), then one output unit will suffice (since it's a zero-sum decision). If 3+ output categories are possible, then there needs to be an output unit for each possible category. | |||
import numpy as np | |||
import keras | |||
import time | |||
import scipy.io as sio | |||
from keras.layers import Input,Dense,Dropout | |||
from keras.models import Model, Sequential, load_model | |||
from keras.regularizers import l1 | |||
from keras.optimizers import Adadelta | |||
from sklearn.model_selection import StratifiedKFold as SKF | |||
from sklearn.model_selection import ShuffleSplit as SS | |||
import read_activations as reader | |||
seed=int(time.time()) | |||
np.random.seed(seed) | |||
trainfile='av_hi.csv' | |||
traindata=np.genfromtxt(trainfile, delimiter=',') | |||
testdata=(traindata) | |||
x_train=traindata[:,0:-1] | |||
y_cat_code=testdata[:,-1] | |||
#this next line converts the category codes of 1,2,3 into 3 separate output units so that | |||
#a code of 1 maps to {1,0,0}, 2 maps to {0,1,0} and 3 maps to {0,0,1} | |||
y_cat_train=keras.utils.to_categorical(y_cat_code, num_classes=3) | |||
encoding_dim1=96 | |||
encoding_dim2=32 | |||
input_trials, inodes = x_train.shape | |||
foldnumber=0 | |||
fp=open('perflog.txt', 'w') | |||
hfp=open('cat_traininghist.txt', 'w') | |||
kfold = SKF(n_splits=8, shuffle=True, random_state=seed) | |||
for train, test in kfold.split(x_train, y_cat_code): | |||
foldnumber=foldnumber+1 | |||
ada=keras.optimizers.Adadelta(lr=1, rho=0.9, decay=1e-6) | |||
#input layer: a series of 1000 floats from 0.0 to 1.0 | |||
main_input=Input(shape=(inodes,), dtype='float32', name='input') | |||
#first dropout layer, initially, lets randomly drop 20% of values | |||
dropout_1=Dropout(0.2, input_shape=(inodes,), name='dense_1_drop')(main_input) | |||
#noise layer to mitigate overfitting | |||
noise_1=keras.layers.noise.GaussianNoise(0.05, input_shape=(inodes,), name='dense_1_noise')(dropout_1) | |||
#first hidden layer | |||
dense_1=Dense(encoding_dim1, activation='relu', input_dim=inodes, | |||
name='dense_1', kernel_regularizer=l1(0.00001))(noise_1) | |||
#second hidden layer | |||
dense_2=Dense(encoding_dim2, activation='relu', name='dense_2')(dense_1) | |||
#category output layer | |||
cat_output=Dense(3, activation='softmax', name='cat_output')(dense_2) | |||
#assemble the model | |||
model=Model(inputs=[main_input], outputs=[cat_output]) | |||
#compile the model | |||
model.compile(optimizer='adadelta', | |||
loss=['categorical_crossentropy'], | |||
metrics=['accuracy'], loss_weights=[1]) | |||
X_train=x_train[train] | |||
X_test=x_train[test] | |||
Y_cat_train=y_cat_train[train] | |||
Y_cat_test=y_cat_train[test] | |||
xrows, xcols = X_test.shape | |||
history=model.fit(X_train, [Y_cat_train], | |||
validation_split=0.2, | |||
epochs=64, | |||
batch_size=32, | |||
shuffle=True, | |||
verbose=0) | |||
trainscore = model.evaluate(X_test, [Y_cat_test], verbose=0) | |||
outstr='%.2f\n' % trainscore[1] | |||
print outstr | |||
fp.write(outstr) | |||
fname='model_' + format(foldnumber, '02') + '.h5' | |||
model.save(fname) #save the trained model | |||
#training history | |||
vals=history.history['val_acc'] | |||
strlist= ['{:.3f}'.format(x) for x in vals] | |||
hfp.write('\n' + ','.join(strlist)) | |||
print model.summary() | |||
fp.close() | |||
hfp.close() |
Latest revision as of 09:35, 26 April 2019
Before You Begin
We've been using the Keras API with the TensorFlow backend for our simulations. Our code often also uses the numPy and SciKit libraries because I often steal code examples that happen to have been coded using those libraries. When you get started, you will want to make sure that all the requisite libraries are installed. Pip (the Python package installer) has a function called freeze
that will list all your installed libraries. This list can be dumped to a text file and used to share the list of Python packages you'll need to run any of the code we've developed:
pip freeze > requirements.txt
Now any lab member can use requirements.txt to ensure they have the requisite Python packages installed:
pip install -r requirements.txt
I've got the current list of dependencies on ubfs/Scripts/Python/requirements.txt
A Simple Feedforward Classifier Network
Keras has defined network templates, but the only one that I've seen well-documented is the 'forward model. Fortunately, the forward model is well-suited to the classification task: it takes a set of input values, feeds the values forward over a set of layers, and checks the output values in a set of binary classification units. If the output decision is strictly binary (A vs B), then one output unit will suffice (since it's a zero-sum decision). If 3+ output categories are possible, then there needs to be an output unit for each possible category.
import numpy as np import keras import time import scipy.io as sio from keras.layers import Input,Dense,Dropout from keras.models import Model, Sequential, load_model from keras.regularizers import l1 from keras.optimizers import Adadelta from sklearn.model_selection import StratifiedKFold as SKF from sklearn.model_selection import ShuffleSplit as SS import read_activations as reader seed=int(time.time()) np.random.seed(seed) trainfile='av_hi.csv' traindata=np.genfromtxt(trainfile, delimiter=',') testdata=(traindata) x_train=traindata[:,0:-1] y_cat_code=testdata[:,-1] #this next line converts the category codes of 1,2,3 into 3 separate output units so that #a code of 1 maps to {1,0,0}, 2 maps to {0,1,0} and 3 maps to {0,0,1} y_cat_train=keras.utils.to_categorical(y_cat_code, num_classes=3) encoding_dim1=96 encoding_dim2=32 input_trials, inodes = x_train.shape foldnumber=0 fp=open('perflog.txt', 'w') hfp=open('cat_traininghist.txt', 'w') kfold = SKF(n_splits=8, shuffle=True, random_state=seed) for train, test in kfold.split(x_train, y_cat_code): foldnumber=foldnumber+1 ada=keras.optimizers.Adadelta(lr=1, rho=0.9, decay=1e-6) #input layer: a series of 1000 floats from 0.0 to 1.0 main_input=Input(shape=(inodes,), dtype='float32', name='input') #first dropout layer, initially, lets randomly drop 20% of values dropout_1=Dropout(0.2, input_shape=(inodes,), name='dense_1_drop')(main_input) #noise layer to mitigate overfitting noise_1=keras.layers.noise.GaussianNoise(0.05, input_shape=(inodes,), name='dense_1_noise')(dropout_1) #first hidden layer dense_1=Dense(encoding_dim1, activation='relu', input_dim=inodes, name='dense_1', kernel_regularizer=l1(0.00001))(noise_1) #second hidden layer dense_2=Dense(encoding_dim2, activation='relu', name='dense_2')(dense_1) #category output layer cat_output=Dense(3, activation='softmax', name='cat_output')(dense_2) #assemble the model model=Model(inputs=[main_input], outputs=[cat_output]) #compile the model model.compile(optimizer='adadelta', loss=['categorical_crossentropy'], metrics=['accuracy'], loss_weights=[1]) X_train=x_train[train] X_test=x_train[test] Y_cat_train=y_cat_train[train] Y_cat_test=y_cat_train[test] xrows, xcols = X_test.shape history=model.fit(X_train, [Y_cat_train], validation_split=0.2, epochs=64, batch_size=32, shuffle=True, verbose=0) trainscore = model.evaluate(X_test, [Y_cat_test], verbose=0) outstr='%.2f\n' % trainscore[1] print outstr fp.write(outstr) fname='model_' + format(foldnumber, '02') + '.h5' model.save(fname) #save the trained model #training history vals=history.history['val_acc'] strlist= ['{:.3f}'.format(x) for x in vals] hfp.write('\n' + ','.join(strlist)) print model.summary() fp.close() hfp.close()