| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- // Experimental
- var lasagne = lasagne || {};
- lasagne.ModelFactory = class {
- match(context) {
- const obj = context.open('pkl');
- if (obj && obj.__class__ && obj.__class__.__module__ === 'nolearn.lasagne.base' && obj.__class__.__name__ == 'NeuralNet') {
- return 'lasagne';
- }
- return '';
- }
- open(context) {
- return context.metadata('lasagne-metadata.json').then((metadata) => {
- const obj = context.open('pkl');
- return new lasagne.Model(metadata, obj);
- });
- }
- };
- lasagne.Model = class {
- constructor(metadata, model) {
- this._graphs = [ new lasagne.Graph(metadata, model) ];
- }
- get format() {
- return 'Lasagne';
- }
- get graphs() {
- return this._graphs;
- }
- };
- lasagne.Graph = class {
- constructor(metadata, model) {
- this._nodes = [];
- this._inputs = [];
- this._outputs = [];
- const args = new Map();
- const arg = (name, type, initializer) => {
- if (!args.has(name)) {
- args.set(name, new lasagne.Argument(name, type));
- }
- const value = args.get(name);
- if (!value.type && type) {
- value.type = type;
- }
- if (!value.initializer && initializer) {
- value.initializer = initializer;
- }
- return value;
- };
- for (const pair of model.layers) {
- const name = pair[0];
- const layer = model.layers_[name];
- if (layer && layer.__class__ && layer.__class__.__module__ === 'lasagne.layers.input' && layer.__class__.__name__ === 'InputLayer') {
- const type = new lasagne.TensorType(layer.input_var.type.dtype, new lasagne.TensorShape(layer.shape));
- this._inputs.push(new lasagne.Parameter(layer.name, [ arg(layer.name, type) ]));
- continue;
- }
- this._nodes.push(new lasagne.Node(metadata, layer, arg));
- }
- if (model._output_layer) {
- const output_layer = model._output_layer;
- this._outputs.push(new lasagne.Parameter(output_layer.name, [ arg(output_layer.name) ]));
- }
- }
- get inputs() {
- return this._inputs;
- }
- get outputs() {
- return this._outputs;
- }
- get nodes() {
- return this._nodes;
- }
- };
- lasagne.Parameter = class {
- constructor(name, args) {
- this._name = name;
- this._arguments = args;
- }
- get name() {
- return this._name;
- }
- get arguments() {
- return this._arguments;
- }
- get visible() {
- return true;
- }
- };
- lasagne.Argument = class {
- constructor(name, type, initializer) {
- if (typeof name !== 'string') {
- throw new lasagne.Error("Invalid argument identifier '" + JSON.stringify(name) + "'.");
- }
- this._name= name;
- this._type = type || null;
- this._initializer = initializer || null;
- }
- get name() {
- return this._name;
- }
- get type() {
- if (this._initializer) {
- return this._initializer.type;
- }
- return this._type;
- }
- set type(value) {
- this._type = value;
- }
- get initializer() {
- return this._initializer;
- }
- set initializer(value) {
- this._initializer = value;
- }
- };
- lasagne.Node = class {
- constructor(metadata, layer, arg) {
- this._name = layer.name || '';
- const type = layer.__class__ ? layer.__class__.__module__ + '.' + layer.__class__.__name__ : '';
- this._type = metadata.type(type) || { name: type };
- this._inputs = [];
- this._outputs = [];
- this._attributes = [];
- const params = new Map();
- for (const key of Object.keys(layer)) {
- if (key === 'name' || key === 'params' || key === 'input_layer' || key === 'input_shape') {
- continue;
- }
- const value = layer[key];
- if (value && value.__class__ && value.__class__.__module__ === 'theano.tensor.sharedvar' && value.__class__.__name__ === 'TensorSharedVariable') {
- params.set(value.name, key);
- continue;
- }
- this._attributes.push(new lasagne.Attribute(null, key, value));
- }
- if (layer.input_layer && layer.input_layer.name) {
- const input_layer = layer.input_layer;
- const type = layer.input_shape ? new lasagne.TensorType('?', new lasagne.TensorShape(layer.input_shape)) : undefined;
- this._inputs.push(new lasagne.Parameter('input', [ arg(input_layer.name, type) ]));
- }
- if (layer.params) {
- for (const pair of layer.params) {
- const param = pair[0];
- const param_key = params.get(param.name);
- if (param_key) {
- const initializer = new lasagne.Tensor(param.container.storage[0]);
- this._inputs.push(new lasagne.Parameter(param_key, [ arg(param.name, null, initializer) ]));
- }
- }
- }
- this._outputs.push(new lasagne.Parameter('output', [ arg(this.name) ]));
- }
- get type() {
- return this._type;
- }
- get name() {
- return this._name;
- }
- get inputs() {
- return this._inputs;
- }
- get outputs() {
- return this._outputs;
- }
- get attributes() {
- return this._attributes;
- }
- };
- lasagne.Attribute = class {
- constructor(metadata, name, value) {
- this._name = name;
- this._value = value;
- if (value && value.__class__) {
- this._type = value.__class__.__module__ + '.' + value.__class__.__name__;
- }
- }
- get name() {
- return this._name;
- }
- get value() {
- return this._value;
- }
- get type() {
- return this._type;
- }
- };
- lasagne.TensorType = class {
- constructor(dataType, shape) {
- this._dataType = dataType;
- this._shape = shape;
- }
- get dataType() {
- return this._dataType;
- }
- get shape() {
- return this._shape;
- }
- toString() {
- return this._dataType + this._shape.toString();
- }
- };
- lasagne.TensorShape = class {
- constructor(dimensions) {
- this._dimensions = dimensions;
- }
- get dimensions() {
- return this._dimensions;
- }
- toString() {
- if (this._dimensions && this._dimensions.length > 0) {
- return '[' + this._dimensions.map((dimension) => dimension ? dimension.toString() : '?').join(',') + ']';
- }
- return '';
- }
- };
- lasagne.Tensor = class {
- constructor(storage) {
- this._type = new lasagne.TensorType(storage.dtype.__name__, new lasagne.TensorShape(storage.shape));
- }
- get type() {
- return this._type;
- }
- get state() {
- return 'Tensor data not implemented.';
- }
- toString() {
- return '';
- }
- };
- lasagne.Error = class extends Error {
- constructor(message) {
- super(message);
- this.name = 'Lasagne Error';
- }
- };
- if (typeof module !== 'undefined' && typeof module.exports === 'object') {
- module.exports.ModelFactory = lasagne.ModelFactory;
- }
|