Using a Custom Dual Input Keras Layer










3















I am attempting to create a simple multi-layer perceptron in Keras. The general structure I would like to create is one where a matrix A of dimension [n_a1, n_a2] is sent through a number of layers of a multilayer perceptron, and at a certain point, the dot product of the morphed A matrix is taken with a randomly selected y vector [n_y, 1] from a set of y vectors, and the result then continues through a number more layers before reaching the end where it is compared with the input labels as normal.



Unfortunately, I am having issues with figuring how to implement this properly. I created a custom multi-input layer per the simple example offered at https://keras.io/layers/writing-your-own-keras-layers/, but it seems that I still can't have multiple inputs in the network. I am getting an error for setting an array element as a sequence: ValueError: setting an array element with a sequence.



Also, its unclear to me how the network would know what to do with the list formatted inputs for the other layers. Do I need to specify the list shape for each layer, and to somehow only use the A in the [A, y] list?



Custom Layer



class DualLayer(Layer):

def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(DualLayer, self).__init__(**kwargs)

def build(self, input_shape):
#Trainable weight variable for layer
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(DualLayer, self).build(input_shape)

def call(self, x):
aOpt, y = x
return [K.dot(aOpt, y)]

def compute_outpute_shape(self, input_shape):
assert isinstance(input_shape, list)
shape_y, shape_aOpt = input_shape
return [shape_y[0]]


Model



def modFunc(y1, A1, y2, A2, xSim):
model = Sequential()
model.add(Flatten(input_shape = np.shape(A1)))
model.add(Dense(np.shape(A1)[0]*np.shape(A1)[1], activation = 'relu',
kernel_regularizer = 'l1', activity_regularizer = 'l1'))
model.add(DualLayer([y1, A1]))
model.add(Dense(5, activation = 'relu'))

clf = model.fit([y1, A1], xSim, epochs=5, batch_size=1, verbose=2)
return clf.coef_









share|improve this question






















  • I would suggest using the keras functional API: keras.io/getting-started/functional-api-guide instead of sequential. It is more versatile and can solve your multi-input.

    – Dinari
    Nov 14 '18 at 10:24















3















I am attempting to create a simple multi-layer perceptron in Keras. The general structure I would like to create is one where a matrix A of dimension [n_a1, n_a2] is sent through a number of layers of a multilayer perceptron, and at a certain point, the dot product of the morphed A matrix is taken with a randomly selected y vector [n_y, 1] from a set of y vectors, and the result then continues through a number more layers before reaching the end where it is compared with the input labels as normal.



Unfortunately, I am having issues with figuring how to implement this properly. I created a custom multi-input layer per the simple example offered at https://keras.io/layers/writing-your-own-keras-layers/, but it seems that I still can't have multiple inputs in the network. I am getting an error for setting an array element as a sequence: ValueError: setting an array element with a sequence.



Also, its unclear to me how the network would know what to do with the list formatted inputs for the other layers. Do I need to specify the list shape for each layer, and to somehow only use the A in the [A, y] list?



Custom Layer



class DualLayer(Layer):

def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(DualLayer, self).__init__(**kwargs)

def build(self, input_shape):
#Trainable weight variable for layer
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(DualLayer, self).build(input_shape)

def call(self, x):
aOpt, y = x
return [K.dot(aOpt, y)]

def compute_outpute_shape(self, input_shape):
assert isinstance(input_shape, list)
shape_y, shape_aOpt = input_shape
return [shape_y[0]]


Model



def modFunc(y1, A1, y2, A2, xSim):
model = Sequential()
model.add(Flatten(input_shape = np.shape(A1)))
model.add(Dense(np.shape(A1)[0]*np.shape(A1)[1], activation = 'relu',
kernel_regularizer = 'l1', activity_regularizer = 'l1'))
model.add(DualLayer([y1, A1]))
model.add(Dense(5, activation = 'relu'))

clf = model.fit([y1, A1], xSim, epochs=5, batch_size=1, verbose=2)
return clf.coef_









share|improve this question






















  • I would suggest using the keras functional API: keras.io/getting-started/functional-api-guide instead of sequential. It is more versatile and can solve your multi-input.

    – Dinari
    Nov 14 '18 at 10:24













3












3








3








I am attempting to create a simple multi-layer perceptron in Keras. The general structure I would like to create is one where a matrix A of dimension [n_a1, n_a2] is sent through a number of layers of a multilayer perceptron, and at a certain point, the dot product of the morphed A matrix is taken with a randomly selected y vector [n_y, 1] from a set of y vectors, and the result then continues through a number more layers before reaching the end where it is compared with the input labels as normal.



