Using a Custom Dual Input Keras Layer
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
add a comment |
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
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
add a comment |
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
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
python-3.x keras neural-network
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
add a comment |
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
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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