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