1 | /**
|
2 | * @license
|
3 | * Copyright 2018 Google LLC
|
4 | *
|
5 | * Use of this source code is governed by an MIT-style
|
6 | * license that can be found in the LICENSE file or at
|
7 | * https://opensource.org/licenses/MIT.
|
8 | * =============================================================================
|
9 | */
|
10 | /* original source: keras/regularizers.py */
|
11 | import * as tfc from '@tensorflow/tfjs-core';
|
12 | import { abs, add, serialization, sum, tidy, zeros } from '@tensorflow/tfjs-core';
|
13 | import * as K from './backend/tfjs_backend';
|
14 | import { deserializeKerasObject, serializeKerasObject } from './utils/generic_utils';
|
15 | function assertObjectArgs(args) {
|
16 | if (args != null && typeof args !== 'object') {
|
17 | throw new Error(`Argument to L1L2 regularizer's constructor is expected to be an ` +
|
18 | `object, but received: ${args}`);
|
19 | }
|
20 | }
|
21 | /**
|
22 | * Regularizer base class.
|
23 | */
|
24 | export class Regularizer extends serialization.Serializable {
|
25 | }
|
26 | export class L1L2 extends Regularizer {
|
27 | constructor(args) {
|
28 | super();
|
29 | assertObjectArgs(args);
|
30 | this.l1 = args == null || args.l1 == null ? 0.01 : args.l1;
|
31 | this.l2 = args == null || args.l2 == null ? 0.01 : args.l2;
|
32 | this.hasL1 = this.l1 !== 0;
|
33 | this.hasL2 = this.l2 !== 0;
|
34 | }
|
35 | /**
|
36 | * Porting note: Renamed from __call__.
|
37 | * @param x Variable of which to calculate the regularization score.
|
38 | */
|
39 | apply(x) {
|
40 | return tidy(() => {
|
41 | let regularization = zeros([1]);
|
42 | if (this.hasL1) {
|
43 | regularization = add(regularization, sum(tfc.mul(this.l1, abs(x))));
|
44 | }
|
45 | if (this.hasL2) {
|
46 | regularization =
|
47 | add(regularization, sum(tfc.mul(this.l2, K.square(x))));
|
48 | }
|
49 | return tfc.reshape(regularization, []);
|
50 | });
|
51 | }
|
52 | getConfig() {
|
53 | return { 'l1': this.l1, 'l2': this.l2 };
|
54 | }
|
55 | /** @nocollapse */
|
56 | static fromConfig(cls, config) {
|
57 | return new cls({ l1: config['l1'], l2: config['l2'] });
|
58 | }
|
59 | }
|
60 | /** @nocollapse */
|
61 | L1L2.className = 'L1L2';
|
62 | serialization.registerClass(L1L2);
|
63 | export function l1(args) {
|
64 | assertObjectArgs(args);
|
65 | return new L1L2({ l1: args != null ? args.l1 : null, l2: 0 });
|
66 | }
|
67 | export function l2(args) {
|
68 | assertObjectArgs(args);
|
69 | return new L1L2({ l2: args != null ? args.l2 : null, l1: 0 });
|
70 | }
|
71 | // Maps the JavaScript-like identifier keys to the corresponding keras symbols.
|
72 | export const REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP = {
|
73 | 'l1l2': 'L1L2'
|
74 | };
|
75 | export function serializeRegularizer(constraint) {
|
76 | return serializeKerasObject(constraint);
|
77 | }
|
78 | export function deserializeRegularizer(config, customObjects = {}) {
|
79 | return deserializeKerasObject(config, serialization.SerializationMap.getMap().classNameMap, customObjects, 'regularizer');
|
80 | }
|
81 | export function getRegularizer(identifier) {
|
82 | if (identifier == null) {
|
83 | return null;
|
84 | }
|
85 | if (typeof identifier === 'string') {
|
86 | const className = identifier in REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP ?
|
87 | REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP[identifier] :
|
88 | identifier;
|
89 | const config = { className, config: {} };
|
90 | return deserializeRegularizer(config);
|
91 | }
|
92 | else if (identifier instanceof Regularizer) {
|
93 | return identifier;
|
94 | }
|
95 | else {
|
96 | return deserializeRegularizer(identifier);
|
97 | }
|
98 | }
|
99 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVndWxhcml6ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL3JlZ3VsYXJpemVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILDRDQUE0QztBQUU1QyxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFVLGFBQWEsRUFBRSxHQUFHLEVBQVUsSUFBSSxFQUFFLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2hHLE9BQU8sS0FBSyxDQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLHNCQUFzQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbkYsU0FBUyxnQkFBZ0IsQ0FBQyxJQUE0QjtJQUNwRCxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzVDLE1BQU0sSUFBSSxLQUFLLENBQ1gsa0VBQWtFO1lBQ2xFLHlCQUF5QixJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ3RDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixXQUFZLFNBQVEsYUFBYSxDQUFDLFlBQVk7Q0FFbkU7QUFtQkQsTUFBTSxPQUFPLElBQUssU0FBUSxXQUFXO0lBUW5DLFlBQVksSUFBZTtRQUN6QixLQUFLLEVBQUUsQ0FBQztRQUVSLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMs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Q0FBQyxZQUFZLEVBQzVELGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxVQUVXO0lBQ3hDLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtRQUN0QixPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUU7UUFDbEMsTUFBTSxTQUFTLEdBQUcsVUFBVSxJQUFJLDBDQUEwQyxDQUFDLENBQUM7WUFDeEUsMENBQTBDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUN4RCxVQUFVLENBQUM7UUFDZixNQUFNLE1BQU0sR0FBRyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFDLENBQUM7UUFDdkMsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUN2QztTQUFNLElBQUksVUFBVSxZQUFZLFdBQVcsRUFBRTtRQUM1QyxPQUFPLFVBQVUsQ0FBQztLQUNuQjtTQUFNO1FBQ0wsT0FBTyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUMzQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKiBvcmlnaW5hbCBzb3VyY2U6IGtlcmFzL3JlZ3VsYXJpemVycy5weSAqL1xuXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7YWJzLCBhZGQsIFNjYWxhciwgc2VyaWFsaXphdGlvbiwgc3VtLCBUZW5zb3IsIHRpZHksIHplcm9zfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0ICogYXMgSyBmcm9tICcuL2JhY2tlbmQvdGZqc19iYWNrZW5kJztcbmltcG9ydCB7ZGVzZXJpYWxpemVLZXJhc09iamVjdCwgc2VyaWFsaXplS2VyYXNPYmplY3R9IGZyb20gJy4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5cbmZ1bmN0aW9uIGFzc2VydE9iamVjdEFyZ3MoYXJnczogTDFBcmdzfEwyQXJnc3xMMUwyQXJncyk6IHZvaWQge1xuICBpZiAoYXJncyAhPSBudWxsICYmIHR5cGVvZiBhcmdzICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFyZ3VtZW50IHRvIEwxTDIgcmVndWxhcml6ZXIncyBjb25zdHJ1Y3RvciBpcyBleHBlY3RlZCB0byBiZSBhbiBgICtcbiAgICAgICAgYG9iamVjdCwgYnV0IHJlY2VpdmVkOiAke2FyZ3N9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWd1bGFyaXplciBiYXNlIGNsYXNzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVndWxhcml6ZXIgZXh0ZW5kcyBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZSB7XG4gIGFic3RyYWN0IGFwcGx5KHg6IFRlbnNvcik6IFNjYWxhcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMMUwyQXJncyB7XG4gIC8qKiBMMSByZWd1bGFyaXphdGlvbiByYXRlLiBEZWZhdWx0cyB0byAwLjAxLiAqL1xuICBsMT86IG51bWJlcjtcbiAgLyoqIEwyIHJlZ3VsYXJpemF0aW9uIHJhdGUuIERlZmF1bHRzIHRvIDAuMDEuICovXG4gIGwyPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEwxQXJncyB7XG4gIC8qKiBMMSByZWd1bGFyaXphdGlvbiByYXRlLiBEZWZhdWx0cyB0byAwLjAxLiAqL1xuICBsMTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEwyQXJncyB7XG4gIC8qKiBMMiByZWd1bGFyaXphdGlvbiByYXRlLiBEZWZhdWx0cyB0byAwLjAxLiAqL1xuICBsMjogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgTDFMMiBleHRlbmRzIFJlZ3VsYXJpemVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTDFMMic7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsMTogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGwyOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFzTDE6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFzTDI6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBMMUwyQXJncykge1xuICAgIHN1cGVyKCk7XG5cbiAgICBhc3NlcnRPYmplY3RBcmdzKGFyZ3MpO1xuXG4gICAgdGhpcy5sMSA9IGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmwxID09IG51bGwgPyAwLjAxIDogYXJncy5sMTtcbiAgICB0aGlzLmwyID0gYXJncyA9PSBudWxsIHx8IGFyZ3MubDIgPT0gbnVsbCA/IDAuMDEgOiBhcmdzLmwyO1xuICAgIHRoaXMuaGFzTDEgPSB0aGlzLmwxICE9PSAwO1xuICAgIHRoaXMuaGFzTDIgPSB0aGlzLmwyICE9PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvcnRpbmcgbm90ZTogUmVuYW1lZCBmcm9tIF9fY2FsbF9fLlxuICAgKiBAcGFyYW0geCBWYXJpYWJsZSBvZiB3aGljaCB0byBjYWxjdWxhdGUgdGhlIHJlZ3VsYXJpemF0aW9uIHNjb3JlLlxuICAgKi9cbiAgYXBwbHkoeDogVGVuc29yKTogU2NhbGFyIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBsZXQgcmVndWxhcml6YXRpb246IFRlbnNvciA9IHplcm9zKFsxXSk7XG4gICAgICBpZiAodGhpcy5oYXNMMSkge1xuICAgICAgICByZWd1bGFyaXphdGlvbiA9IGFkZChyZWd1bGFyaXphdGlvbiwgc3VtKHRmYy5tdWwodGhpcy5sMSwgYWJzKHgpKSkpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaGFzTDIpIHtcbiAgICAgICAgcmVndWxhcml6YXRpb24gPVxuICAgICAgICAgICAgYWRkKHJlZ3VsYXJpemF0aW9uLCBzdW0odGZjLm11bCh0aGlzLmwyLCBLLnNxdWFyZSh4KSkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZmMucmVzaGFwZShyZWd1bGFyaXphdGlvbiwgW10pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHsnbDEnOiB0aGlzLmwxLCAnbDInOiB0aGlzLmwyfTtcbiAgfVxuXG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgb3ZlcnJpZGUgZnJvbUNvbmZpZzxUIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LFxuICAgICAgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyh7bDE6IGNvbmZpZ1snbDEnXSBhcyBudW1iZXIsIGwyOiBjb25maWdbJ2wyJ10gYXMgbnVtYmVyfSk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhMMUwyKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGwxKGFyZ3M/OiBMMUFyZ3MpIHtcbiAgYXNzZXJ0T2JqZWN0QXJncyhhcmdzKTtcbiAgcmV0dXJuIG5ldyBMMUwyKHtsMTogYXJncyAhPSBudWxsID8gYXJncy5sMSA6IG51bGwsIGwyOiAwfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsMihhcmdzOiBMMkFyZ3MpIHtcbiAgYXNzZXJ0T2JqZWN0QXJncyhhcmdzKTtcbiAgcmV0dXJuIG5ldyBMMUwyKHtsMjogYXJncyAhPSBudWxsID8gYXJncy5sMiA6IG51bGwsIGwxOiAwfSk7XG59XG5cbi8qKiBAZG9jaW5saW5lICovXG5leHBvcnQgdHlwZSBSZWd1bGFyaXplcklkZW50aWZpZXIgPSAnbDFsMid8c3RyaW5nO1xuXG4vLyBNYXBzIHRoZSBKYXZhU2NyaXB0LWxpa2UgaWRlbnRpZmllciBrZXlzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGtlcmFzIHN5bWJvbHMuXG5leHBvcnQgY29uc3QgUkVHVUxBUklaRVJfSURFTlRJRklFUl9SRUdJU1RSWV9TWU1CT0xfTUFQOlxuICAgIHtbaWRlbnRpZmllciBpbiBSZWd1bGFyaXplcklkZW50aWZpZXJdOiBzdHJpbmd9ID0ge1xuICAgICAgJ2wxbDInOiAnTDFMMidcbiAgICB9O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUmVndWxhcml6ZXIoY29uc3RyYWludDogUmVndWxhcml6ZXIpOlxuICAgIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdFZhbHVlIHtcbiAgcmV0dXJuIHNlcmlhbGl6ZUtlcmFzT2JqZWN0KGNvbnN0cmFpbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVSZWd1bGFyaXplcihcbiAgICBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCxcbiAgICBjdXN0b21PYmplY3RzOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fSk6IFJlZ3VsYXJpemVyIHtcbiAgcmV0dXJuIGRlc2VyaWFsaXplS2VyYXNPYmplY3QoXG4gICAgICBjb25maWcsIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvbk1hcC5nZXRNYXAoKS5jbGFzc05hbWVNYXAsXG4gICAgICBjdXN0b21PYmplY3RzLCAncmVndWxhcml6ZXInKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlZ3VsYXJpemVyKGlkZW50aWZpZXI6IFJlZ3VsYXJpemVySWRlbnRpZmllcnxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3R8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVndWxhcml6ZXIpOiBSZWd1bGFyaXplciB7XG4gIGlmIChpZGVudGlmaWVyID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAodHlwZW9mIGlkZW50aWZpZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaWRlbnRpZmllciBpbiBSRUdVTEFSSVpFUl9JREVOVElGSUVSX1JFR0lTVFJZX1NZTUJPTF9NQVAgP1xuICAgICAgICBSRUdVTEFSSVpFUl9JREVOVElGSUVSX1JFR0lTVFJZX1NZTUJPTF9NQVBbaWRlbnRpZmllcl0gOlxuICAgICAgICBpZGVudGlmaWVyO1xuICAgIGNvbnN0IGNvbmZpZyA9IHtjbGFzc05hbWUsIGNvbmZpZzoge319O1xuICAgIHJldHVybiBkZXNlcmlhbGl6ZVJlZ3VsYXJpemVyKGNvbmZpZyk7XG4gIH0gZWxzZSBpZiAoaWRlbnRpZmllciBpbnN0YW5jZW9mIFJlZ3VsYXJpemVyKSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplUmVndWxhcml6ZXIoaWRlbnRpZmllcik7XG4gIH1cbn1cbiJdfQ== |
\ | No newline at end of file |