mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-05-16 21:00:14 +00:00
### Description Fix #18297 With PR #17766, conv2d activation in mobilenetv2-12 will not be empty. However, activation is not supported yet in [biasActivationSnippet](https://github.com/microsoft/onnxruntime/blob/main/js/web/lib/wasm/jsep/webgpu/ops/3rd-party/activation_util.ts#L48C14-L48C36). This PR makes all places unify to use [getActivationSnippet](https://github.com/microsoft/onnxruntime/blob/main/js/web/lib/wasm/jsep/webgpu/ops/fuse-utils.ts#L13) to fix this issue.
44 lines
1.8 KiB
TypeScript
44 lines
1.8 KiB
TypeScript
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// Licensed under the MIT License.
|
|
|
|
import {MAX_CLIP, MIN_CLIP} from '../../util';
|
|
|
|
export interface InternalActivationAttributes {
|
|
readonly activation: string;
|
|
readonly clipMin?: number;
|
|
readonly clipMax?: number;
|
|
readonly activationCacheKey: string;
|
|
}
|
|
|
|
export const getActivationSnippet = (attributes: InternalActivationAttributes, valueType: string):
|
|
{activationFunction: string; applyActivation: string} => {
|
|
switch (attributes.activation) {
|
|
case 'Relu':
|
|
return {activationFunction: '', applyActivation: `value = max(value, ${valueType}(0.0));`};
|
|
case 'Sigmoid':
|
|
return {
|
|
activationFunction: '',
|
|
applyActivation: `value = (${valueType}(1.0) / (${valueType}(1.0) + exp(-value)));`
|
|
};
|
|
case 'Clip':
|
|
return {
|
|
activationFunction: `const clip_min_=${valueType}(${attributes.clipMin!});const clip_max_=${valueType}(${
|
|
attributes.clipMax!});`,
|
|
applyActivation: 'value = clamp(value, clip_min_, clip_max_);'
|
|
};
|
|
// TODO: adding other activations that can be fused.
|
|
default:
|
|
return {activationFunction: '', applyActivation: ''};
|
|
}
|
|
};
|
|
|
|
export const parseInternalActivationAttributes =
|
|
(attributes: Record<string, unknown>|undefined): InternalActivationAttributes => {
|
|
const activation = attributes?.activation as string || '';
|
|
|
|
if (activation === 'Clip') {
|
|
const [clipMin, clipMax] = attributes?.activation_params as [number, number] || [MIN_CLIP, MAX_CLIP];
|
|
return {activation, clipMax, clipMin, activationCacheKey: `${activation}:${clipMin},${clipMax}`};
|
|
}
|
|
return {activation, activationCacheKey: activation};
|
|
};
|