conv2d implementation

This commit is contained in:
Francesco Gatti
2017-06-28 14:04:43 +00:00
parent 8bf0b0257e
commit 3cb126420c
6 changed files with 199 additions and 34 deletions
+18 -17
View File
@@ -2,7 +2,7 @@ import keras
import numpy as np
import pickle
from keras.models import Sequential
from keras.layers import Input, Dense, Activation, Flatten, Dropout, ELU
from keras.layers import Input, Dense, Activation, Flatten, Dropout, ELU, Reshape
from keras.layers.convolutional import Convolution2D, Convolution3D
from keras.layers.pooling import MaxPooling2D, MaxPooling3D
from keras.models import Sequential, Model
@@ -12,33 +12,34 @@ from weights_exporter import *
def dense_model():
model = Sequential()
model.add(Dense(256, input_shape=(1, 512)))
model.add(Reshape((10, 10, 1), input_shape=(10, 10)))
model.add(Convolution2D(2, (4, 4), subsample=(2, 2),
bias_initializer='random_uniform'))
model.add(ELU())
model.add(Dense(32))
model.add(ELU())
model.add(Dense(2))
model.add(Convolution2D(4, (2, 2), subsample=(1, 1),
bias_initializer='random_uniform', activation="relu"))
sgd = keras.optimizers.Adam(lr=1e-4, decay=1e-8)
model.compile(optimizer=sgd, loss="mse")
return model
if __name__ == '__main__':
print "DATA FORMAT: ", keras.backend.image_data_format()
model = dense_model()
wg = model.get_weights()
export_conv2d("conv0", wg[0], wg[1])
export_conv2d("conv1", wg[2], wg[3])
export_dense("dense0", wg[0], wg[1])
export_dense("dense1", wg[2], wg[3])
export_dense("dense2", wg[4], wg[5])
model.set_weights(wg)
X = np.random.rand(1, 512)
i = np.array(X, dtype=np.float32)
grid = np.random.rand(10,10)
X = grid[None,:,:]
i = np.array(grid.flatten(), dtype=np.float32)
print i
i.tofile("input.bin", format="f")
print "Input: ", X
print "Input: ", i
r = model.predict( X[None, :], batch_size=1)
r = model.predict( X, batch_size=1)
print np.shape(r)
print "Result: ", r
print "Result shape: ", np.shape(r)
+16 -15
View File
@@ -2,10 +2,10 @@
#include "Layer.h"
const char *input_bin = "../tests/input.bin";
const char *d0_bin = "../tests/dense0.bin";
const char *d0_bias_bin = "../tests/dense0.bias.bin";
const char *d1_bin = "../tests/dense1.bin";
const char *d1_bias_bin = "../tests/dense1.bias.bin";
const char *c0_bin = "../tests/conv0.bin";
const char *c0_bias_bin = "../tests/conv0.bias.bin";
const char *c1_bin = "../tests/conv1.bin";
const char *c1_bias_bin = "../tests/conv1.bias.bin";
const char *d2_bin = "../tests/dense2.bin";
const char *d2_bias_bin = "../tests/dense2.bias.bin";
@@ -13,13 +13,12 @@ int main() {
// Network layout
tkDNN::Network net;
tkDNN::dataDim_t dim(1, 512, 1, 1);
tkDNN::Dense d0 (&net, dim, 256, d0_bin, d0_bias_bin);
tkDNN::Activation a0 (&net, d0.output_dim, tkDNN::ACTIVATION_ELU);
tkDNN::Dense d1 (&net, a0.output_dim, 32, d1_bin, d1_bias_bin);
tkDNN::Activation a1 (&net, d1.output_dim, tkDNN::ACTIVATION_ELU);
tkDNN::Dense d2 (&net, a1.output_dim, 2, d2_bin, d2_bias_bin);
tkDNN::dataDim_t dim(1, 1, 10, 10);
tkDNN::Conv2d c0 (&net, dim, 2, 4, 4, 2, 2, c0_bin, c0_bias_bin);
tkDNN::Activation a0 (&net, c0.output_dim, tkDNN::ACTIVATION_ELU);
tkDNN::Conv2d c1 (&net, a0.output_dim, 4, 2, 2, 1, 1, c1_bin, c1_bias_bin);
tkDNN::Activation a1 (&net, c1.output_dim, tkDNN::ACTIVATION_RELU);
// Load input
value_type *data;
value_type *input_h;
@@ -27,13 +26,15 @@ int main() {
dim.print(); //print initial dimension
TIMER_START
// Inference
data = d0.infer(dim, data); dim.print();
data = c0.infer(dim, data); dim.print();
data = a0.infer(dim, data); dim.print();
data = d1.infer(dim, data); dim.print();
data = c1.infer(dim, data); dim.print();
data = a1.infer(dim, data); dim.print();
data = d2.infer(dim, data); dim.print();
TIMER_STOP
// Print result
printDeviceVector(dim.tot(), data);
return 0;