Unfortunately, I am having issues with figuring how to implement this properly. I created a custom multi-input layer per the simple example offered at https://keras.io/layers/writing-your-own-keras-layers/, but it seems that I still can't have multiple inputs in the network. I am getting an error for setting an array element as a sequence: ValueError: setting an array element with a sequence.



Also, its unclear to me how the network would know what to do with the list formatted inputs for the other layers. Do I need to specify the list shape for each layer, and to somehow only use the A in the [A, y] list?



Custom Layer



class DualLayer(Layer):

def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(DualLayer, self).__init__(**kwargs)

def build(self, input_shape):
#Trainable weight variable for layer
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(DualLayer, self).build(input_shape)

def call(self, x):
aOpt, y = x
return [K.dot(aOpt, y)]

def compute_outpute_shape(self, input_shape):
assert isinstance(input_shape, list)
shape_y, shape_aOpt = input_shape
return [shape_y[0]]


Model



def modFunc(y1, A1, y2, A2, xSim):
model = Sequential()
model.add(Flatten(input_shape = np.shape(A1)))
model.add(Dense(np.shape(A1)[0]*np.shape(A1)[1], activation = 'relu',
kernel_regularizer = 'l1', activity_regularizer = 'l1'))
model.add(DualLayer([y1, A1]))
model.add(Dense(5, activation = 'relu'))

clf = model.fit([y1, A1], xSim, epochs=5, batch_size=1, verbose=2)
return clf.coef_









share|improve this question














I am attempting to create a simple multi-layer perceptron in Keras. The general structure I would like to create is one where a matrix A of dimension [n_a1, n_a2] is sent through a number of layers of a multilayer perceptron, and at a certain point, the dot product of the morphed A matrix is taken with a randomly selected y vector [n_y, 1] from a set of y vectors, and the result then continues through a number more layers before reaching the end where it is compared with the input labels as normal.



Unfortunately, I am having issues with figuring how to implement this properly. I created a custom multi-input layer per the simple example offered at https://keras.io/layers/writing-your-own-keras-layers/, but it seems that I still can't have multiple inputs in the network. I am getting an error for setting an array element as a sequence: ValueError: setting an array element with a sequence.



Also, its unclear to me how the network would know what to do with the list formatted inputs for the other layers. Do I need to specify the list shape for each layer, and to somehow only use the A in the [A, y] list?



Custom Layer



class DualLayer(Layer):

def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(DualLayer, self).__init__(**kwargs)

def build(self, input_shape):
#Trainable weight variable for layer
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(DualLayer, self).build(input_shape)

def call(self, x):
aOpt, y = x
return [K.dot(aOpt, y)]

def compute_outpute_shape(self, input_shape):
assert isinstance(input_shape, list)
shape_y, shape_aOpt = input_shape
return [shape_y[0]]


Model



def modFunc(y1, A1, y2, A2, xSim):
model = Sequential()
model.add(Flatten(input_shape = np.shape(A1)))
model.add(Dense(np.shape(A1)[0]*np.shape(A1)[1], activation = 'relu',
kernel_regularizer = 'l1', activity_regularizer = 'l1'))
model.add(DualLayer([y1, A1]))
model.add(Dense(5, activation = 'relu'))

clf = model.fit([y1, A1], xSim, epochs=5, batch_size=1, verbose=2)
return clf.coef_






python-3.x keras neural-network






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 14 '18 at 2:22









TQMTQM

194




194












  • I would suggest using the keras functional API: keras.io/getting-started/functional-api-guide instead of sequential. It is more versatile and can solve your multi-input.

    – Dinari
    Nov 14 '18 at 10:24

















  • I would suggest using the keras functional API: keras.io/getting-started/functional-api-guide instead of sequential. It is more versatile and can solve your multi-input.

    – Dinari
    Nov 14 '18 at 10:24
















I would suggest using the keras functional API: keras.io/getting-started/functional-api-guide instead of sequential. It is more versatile and can solve your multi-input.

– Dinari
Nov 14 '18 at 10:24





I would suggest using the keras functional API: keras.io/getting-started/functional-api-guide instead of sequential. It is more versatile and can solve your multi-input.

– Dinari
Nov 14 '18 at 10:24












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53292289%2fusing-a-custom-dual-input-keras-layer%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53292289%2fusing-a-custom-dual-input-keras-layer%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Use pre created SQLite database for Android project in kotlin

Darth Vader #20

Ondo