xref: /aosp_15_r20/external/tensorflow/tensorflow/lite/g3doc/guide/op_select_allowlist.md (revision b6fb3261f9314811a0f4371741dbb8839866f948)
1# Supported Select TensorFlow operators
2
3Caution: The operators list is updated frequently.
4
5## TensorFlow core operators
6
7The following is an exhaustive list of TensorFlow core operations that are
8supported by TensorFlow Lite runtime with the Select TensorFlow Ops feature.
9
10*   `raw_ops.Abort`
11*   `raw_ops.Abs`
12*   `raw_ops.Add`
13*   `raw_ops.AddN`
14*   `raw_ops.AddV2`
15*   `raw_ops.AdjustContrast`
16*   `raw_ops.AdjustContrastv2`
17*   `raw_ops.AdjustHue`
18*   `raw_ops.AdjustSaturation`
19*   `raw_ops.All`
20*   `raw_ops.Angle`
21*   `raw_ops.Any`
22*   `raw_ops.ApplyAdadelta`
23*   `raw_ops.ApplyAdagrad`
24*   `raw_ops.ApplyAdagradDA`
25*   `raw_ops.ApplyAdagradV2`
26*   `raw_ops.ApplyAdam`
27*   `raw_ops.ApplyAdaMax`
28*   `raw_ops.ApplyAddSign`
29*   `raw_ops.ApplyCenteredRMSProp`
30*   `raw_ops.ApplyFtrl`
31*   `raw_ops.ApplyFtrlV2`
32*   `raw_ops.ApplyGradientDescent`
33*   `raw_ops.ApplyMomentum`
34*   `raw_ops.ApplyPowerSign`
35*   `raw_ops.ApplyProximalAdagrad`
36*   `raw_ops.ApplyProximalGradientDescent`
37*   `raw_ops.ApplyRMSProp`
38*   `raw_ops.ApproximateEqual`
39*   `raw_ops.ArgMax`
40*   `raw_ops.ArgMin`
41*   `raw_ops.AsString`
42*   `raw_ops.Assert`
43*   `raw_ops.Assign`
44*   `raw_ops.AssignAdd`
45*   `raw_ops.AssignAddVariableOp`
46*   `raw_ops.AssignSub`
47*   `raw_ops.AssignSubVariableOp`
48*   `raw_ops.AssignVariableOp`
49*   `raw_ops.Atan`
50*   `raw_ops.Atan2`
51*   `raw_ops.AudioSpectrogram`
52*   `raw_ops.AvgPool`
53*   `raw_ops.AvgPool3D`
54*   `raw_ops.AvgPool3DGrad`
55*   `raw_ops.AvgPoolGrad`
56*   `raw_ops.BatchCholesky`
57*   `raw_ops.BatchDatasetV2`
58*   `raw_ops.BatchMatMul`
59*   `raw_ops.BatchMatMulV2`
60*   `raw_ops.BatchMatrixBandPart`
61*   `raw_ops.BatchMatrixDiag`
62*   `raw_ops.BatchMatrixDiagPart`
63*   `raw_ops.BatchMatrixInverse`
64*   `raw_ops.BatchMatrixSetDiag`
65*   `raw_ops.BatchMatrixTriangularSolve`
66*   `raw_ops.BatchNormWithGlobalNormalization`
67*   `raw_ops.BatchNormWithGlobalNormalizationGrad`
68*   `raw_ops.BatchToSpace`
69*   `raw_ops.BatchToSpaceND`
70*   `raw_ops.BiasAdd`
71*   `raw_ops.BiasAddGrad`
72*   `raw_ops.BiasAddV1`
73*   `raw_ops.Bincount`
74*   `raw_ops.Bitcast`
75*   `raw_ops.BitwiseAnd`
76*   `raw_ops.BitwiseOr`
77*   `raw_ops.BitwiseXor`
78*   `raw_ops.BroadcastArgs`
79*   `raw_ops.BroadcastGradientArgs`
80*   `raw_ops.BroadcastTo`
81*   `raw_ops.Bucketize`
82*   `raw_ops.CTCBeamSearchDecoder`
83*   `raw_ops.CTCGreedyDecoder`
84*   `raw_ops.Cast`
85*   `raw_ops.Ceil`
86*   `raw_ops.CheckNumerics`
87*   `raw_ops.CheckNumericsV2`
88*   `raw_ops.Cholesky`
89*   `raw_ops.CombinedNonMaxSuppression`
90*   `raw_ops.Complex`
91*   `raw_ops.ComplexAbs`
92*   `raw_ops.Concat`
93*   `raw_ops.ConcatOffset`
94*   `raw_ops.ConcatV2`
95*   `raw_ops.Conj`
96*   `raw_ops.ConjugateTranspose`
97*   `raw_ops.Const`
98*   `raw_ops.ControlTrigger`
99*   `raw_ops.Conv2D`
100*   `raw_ops.Conv2DBackpropFilter`
101*   `raw_ops.Conv2DBackpropInput`
102*   `raw_ops.Conv3D`
103*   `raw_ops.Conv3DBackpropFilter`
104*   `raw_ops.Conv3DBackpropFilterV2`
105*   `raw_ops.Conv3DBackpropInput`
106*   `raw_ops.Conv3DBackpropInputV2`
107*   `raw_ops.Cos`
108*   `raw_ops.Cosh`
109*   `raw_ops.CropAndResize`
110*   `raw_ops.CropAndResizeGradBoxes`
111*   `raw_ops.CropAndResizeGradImage`
112*   `raw_ops.CTCBeamSearchDecoder`
113*   `raw_ops.CTCGreedyDecoder`
114*   `raw_ops.Cumprod`
115*   `raw_ops.Cumsum`
116*   `raw_ops.CumulativeLogsumexp`
117*   `raw_ops.DataFormatDimMap`
118*   `raw_ops.DataFormatVecPermute`
119*   `raw_ops.DebugGradientIdentity`
120*   `raw_ops.DebugGradientRefIdentity`
121*   `raw_ops.DecodeAndCropJpeg`
122*   `raw_ops.DecodeBase64`
123*   `raw_ops.DecodeBmp`
124*   `raw_ops.DecodeGif`
125*   `raw_ops.DecodeImage`
126*   `raw_ops.DecodeJpeg`
127*   `raw_ops.DecodePaddedRaw`
128*   `raw_ops.DecodePng`
129*   `raw_ops.DecodeRaw`
130*   `raw_ops.DecodeWav`
131*   `raw_ops.DeepCopy`
132*   `raw_ops.DeleteSessionTensor`
133*   `raw_ops.DenseBincount`
134*   `raw_ops.DenseToDenseSetOperation`
135*   `raw_ops.DenseToSparseSetOperation`
136*   `raw_ops.DepthToSpace`
137*   `raw_ops.DepthwiseConv2dNative`
138*   `raw_ops.DepthwiseConv2dNativeBackpropFilter`
139*   `raw_ops.DepthwiseConv2dNativeBackpropInput`
140*   `raw_ops.Dequantize`
141*   `raw_ops.DestroyResourceOp`
142*   `raw_ops.DestroyTemporaryVariable`
143*   `raw_ops.Diag`
144*   `raw_ops.DiagPart`
145*   `raw_ops.Dilation2D`
146*   `raw_ops.Dilation2DBackpropFilter`
147*   `raw_ops.Dilation2DBackpropInput`
148*   `raw_ops.Div`
149*   `raw_ops.DivNoNan`
150*   `raw_ops.DynamicPartition`
151*   `raw_ops.DynamicStitch`
152*   `raw_ops.Einsum`
153*   `raw_ops.Elu`
154*   `raw_ops.EluGrad`
155*   `raw_ops.Empty`
156*   `raw_ops.EmptyTensorList`
157*   `raw_ops.EmptyTensorMap`
158*   `raw_ops.EncodeBase64`
159*   `raw_ops.EncodeJpeg`
160*   `raw_ops.EncodeJpegVariableQuality`
161*   `raw_ops.EncodePng`
162*   `raw_ops.EncodeWav`
163*   `raw_ops.EnsureShape`
164*   `raw_ops.Enter`
165*   `raw_ops.Equal`
166*   `raw_ops.Erf`
167*   `raw_ops.Exit`
168*   `raw_ops.Exp`
169*   `raw_ops.ExpandDims`
170*   `raw_ops.ExtractImagePatches`
171*   `raw_ops.FakeQuantWithMinMaxArgs`
172*   `raw_ops.FakeQuantWithMinMaxArgsGradient`
173*   `raw_ops.FakeQuantWithMinMaxVars`
174*   `raw_ops.FakeQuantWithMinMaxVarsGradient`
175*   `raw_ops.FakeQuantWithMinMaxVarsPerChannel`
176*   `raw_ops.FakeQuantWithMinMaxVarsPerChannelGradient`
177*   `raw_ops.FakeQueue`
178*   `raw_ops.FFT`
179*   `raw_ops.FFT2D`
180*   `raw_ops.FFT3D`
181*   `raw_ops.FIFOQueue`
182*   `raw_ops.FIFOQueueV2`
183*   `raw_ops.Fill`
184*   `raw_ops.FilterDataset`
185*   `raw_ops.FinalizeDataset`
186*   `raw_ops.Fingerprint`
187*   `raw_ops.FlatMapDataset`
188*   `raw_ops.Floor`
189*   `raw_ops.FloorDiv`
190*   `raw_ops.FloorMod`
191*   `raw_ops.FusedBatchNorm`
192*   `raw_ops.FusedBatchNormGrad`
193*   `raw_ops.FusedBatchNormGradV2`
194*   `raw_ops.FusedBatchNormGradV3`
195*   `raw_ops.FusedBatchNormV2`
196*   `raw_ops.FusedBatchNormV3`
197*   `raw_ops.FusedPadConv2D`
198*   `raw_ops.FusedResizeAndPadConv2D`
199*   `raw_ops.Gather`
200*   `raw_ops.GatherNd`
201*   `raw_ops.GatherV2`
202*   `raw_ops.GetSessionHandle`
203*   `raw_ops.GetSessionHandleV2`
204*   `raw_ops.GetSessionTensor`
205*   `raw_ops.Greater`
206*   `raw_ops.GreaterEqual`
207*   `raw_ops.HSVToRGB`
208*   `raw_ops.HashTable`
209*   `raw_ops.HashTableV2`
210*   `raw_ops.HistogramSummary`
211*   `raw_ops.Identity`
212*   `raw_ops.IdentityN`
213*   `raw_ops.IFFT`
214*   `raw_ops.IFFT2D`
215*   `raw_ops.IFFT3D`
216*   `raw_ops.Imag`
217*   `raw_ops.ImageProjectiveTransformV2`
218*   `raw_ops.ImageProjectiveTransformV3`
219*   `raw_ops.ImmutableConst`
220*   `raw_ops.InplaceAdd`
221*   `raw_ops.InplaceSub`
222*   `raw_ops.InplaceUpdate`
223*   `raw_ops.InTopK`
224*   `raw_ops.InTopKV2`
225*   `raw_ops.InitializeTable`
226*   `raw_ops.InitializeTableFromDataset`
227*   `raw_ops.InitializeTableFromTextFile`
228*   `raw_ops.InitializeTableFromTextFileV2`
229*   `raw_ops.InitializeTableV2`
230*   `raw_ops.Inv`
231*   `raw_ops.Invert`
232*   `raw_ops.InvertPermutation`
233*   `raw_ops.InvGrad`
234*   `raw_ops.IRFFT`
235*   `raw_ops.IRFFT2D`
236*   `raw_ops.IRFFT3D`
237*   `raw_ops.IsFinite`
238*   `raw_ops.IsNan`
239*   `raw_ops.IsVariableInitialized`
240*   `raw_ops.LRN`
241*   `raw_ops.LeakyRelu`
242*   `raw_ops.LeakyReluGrad`
243*   `raw_ops.LeftShift`
244*   `raw_ops.Less`
245*   `raw_ops.LessEqual`
246*   `raw_ops.LinSpace`
247*   `raw_ops.ListDiff`
248*   `raw_ops.Log`
249*   `raw_ops.LogMatrixDeterminant`
250*   `raw_ops.LogSoftmax`
251*   `raw_ops.LogicalAnd`
252*   `raw_ops.LogicalNot`
253*   `raw_ops.LogicalOr`
254*   `raw_ops.LookupTableExport`
255*   `raw_ops.LookupTableExportV2`
256*   `raw_ops.LookupTableFind`
257*   `raw_ops.LookupTableFindV2`
258*   `raw_ops.LookupTableImport`
259*   `raw_ops.LookupTableImportV2`
260*   `raw_ops.LookupTableInsert`
261*   `raw_ops.LookupTableInsertV2`
262*   `raw_ops.LookupTableRemoveV2`
263*   `raw_ops.LookupTableSize`
264*   `raw_ops.LookupTableSizeV2`
265*   `raw_ops.LoopCond`
266*   `raw_ops.LRN`
267*   `raw_ops.MapDataset`
268*   `raw_ops.MatMul`
269*   `raw_ops.MatrixBandPart`
270*   `raw_ops.MatrixDiag`
271*   `raw_ops.MatrixDiagPart`
272*   `raw_ops.MatrixDiagPartV2`
273*   `raw_ops.MatrixDiagPartV3`
274*   `raw_ops.MatrixDiagV2`
275*   `raw_ops.MatrixDiagV3`
276*   `raw_ops.MatrixInverse`
277*   `raw_ops.MatrixSetDiag`
278*   `raw_ops.MatrixSetDiagV2`
279*   `raw_ops.MatrixSetDiagV3`
280*   `raw_ops.MatrixTriangularSolve`
281*   `raw_ops.Max`
282*   `raw_ops.Maximum`
283*   `raw_ops.MaxPool`
284*   `raw_ops.MaxPool3D`
285*   `raw_ops.MaxPool3DGrad`
286*   `raw_ops.MaxPool3DGradGrad`
287*   `raw_ops.MaxPoolGrad`
288*   `raw_ops.MaxPoolGradGrad`
289*   `raw_ops.MaxPoolGradGradV2`
290*   `raw_ops.MaxPoolGradV2`
291*   `raw_ops.MaxPoolGradWithArgmax`
292*   `raw_ops.MaxPoolV2`
293*   `raw_ops.MaxPoolWithArgmax`
294*   `raw_ops.Mean`
295*   `raw_ops.Merge`
296*   `raw_ops.MergeSummary`
297*   `raw_ops.MergeV2Checkpoints`
298*   `raw_ops.Mfcc`
299*   `raw_ops.Min`
300*   `raw_ops.Minimum`
301*   `raw_ops.MirrorPad`
302*   `raw_ops.MirrorPadGrad`
303*   `raw_ops.ModelDataset`
304*   `raw_ops.Mul`
305*   `raw_ops.MulNoNan`
306*   `raw_ops.Multinomial`
307*   `raw_ops.MutableDenseHashTable`
308*   `raw_ops.MutableDenseHashTableV2`
309*   `raw_ops.MutableHashTable`
310*   `raw_ops.MutableHashTableOfTensors`
311*   `raw_ops.MutableHashTableOfTensorsV2`
312*   `raw_ops.MutableHashTableV2`
313*   `raw_ops.Neg`
314*   `raw_ops.NextIteration`
315*   `raw_ops.NonMaxSuppression`
316*   `raw_ops.NonMaxSuppressionV2`
317*   `raw_ops.NonMaxSuppressionV3`
318*   `raw_ops.NonMaxSuppressionV4`
319*   `raw_ops.NonMaxSuppressionV5`
320*   `raw_ops.NonMaxSuppressionWithOverlaps`
321*   `raw_ops.NoOp`
322*   `raw_ops.NotEqual`
323*   `raw_ops.OneHot`
324*   `raw_ops.OnesLike`
325*   `raw_ops.OptimizeDatasetV2`
326*   `raw_ops.OptionalFromValue`
327*   `raw_ops.OptionalGetValue`
328*   `raw_ops.OptionalHasValue`
329*   `raw_ops.OptionalNone`
330*   `raw_ops.Pack`
331*   `raw_ops.Pad`
332*   `raw_ops.PadV2`
333*   `raw_ops.PaddingFIFOQueue`
334*   `raw_ops.PaddingFIFOQueueV2`
335*   `raw_ops.PadV2`
336*   `raw_ops.ParallelConcat`
337*   `raw_ops.ParallelDynamicStitch`
338*   `raw_ops.ParseExample`
339*   `raw_ops.ParseExampleV2`
340*   `raw_ops.ParseSequenceExample`
341*   `raw_ops.ParseSequenceExampleV2`
342*   `raw_ops.ParseSingleExample`
343*   `raw_ops.ParseSingleSequenceExample`
344*   `raw_ops.Placeholder`
345*   `raw_ops.PlaceholderV2`
346*   `raw_ops.PlaceholderWithDefault`
347*   `raw_ops.PopulationCount`
348*   `raw_ops.Pow`
349*   `raw_ops.PreventGradient`
350*   `raw_ops.Print`
351*   `raw_ops.PrintV2`
352*   `raw_ops.Prod`
353*   `raw_ops.Qr`
354*   `raw_ops.QuantizedAdd`
355*   `raw_ops.QuantizedAvgPool`
356*   `raw_ops.QuantizedBatchNormWithGlobalNormalization`
357*   `raw_ops.QuantizedBiasAdd`
358*   `raw_ops.QuantizedConcat`
359*   `raw_ops.QuantizedConv2D`
360*   `raw_ops.QuantizedInstanceNorm`
361*   `raw_ops.QuantizedMatMul`
362*   `raw_ops.QuantizedMaxPool`
363*   `raw_ops.QuantizedMul`
364*   `raw_ops.QuantizeDownAndShrinkRange`
365*   `raw_ops.QuantizedRelu`
366*   `raw_ops.QuantizedRelu6`
367*   `raw_ops.QuantizedReshape`
368*   `raw_ops.QuantizedResizeBilinear`
369*   `raw_ops.QuantizeV2`
370*   `raw_ops.QueueClose`
371*   `raw_ops.QueueCloseV2`
372*   `raw_ops.QueueDequeue`
373*   `raw_ops.QueueDequeueMany`
374*   `raw_ops.QueueDequeueManyV2`
375*   `raw_ops.QueueDequeueUpTo`
376*   `raw_ops.QueueDequeueUpToV2`
377*   `raw_ops.QueueDequeueV2`
378*   `raw_ops.QueueEnqueue`
379*   `raw_ops.QueueEnqueueMany`
380*   `raw_ops.QueueEnqueueManyV2`
381*   `raw_ops.QueueEnqueueV2`
382*   `raw_ops.QueueIsClosed`
383*   `raw_ops.QueueIsClosedV2`
384*   `raw_ops.QueueSize`
385*   `raw_ops.QueueSizeV2`
386*   `raw_ops.RFFT`
387*   `raw_ops.RFFT2D`
388*   `raw_ops.RFFT3D`
389*   `raw_ops.RGBToHSV`
390*   `raw_ops.RaggedBincount`
391*   `raw_ops.RaggedGather`
392*   `raw_ops.RaggedRange`
393*   `raw_ops.RaggedTensorFromVariant`
394*   `raw_ops.RaggedTensorToSparse`
395*   `raw_ops.RaggedTensorToTensor`
396*   `raw_ops.RaggedTensorToVariant`
397*   `raw_ops.RaggedTensorToVariantGradient`
398*   `raw_ops.RandomGamma`
399*   `raw_ops.RandomPoisson`
400*   `raw_ops.RandomPoissonV2`
401*   `raw_ops.RandomShuffle`
402*   `raw_ops.RandomStandardNormal`
403*   `raw_ops.RandomUniform`
404*   `raw_ops.RandomUniformInt`
405*   `raw_ops.Range`
406*   `raw_ops.Rank`
407*   `raw_ops.ReadFile`
408*   `raw_ops.ReadVariableOp`
409*   `raw_ops.Real`
410*   `raw_ops.RealDiv`
411*   `raw_ops.Reciprocal`
412*   `raw_ops.ReciprocalGrad`
413*   `raw_ops.Recv`
414*   `raw_ops.ReduceDataset`
415*   `raw_ops.ReduceJoin`
416*   `raw_ops.RefEnter`
417*   `raw_ops.RefExit`
418*   `raw_ops.RefIdentity`
419*   `raw_ops.RefMerge`
420*   `raw_ops.RefNextIteration`
421*   `raw_ops.RefSelect`
422*   `raw_ops.RefSwitch`
423*   `raw_ops.RegexFullMatch`
424*   `raw_ops.RegexReplace`
425*   `raw_ops.Relu`
426*   `raw_ops.Relu6`
427*   `raw_ops.Relu6Grad`
428*   `raw_ops.ReluGrad`
429*   `raw_ops.RemoteCall`
430*   `raw_ops.RepeatDataset`
431*   `raw_ops.RequantizationRange`
432*   `raw_ops.Requantize`
433*   `raw_ops.Reshape`
434*   `raw_ops.ResizeBicubic`
435*   `raw_ops.ResizeBicubicGrad`
436*   `raw_ops.ResizeBilinear`
437*   `raw_ops.ResizeBilinearGrad`
438*   `raw_ops.ResizeNearestNeighbor`
439*   `raw_ops.ResizeNearestNeighborGrad`
440*   `raw_ops.ResourceApplyAdadelta`
441*   `raw_ops.ResourceApplyAdagrad`
442*   `raw_ops.ResourceApplyAdagradDA`
443*   `raw_ops.ResourceApplyAdagradV2`
444*   `raw_ops.ResourceApplyAdam`
445*   `raw_ops.ResourceApplyAdaMax`
446*   `raw_ops.ResourceApplyAdamWithAmsgrad`
447*   `raw_ops.ResourceApplyAddSign`
448*   `raw_ops.ResourceApplyCenteredRMSProp`
449*   `raw_ops.ResourceApplyFtrl`
450*   `raw_ops.ResourceApplyFtrlV2`
451*   `raw_ops.ResourceApplyGradientDescent`
452*   `raw_ops.ResourceApplyKerasMomentum`
453*   `raw_ops.ResourceApplyMomentum`
454*   `raw_ops.ResourceApplyPowerSign`
455*   `raw_ops.ResourceApplyProximalAdagrad`
456*   `raw_ops.ResourceApplyProximalGradientDescent`
457*   `raw_ops.ResourceApplyRMSProp`
458*   `raw_ops.ResourceGather`
459*   `raw_ops.ResourceGatherNd`
460*   `raw_ops.ResourceScatterAdd`
461*   `raw_ops.ResourceScatterDiv`
462*   `raw_ops.ResourceScatterMax`
463*   `raw_ops.ResourceScatterMin`
464*   `raw_ops.ResourceScatterMul`
465*   `raw_ops.ResourceScatterNdAdd`
466*   `raw_ops.ResourceScatterNdMax`
467*   `raw_ops.ResourceScatterNdMin`
468*   `raw_ops.ResourceScatterNdSub`
469*   `raw_ops.ResourceScatterNdUpdate`
470*   `raw_ops.ResourceScatterSub`
471*   `raw_ops.ResourceScatterUpdate`
472*   `raw_ops.ResourceSparseApplyAdadelta`
473*   `raw_ops.ResourceSparseApplyAdagrad`
474*   `raw_ops.ResourceSparseApplyAdagradDA`
475*   `raw_ops.ResourceSparseApplyAdagradV2`
476*   `raw_ops.ResourceSparseApplyCenteredRMSProp`
477*   `raw_ops.ResourceSparseApplyFtrl`
478*   `raw_ops.ResourceSparseApplyFtrlV2`
479*   `raw_ops.ResourceSparseApplyKerasMomentum`
480*   `raw_ops.ResourceSparseApplyMomentum`
481*   `raw_ops.ResourceSparseApplyProximalAdagrad`
482*   `raw_ops.ResourceSparseApplyProximalGradientDescent`
483*   `raw_ops.ResourceSparseApplyRMSProp`
484*   `raw_ops.ResourceStridedSliceAssign`
485*   `raw_ops.Restore`
486*   `raw_ops.RestoreSlice`
487*   `raw_ops.RestoreV2`
488*   `raw_ops.Reverse`
489*   `raw_ops.ReverseSequence`
490*   `raw_ops.ReverseV2`
491*   `raw_ops.RightShift`
492*   `raw_ops.Roll`
493*   `raw_ops.Round`
494*   `raw_ops.Rsqrt`
495*   `raw_ops.RsqrtGrad`
496*   `raw_ops.SampleDistortedBoundingBox`
497*   `raw_ops.SampleDistortedBoundingBoxV2`
498*   `raw_ops.Save`
499*   `raw_ops.SaveSlices`
500*   `raw_ops.SaveV2`
501*   `raw_ops.ScalarSummary`
502*   `raw_ops.ScatterNd`
503*   `raw_ops.ScatterNdAdd`
504*   `raw_ops.ScatterNdMax`
505*   `raw_ops.ScatterNdMin`
506*   `raw_ops.ScatterNdNonAliasingAdd`
507*   `raw_ops.ScatterNdSub`
508*   `raw_ops.ScatterNdUpdate`
509*   `raw_ops.SegmentMax`
510*   `raw_ops.SegmentMean`
511*   `raw_ops.SegmentMin`
512*   `raw_ops.SegmentProd`
513*   `raw_ops.SegmentSum`
514*   `raw_ops.Select`
515*   `raw_ops.SelectV2`
516*   `raw_ops.Selu`
517*   `raw_ops.SeluGrad`
518*   `raw_ops.Send`
519*   `raw_ops.SerializeTensor`
520*   `raw_ops.Shape`
521*   `raw_ops.ShapeN`
522*   `raw_ops.ShardedFilename`
523*   `raw_ops.ShardedFilespec`
524*   `raw_ops.Sigmoid`
525*   `raw_ops.SigmoidGrad`
526*   `raw_ops.Sign`
527*   `raw_ops.Sin`
528*   `raw_ops.Sinh`
529*   `raw_ops.Size`
530*   `raw_ops.Slice`
531*   `raw_ops.Softmax`
532*   `raw_ops.SoftmaxCrossEntropyWithLogits`
533*   `raw_ops.Softplus`
534*   `raw_ops.SoftplusGrad`
535*   `raw_ops.Softsign`
536*   `raw_ops.SoftsignGrad`
537*   `raw_ops.SpaceToBatch`
538*   `raw_ops.SpaceToBatchND`
539*   `raw_ops.SpaceToDepth`
540*   `raw_ops.SparseAdd`
541*   `raw_ops.SparseApplyAdadelta`
542*   `raw_ops.SparseApplyAdagrad`
543*   `raw_ops.SparseApplyAdagradDA`
544*   `raw_ops.SparseApplyAdagradV2`
545*   `raw_ops.SparseApplyCenteredRMSProp`
546*   `raw_ops.SparseApplyFtrl`
547*   `raw_ops.SparseApplyFtrlV2`
548*   `raw_ops.SparseApplyMomentum`
549*   `raw_ops.SparseApplyProximalAdagrad`
550*   `raw_ops.SparseApplyProximalGradientDescent`
551*   `raw_ops.SparseApplyRMSProp`
552*   `raw_ops.SparseBincount`
553*   `raw_ops.SparseCross`
554*   `raw_ops.SparseCrossHashed`
555*   `raw_ops.SparseCrossV2`
556*   `raw_ops.SparseFillEmptyRows`
557*   `raw_ops.SparseFillEmptyRowsGrad`
558*   `raw_ops.SparseReduceSum`
559*   `raw_ops.SparseReshape`
560*   `raw_ops.SparseReorder`
561*   `raw_ops.SparseSegmentMean`
562*   `raw_ops.SparseSegmentMeanGrad`
563*   `raw_ops.SparseSegmentMeanWithNumSegments`
564*   `raw_ops.SparseSegmentSqrtN`
565*   `raw_ops.SparseSegmentSqrtNGrad`
566*   `raw_ops.SparseSegmentSqrtNWithNumSegments`
567*   `raw_ops.SparseSegmentSum`
568*   `raw_ops.SparseSegmentSumGrad`
569*   `raw_ops.SparseSegmentSumWithNumSegments`
570*   `raw_ops.SparseSlice`
571*   `raw_ops.SparseSoftmaxCrossEntropyWithLogits`
572*   `raw_ops.SparseTensorDenseMatMul`
573*   `raw_ops.SparseToDense`
574*   `raw_ops.SparseToSparseSetOperation`
575*   `raw_ops.Split`
576*   `raw_ops.SplitV`
577*   `raw_ops.Sqrt`
578*   `raw_ops.SqrtGrad`
579*   `raw_ops.Square`
580*   `raw_ops.SquaredDifference`
581*   `raw_ops.Squeeze`
582*   `raw_ops.Stack`
583*   `raw_ops.StackClose`
584*   `raw_ops.StackCloseV2`
585*   `raw_ops.StackPop`
586*   `raw_ops.StackPopV2`
587*   `raw_ops.StackPush`
588*   `raw_ops.StackPushV2`
589*   `raw_ops.StackV2`
590*   `raw_ops.StatelessMultinomial`
591*   `raw_ops.StatelessRandomGammaV2`
592*   `raw_ops.StatelessRandomGetAlg`
593*   `raw_ops.StatelessRandomGetKeyCounter`
594*   `raw_ops.StatelessRandomGetKeyCounterAlg`
595*   `raw_ops.StatelessRandomNormal`
596*   `raw_ops.StatelessRandomNormalV2`
597*   `raw_ops.StatelessRandomPoisson`
598*   `raw_ops.StatelessRandomUniform`
599*   `raw_ops.StatelessRandomUniformFullInt`
600*   `raw_ops.StatelessRandomUniformFullIntV2`
601*   `raw_ops.StatelessRandomUniformInt`
602*   `raw_ops.StatelessRandomUniformIntV2`
603*   `raw_ops.StatelessRandomUniformV2`
604*   `raw_ops.StatelessSampleDistortedBoundingBox`
605*   `raw_ops.StatelessTruncatedNormal`
606*   `raw_ops.StatelessTruncatedNormalV2`
607*   `raw_ops.StaticRegexFullMatch`
608*   `raw_ops.StaticRegexReplace`
609*   `raw_ops.StopGradient`
610*   `raw_ops.StridedSlice`
611*   `raw_ops.StridedSliceAssign`
612*   `raw_ops.StridedSliceGrad`
613*   `raw_ops.StringFormat`
614*   `raw_ops.StringJoin`
615*   `raw_ops.StringLength`
616*   `raw_ops.StringLower`
617*   `raw_ops.StringSplit`
618*   `raw_ops.StringSplitV2`
619*   `raw_ops.StringStrip`
620*   `raw_ops.StringToHashBucket`
621*   `raw_ops.StringToHashBucketFast`
622*   `raw_ops.StringToHashBucketStrong`
623*   `raw_ops.StringToNumber`
624*   `raw_ops.Sub`
625*   `raw_ops.Substr`
626*   `raw_ops.Sum`
627*   `raw_ops.Switch`
628*   `raw_ops.SymbolicGradient`
629*   `raw_ops.TakeDataset`
630*   `raw_ops.TakeWhileDataset`
631*   `raw_ops.Tan`
632*   `raw_ops.Tanh`
633*   `raw_ops.TanhGrad`
634*   `raw_ops.TemporaryVariable`
635*   `raw_ops.TensorArray`
636*   `raw_ops.TensorArrayClose`
637*   `raw_ops.TensorArrayCloseV2`
638*   `raw_ops.TensorArrayCloseV3`
639*   `raw_ops.TensorArrayConcat`
640*   `raw_ops.TensorArrayConcatV2`
641*   `raw_ops.TensorArrayConcatV3`
642*   `raw_ops.TensorArrayGather`
643*   `raw_ops.TensorArrayGatherV2`
644*   `raw_ops.TensorArrayGatherV3`
645*   `raw_ops.TensorArrayGrad`
646*   `raw_ops.TensorArrayGradV2`
647*   `raw_ops.TensorArrayGradV3`
648*   `raw_ops.TensorArrayGradWithShape`
649*   `raw_ops.TensorArrayPack`
650*   `raw_ops.TensorArrayRead`
651*   `raw_ops.TensorArrayReadV2`
652*   `raw_ops.TensorArrayReadV3`
653*   `raw_ops.TensorArrayScatter`
654*   `raw_ops.TensorArrayScatterV2`
655*   `raw_ops.TensorArrayScatterV3`
656*   `raw_ops.TensorArraySize`
657*   `raw_ops.TensorArraySizeV2`
658*   `raw_ops.TensorArraySizeV3`
659*   `raw_ops.TensorArraySplit`
660*   `raw_ops.TensorArraySplitV2`
661*   `raw_ops.TensorArraySplitV3`
662*   `raw_ops.TensorArrayUnpack`
663*   `raw_ops.TensorArrayV2`
664*   `raw_ops.TensorArrayV3`
665*   `raw_ops.TensorArrayWrite`
666*   `raw_ops.TensorArrayWriteV2`
667*   `raw_ops.TensorArrayWriteV3`
668*   `raw_ops.TensorListConcat`
669*   `raw_ops.TensorListConcatLists`
670*   `raw_ops.TensorListConcatV2`
671*   `raw_ops.TensorListElementShape`
672*   `raw_ops.TensorListFromTensor`
673*   `raw_ops.TensorListGather`
674*   `raw_ops.TensorListGetItem`
675*   `raw_ops.TensorListLength`
676*   `raw_ops.TensorListPopBack`
677*   `raw_ops.TensorListPushBack`
678*   `raw_ops.TensorListPushBackBatch`
679*   `raw_ops.TensorListReserve`
680*   `raw_ops.TensorListResize`
681*   `raw_ops.TensorListScatter`
682*   `raw_ops.TensorListScatterIntoExistingList`
683*   `raw_ops.TensorListScatterV2`
684*   `raw_ops.TensorListSetItem`
685*   `raw_ops.TensorListSplit`
686*   `raw_ops.TensorListStack`
687*   `raw_ops.TensorMapErase`
688*   `raw_ops.TensorMapHasKey`
689*   `raw_ops.TensorMapInsert`
690*   `raw_ops.TensorMapLookup`
691*   `raw_ops.TensorMapSize`
692*   `raw_ops.TensorMapStackKeys`
693*   `raw_ops.TensorScatterAdd`
694*   `raw_ops.TensorScatterMax`
695*   `raw_ops.TensorScatterMin`
696*   `raw_ops.TensorScatterSub`
697*   `raw_ops.TensorScatterUpdate`
698*   `raw_ops.TensorSliceDataset`
699*   `raw_ops.TensorStridedSliceUpdate`
700*   `raw_ops.Tile`
701*   `raw_ops.TileGrad`
702*   `raw_ops.Timestamp`
703*   `raw_ops.TokenizerFromLogits`
704*   `raw_ops.TopK`
705*   `raw_ops.TopKV2`
706*   `raw_ops.Transpose`
707*   `raw_ops.TruncateDiv`
708*   `raw_ops.TruncatedNormal`
709*   `raw_ops.UnicodeDecode`
710*   `raw_ops.UnicodeDecodeWithOffsets`
711*   `raw_ops.UnicodeEncode`
712*   `raw_ops.UnicodeTranscode`
713*   `raw_ops.Unique`
714*   `raw_ops.UniqueV2`
715*   `raw_ops.UniqueWithCounts`
716*   `raw_ops.UniqueWithCountsV2`
717*   `raw_ops.Unpack`
718*   `raw_ops.UnsortedSegmentJoin`
719*   `raw_ops.UnsortedSegmentMax`
720*   `raw_ops.UnsortedSegmentMin`
721*   `raw_ops.UnsortedSegmentProd`
722*   `raw_ops.UnsortedSegmentSum`
723*   `raw_ops.UnwrapDatasetVariant`
724*   `raw_ops.UpperBound`
725*   `raw_ops.VarHandleOp`
726*   `raw_ops.Variable`
727*   `raw_ops.VariableShape`
728*   `raw_ops.VariableV2`
729*   `raw_ops.VarIsInitializedOp`
730*   `raw_ops.Where`
731*   `raw_ops.WrapDatasetVariant`
732*   `raw_ops.WriteFile`
733*   `raw_ops.Xdivy`
734*   `raw_ops.Xlog1py`
735*   `raw_ops.Xlogy`
736*   `raw_ops.ZerosLike`
737
738## TensorFlow Text and SentencePiece operators
739
740The following
741[TensorFlow Text](https://www.tensorflow.org/tutorials/tensorflow_text/intro)
742and [SentencePiece](https://github.com/google/sentencepiece) operators are
743supported if you use the Python API for conversion and import those libraries.
744
745TF.Text operators:
746
747*   `CaseFoldUTF8`
748*   `ConstrainedSequence`
749*   `MaxSpanningTree`
750*   `NormalizeUTF8`
751*   `NormalizeUTF8WithOffsetsMap`
752*   `RegexSplitWithOffsets`
753*   `RougeL`
754*   `SentenceFragments`
755*   `SentencepieceOp`
756*   `SentencepieceTokenizeOp`
757*   `SentencepieceTokenizeWithOffsetsOp`
758*   `SentencepieceDetokenizeOp`
759*   `SentencepieceVocabSizeOp`
760*   `SplitMergeTokenizeWithOffsets`
761*   `UnicodeScriptTokenizeWithOffsets`
762*   `WhitespaceTokenizeWithOffsets`
763*   `WordpieceTokenizeWithOffsets`
764
765SentencePiece operators:
766
767*   `SentencepieceGetPieceSize`
768*   `SentencepiecePieceToId`
769*   `SentencepieceIdToPiece`
770*   `SentencepieceEncodeDense`
771*   `SentencepieceEncodeSparse`
772*   `SentencepieceDecode`
773
774The following snippet shows how to convert models with the above operators:
775
776```python
777import tensorflow as tf
778# These imports are required to load operators' definition.
779import tensorflow_text as tf_text
780import sentencepiece as spm
781
782converter = tf.lite.TFLiteConverter.from_keras_model(your_model)
783converter.target_spec.supported_ops = [
784  tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS
785]
786model_data = converter.convert()
787```
788
789On the runtime side, it is also required to link the TensorFlow Text or
790SentencePiece library into the final app or binary.
791
792## User's defined Operators
793
794*Note: This feature is only available from TensorFlow 2.5 version*
795
796If you
797[created your own TensorFlow operators](https://www.tensorflow.org/guide/create_op),
798you can also convert models containing them to TensorFlow Lite by listing
799required operators in the `experimental_select_user_tf_ops` as following:
800
801```python
802import tensorflow as tf
803
804ops_module = tf.load_op_library('./your_ops_library.so')
805
806converter = tf.lite.TFLiteConverter.from_saved_model(your_model)
807converter.target_spec.supported_ops = [
808  tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS
809]
810converter.target_spec.experimental_select_user_tf_ops = [
811    'your_op_name1',
812    'your_op_name2'
813]
814model_data = converter.convert()
815```
816
817On the runtime side, it is also required to link your operators library into the
818final app or binary.
819
820## Add TensorFlow core operators to the allowed list.
821
822If you hit the case where the TensorFlow core operators are not in the above
823allowed
824[list](https://www.tensorflow.org/lite/guide/op_select_allowlist#tensorflow_core_operators),
825you can report the feature request at
826[here](https://github.com/tensorflow/tensorflow/issues) with the names of the
827TensorFlow core operators, not listed in the allowed list.
828
829You can also create own your pull request from the source code. For example, if
830you want to add the `raw_ops.StringToNumber` op in the allowed list, there are
831three places to update like this
832[commit](https://github.com/tensorflow/tensorflow/commit/02e691329517eb5e76522ed8d8bef79ceb082ff8).
833
834(1) Add the operator kernel source code to the `portable_extended_ops_group2`
835BUILD rule.
836
837```
838filegroup(
839    name = "portable_extended_ops_group2",
840    srcs = [
841        ...
842+       "string_to_number_op.cc",
843
844        ...
845    ],
846)
847```
848
849In order to find the relevant operator kernel source file under the
850`tensorflow/core/kernels` directory, you can search the source code location,
851which contains the following kernel declaration with the operator name:
852
853```
854REGISTER_KERNEL_BUILDER(Name("StringToNumber")                 \
855                            .Device(DEVICE_CPU)                \
856                            .TypeConstraint<type>("out_type"), \
857                        StringToNumberOp<type>)
858```
859
860If there are any header files under the `tensorflow/core/kernels` directory,
861required in the operator kernel source code, you need to add the header file
862into the `portable_extended_ops_headers` BUILD rule as the follows:
863
864```
865filegroup(
866    name = "portable_extended_ops_headers",
867    srcs = [
868        ...
869+       "string_util.h",
870
871        ...
872    ],
873)
874```
875
876(2) Add the operator name to the allowed list.
877
878The allowed list is defined in the
879`tensorflow/lite/delegates/flex/allowlisted_flex_ops.cc`. The TensorFlow core
880operator name is need to be listed in order to be allowed through the Select TF
881option.
882
883```
884static const std::set<std::string>* allowlisted_flex_ops =
885    new std::set<std::string>({
886        ...
887+       "StringToNumber",
888
889        ...
890    });
891```
892
893Since the above list is sorted in alphabetical order, it makes sure to place the
894name in the right place.
895
896(3) Add the operator name to this guide page.
897
898To show the operator inclusion to the other developers, this guide page should
899be updated as well. This page is located at the
900`tensorflow/lite/g3doc/guide/op_select_allowlist.md`.
901
902```
903## TensorFlow core operators
904
905The following is an exhaustive list of TensorFlow core operations that are
906supported by TensorFlow Lite runtime with the Select TensorFlow Ops feature.
907
908...
909+*   `raw_ops.StringToNumber`
910...
911```
912
913Since the above list is sorted in alphabetical order, it makes sure to place the
914name in the right place.
915