Browse Source

fixed train example

subDesTagesMitExtraKaese 3 years ago
parent
commit
474d326b5f
5 changed files with 147 additions and 16 deletions
  1. 1 0
      .gitignore
  2. 1 1
      c++/lib/json
  3. 67 0
      examples/cifar.py
  4. 72 0
      examples/mnist.py
  5. 6 15
      examples/train.py

+ 1 - 0
.gitignore

@@ -4,3 +4,4 @@
 *.tar
 __pycache__
 /c++/build/
+/model.png

+ 1 - 1
c++/lib/json

@@ -1 +1 @@
-Subproject commit 27f5a6e82731b5538f1063bb8e955458ea7746e7
+Subproject commit e7452d87783fbf6e9d320d515675e26dfd1271c5

+ 67 - 0
examples/cifar.py

@@ -0,0 +1,67 @@
+# from https://www.tensorflow.org/tutorials/images/cnn
+
+import tensorflow as tf
+from tensorflow.keras import datasets, layers, models
+import matplotlib.pyplot as plt
+
+import sys
+sys.path.append('../hostLib/')
+from hostLib.layers.conv2d import Conv2D as Conv2DFPGA
+
+(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
+
+# Normalize pixel values to be between 0 and 1
+train_images, test_images = train_images / 255.0, test_images / 255.0
+
+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()
+
+model = models.Sequential()
+model.add(layers.Lambda(lambda x: tf.image.resize(x, (228,228)))) #to-do: implement 3 stage 32x32_3x3 conv2d with relu
+model.add(Conv2DFPGA(1))#32
+model.add(layers.Activation('relu'))
+model.add(layers.Lambda(lambda x: tf.image.resize(x, (228,228))))
+model.add(Conv2DFPGA(1))#64
+model.add(layers.Activation('relu'))
+model.add(layers.Lambda(lambda x: tf.image.resize(x, (228,228))))
+model.add(Conv2DFPGA(1))#64
+model.add(layers.Activation('relu'))
+model.add(layers.MaxPooling2D(pool_size=(16, 16)))
+
+model.add(layers.Flatten())
+model.add(layers.Dense(64, activation='relu'))
+model.add(layers.Dense(10))
+
+model.build(input_shape=(None, 32, 32, 3))
+model.summary()
+
+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))
+
+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)
+plt.show()

+ 72 - 0
examples/mnist.py

@@ -0,0 +1,72 @@
+# from https://keras.io/examples/mnist_cnn/
+
+import tensorflow as tf
+import tensorflow.keras as keras
+from tensorflow.keras import layers
+from tensorflow.keras.layers import Input, Embedding, LSTM, Dense, Dropout, Flatten, MaxPooling2D, Conv2D
+from tensorflow.keras.models import Model, Sequential
+from tensorflow.keras.datasets import mnist
+from tensorflow.keras.utils import plot_model, to_categorical
+
+import numpy as np
+from IPython import embed
+
+import sys
+sys.path.append('../hostLib/')
+from hostLib.layers.conv2d import Conv2D as Conv2DFPGA
+
+batch_size = 128
+num_classes = 10
+epochs = 1200
+
+# input image dimensions
+img_rows, img_cols = 28, 28
+
+# the data, split between train and test sets
+(x_train, y_train), (x_test, y_test) = mnist.load_data()
+
+x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
+x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
+
+x_train = x_train.astype('float')
+x_test = x_test.astype('float')
+#x_train /= 255
+#x_test /= 255
+print('x_train shape:', x_train.shape)
+print(x_train.shape[0], 'train samples')
+print(x_test.shape[0], 'test samples')
+
+# convert class vectors to binary class matrices
+y_train = to_categorical(y_train, num_classes)
+y_test = to_categorical(y_test, num_classes)
+
+model = Sequential()
+model.add(layers.Lambda(lambda x: tf.image.resize(x, (228,228)))) #to-do: implement 2 stage 28x28_3x3 conv2d with relu
+model.add(Conv2DFPGA(1))#32
+model.add(layers.Activation('relu'))
+model.add(layers.Lambda(lambda x: tf.image.resize(x, (228,228))))
+model.add(Conv2DFPGA(1))#64
+model.add(layers.Activation('relu'))
+model.add(MaxPooling2D(pool_size=(int(228/28*2), int(228/28*2))))
+model.add(Dropout(0.25))
+model.add(Flatten())
+model.add(Dense(128, activation='relu'))
+model.add(Dropout(0.5))
+model.add(Dense(num_classes, activation='softmax'))
+
+model.compile(loss=keras.losses.categorical_crossentropy,
+              optimizer=keras.optimizers.Adadelta(),
+              metrics=['accuracy'])
+
+plot_model(model, to_file='model.png', expand_nested=True, show_shapes=True)
+
+model.fit(x_train, y_train,
+          batch_size=batch_size,
+          epochs=epochs,
+          verbose=1,
+          validation_data=(x_test, y_test))
+
+score = model.evaluate(x_test, y_test, verbose=0)
+print('Test loss:', score[0])
+print('Test accuracy:', score[1])
+

+ 6 - 15
examples/train.py

@@ -25,7 +25,6 @@ img_rows, img_cols = 28, 28
 
 x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
 x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
-input_shape = (img_rows, img_cols, 1)
 
 x_train = x_train.astype('float')
 x_test = x_test.astype('float')
@@ -39,11 +38,12 @@ print(x_test.shape[0], 'test samples')
 y_train = to_categorical(y_train, num_classes)
 y_test = to_categorical(y_test, num_classes)
 
-a = layers.Input(shape=(28, 28, 1))
+i = layers.Input(shape=(28, 28, 1))
+a = layers.Lambda(lambda x: tf.image.resize(x, (228,228)))(i)
 b = Conv2DFPGA(2)(a)
 c = Conv2DFPGA(1)(a)
-d = Conv2DFPGA(1)(b)
-e = Conv2DFPGA(2)(c)
+d = Conv2DFPGA(1)(layers.Lambda(lambda x: tf.image.resize(x, (228,228)))(b))
+e = Conv2DFPGA(2)(layers.Lambda(lambda x: tf.image.resize(x, (228,228)))(c))
 
 print(a)
 print(b)
@@ -55,19 +55,10 @@ x = layers.Add()([d,e])
 y = layers.Flatten()(x)
 z = layers.Dense(num_classes, activation='softmax')(y)
 
-model = Model(inputs=a, outputs=z)
+model = Model(inputs=i, outputs=z)
+
 print(model.output_shape)
 
-"""
-model = Sequential()
-model.add(Conv2DFPGA([0,0]))
-model.add(Conv2DFPGA([0,0]))
-model.add(Conv2DFPGA([0,0]))
-model.add(Flatten())
-model.add(Dense(128, activation='relu'))
-model.add(Dropout(0.5))
-model.add(Dense(num_classes, activation='softmax'))
-"""
 model.compile(loss=keras.losses.categorical_crossentropy,
               optimizer=keras.optimizers.Adadelta(),
               metrics=['accuracy'])