TensorFlow函數(shù):tf.linalg.LinearOperator

2018-08-10 10:56 更新

tf.linalg.LinearOperator函數(shù)

LinearOperator類

別名:

  • tf.contrib.linalg.LinearOperator類
  • tf.linalg.LinearOperator類

定義在:tensorflow/python/ops/linalg/linear_operator.py.

請參閱指南:線性代數(shù)(contrib)>LinearOperator

定義[batch of]線性運算符[s]的基類.

LinearOperator的子類提供對(batch)矩陣的常用方法的訪問,而不需要具體化矩陣.這允許:

  • 矩陣自由計算
  • 利用特殊結(jié)構(gòu)的操作符,同時為用戶提供一致的API.

子類

要啟用公共方法,子類應(yīng)實現(xiàn)方法的前導(dǎo)下劃線版本.除了省略name="..."外,參數(shù)簽名應(yīng)該相同.例如,要啟用matmul(x, adjoint=False, name="matmul"),子類應(yīng)該實現(xiàn)_matmul(x, adjoint=False).

履約合同

子類應(yīng)該只實現(xiàn)斷言方法(例如,assert_non_singular),如果它們可以在不到O(N^3)時間內(nèi)完成.

類文檔字符串應(yīng)包含計算復(fù)雜性的解釋.由于這是一個高性能庫,因此應(yīng)注意細(xì)節(jié),解釋可以包括常量和Big-O表示法.

形狀兼容性

LinearOperator子類應(yīng)該在具有兼容形狀的[batch]矩陣上運行.類文檔字符串應(yīng)該定義兼容形狀的含義.某些子類可能不支持批處理.

一個例子是:

x是一個具有matmulif的兼容形狀的批處理矩陣,如果滿足下列條件:

operator.shape = [B1,...,Bb] + [M, N],  b >= 0,
x.shape =   [B1,...,Bb] + [N, R]

rhs是一個具有solveif的兼容形狀的批處理矩陣,如果滿足下列條件:

operator.shape = [B1,...,Bb] + [M, N],  b >= 0,
rhs.shape =   [B1,...,Bb] + [M, R]

子類的示例文檔字符串

該運算符的作用類似于(batch)矩陣A,其形狀為[B1,...,Bb, M, N],適合某些b >= 0.第一個b指數(shù)索引一個批處理成員.對于每個批次索引(i1,...,ib),A[i1,...,ib, : :],都是一個m x n矩陣.同樣,該矩陣A可能沒有實現(xiàn),但為了識別和使用兼容的參數(shù),形狀是相關(guān)的.

例子:

some_tensor = ... shape = ????
operator = MyLinOp(some_tensor)

operator.shape()
==> [2, 4, 4]

operator.log_abs_determinant()
==> Shape [2] Tensor

x = ... Shape [2, 4, 5] Tensor

operator.matmul(x)
==> Shape [2, 4, 5] Tensor

矩陣屬性提示

該LinearOperator是使用表單is_X的布爾標(biāo)志初始化,用于X = non_singular, self_adjoint, positive_definite, square,它們具有以下含義:

  • 如果is_X == True,則調(diào)用方應(yīng)該期望運算符擁有屬性X.這是一個應(yīng)該實現(xiàn)的承諾,但不是運行時斷言.例如,有限浮點精度可能導(dǎo)致這些承諾被違反.
  • 如果is_X == False,則調(diào)用方應(yīng)該期望運算符沒有X.
  • 如果is_X == None(默認(rèn)值),則調(diào)用方應(yīng)該沒有任何期望.

屬性

  • batch_shape

    LinearOperator的批處理維度的 TensorShape.

    如果這個運算符的作用類似于具有A.shape = [B1,...,Bb, M, N]的批量矩陣A,則返回TensorShape([B1,...,Bb]),相當(dāng)于A.get_shape()[:-2]

    返回:

    TensorShape,靜態(tài)確定,可能是未定義的.

  • domain_dimension

    此運算符的域的維度(在向量空間的意義上).

    如果這個運算符的作用類似于帶有A.shape = [B1,...,Bb, M, N]的批量矩陣A,則返回N.

    返回:

    Dimension對象.

  • dtype

    LinearOperator處理的張量在DType.

  • graph_parents

    LinearOperator的圖依賴關(guān)系列表.

  • is_non_singular
  • is_positive_definite
  • is_self_adjoint
  • is_square

    返回True/False,取決于此運算符是否為正方形.

  • name

    名稱前置于由LinearOperator創(chuàng)建的所有操作.

  • range_dimension

    此運算符范圍的維度(在向量空間意義上).

    如果這個運算符的作用類似于具有A.shape = [B1,...,Bb, M, N]的批量矩陣A,則返回M.

    返回:

    Dimension對象.

  • shape

    這個LinearOperator的TensorShape.

    如果此運算符的作用類似于帶有A.shape = [B1,...,Bb, M, N]的批量矩陣A,則返回TensorShape([B1,...,Bb, M, N]),相當(dāng)于A.get_shape().

    返回:

    TensorShape,靜態(tài)確定,可能是未定義的.

  • tensor_rank

    對應(yīng)于該運算符的矩陣的秩(在張量的意義上).

    如果這個運算符的作用類似于具有A.shape = [B1,...,Bb, M, N]的批量矩陣A,則返回b + 2.

    參數(shù):

    • name:這個運算的名字.

    返回:

    Python整數(shù),如果張量的秩未定義,則為None.

方法

  • __init__
    __init__(
        dtype,
        graph_parents=None,
        is_non_singular=None,
        is_self_adjoint=None,
        is_positive_definite=None,
        is_square=None,
        name=None
    )

    該方法用于初始化LinearOperator.

    這是子類使用的私有方法,子類應(yīng)復(fù)制粘貼此__init__文檔.

    參數(shù):

    • dtype:該LinearOperator的類型,matmul和solve的參數(shù)必須是這種類型.
    • graph_parents:LinearOperator的圖形先決條件的Python列表,通常在初始化期間傳遞的張量.
    • is_non_singular:期望此運算符是非單數(shù)的.
    • is_self_adjoint:期望此運算符等于其hermitian轉(zhuǎn)置;如果dtype是真的,這相當(dāng)于對稱.
    • is_positive_definite:期望此運算符是正定的,意味著二次型x^H A x對所有非零x都有正實部.注意,我們不要求運算符是自共軛的,是正定的.請參閱:https://en.wikipedia.org/wiki/Positive-definite_matrix#Extension_for_non-symmetric_matrices
    • is_square:期望此運算符的作用類似于square [batch]矩陣.
    • name:該LinearOperator的名稱.

    可能引發(fā)的異常:

    • ValueError:如果graph_parents的任何成員是None,而不是一個Tensor.
    • ValueError:如果提示設(shè)置不正確.
  • add_to_tensor
    add_to_tensor(
        x,
        name='add_to_tensor'
    )

    將此運算符表示的矩陣添加到x,相當(dāng)于A + x.

    參數(shù):

    • x:具有相同dtype和形狀廣播的Tensor,可廣播到self.shape.
    • name:給操作的名字.

    返回:

    具有廣播形狀并且與self有相同dtype的張量.

  • assert_non_singular
    assert_non_singular(name='assert_non_singular')

    返回一個運算,它可以斷言此運算符是非單數(shù)的.

    如果滿足以下條件,則這個運算符被認(rèn)為是非單數(shù)的:

    ConditionNumber < max{100, range_dimension, domain_dimension} * eps,
    eps := np.finfo(self.dtype.as_numpy_dtype).eps

    參數(shù):

    • name:要添加到創(chuàng)建的ops的字符串名稱.

    返回:

    返回一個Assert Op,當(dāng)運行時,如果操作符是單數(shù)的話,將引發(fā)一個InvalidArgumentError.

  • assert_positive_definite
    assert_positive_definite(name='assert_positive_definite')

    返回一個運算,斷言此運算符是正定的.

    這里,正定意味著二次形式x^H A x對于所有非零x都具有正實部.請注意,我們不要求運算符是自共軛的,是正定的.

    參數(shù):

    • name:這個運算的名稱.

    返回:

    返回一個Assert Op,即在運行時,如果運算符不正定,則會引發(fā)InvalidArgumentError.

  • assert_self_adjoint
    assert_self_adjoint(name='assert_self_adjoint')

    返回一個運算,它斷言此運算符是自共軛的.

    在這里,我們檢查此運算符是否與其hermitian轉(zhuǎn)置完全相同.

    參數(shù):

    • name:要添加到創(chuàng)建的ops的字符串名稱.

    返回:

    返回一個Assert Op,即在運行時,將引發(fā)一個InvalidArgumentError,如果運算符不是自共軛的.

  • batch_shape_tensor
    batch_shape_tensor(name='batch_shape_tensor')

    在運行時確定的此運算符的批處理維度的形狀.

    如果這個操作符的作用類似于帶有A.shape = [B1,...,Bb, M, N]的批量矩陣A,則將返回一個具有[B1,...,Bb]的Tensor.

    參數(shù):

    • name:表示這個運算的名字.

    返回:

    返回int32類型的Tensor.

  • determinant
    determinant(name='det')

    每個批次成員的決定因素.每個批處理成員的行列式.

    參數(shù):

    • name:這個運算的名字.

    返回:

    具有形狀self.batch_shape并且與self具有相同dtype的Tensor

    可能引發(fā)的異常:

    • NotImplementedError:如果self.is_square是False.
  • diag_part
    diag_part(name='diag_part')

    有效地獲取此運算符的 [批] 對角線部分.

    如果這個操作符有形狀 [B1,..., Bb, M, N], 這返回一個張量對角線, 形狀 [B1,..., Bb, min (M, N)], 其中對角線 [B1,..., bb, i] = 自. to_dense () [B1,..., Bb, 我, 我].


    有效地獲得此運算符的[batch]對角線部分.

    如果此運算符具有形狀[B1,...,Bb, M, N],則返回Tensor diagonal,其形狀為[B1,...,Bb, min(M, N)],其中diagonal[b1,...,bb, i] = self.to_dense()[b1,...,bb, i, i].

    my_operator = LinearOperatorDiag([1., 2.])
    
    # Efficiently get the diagonal
    my_operator.diag_part()
    ==> [1., 2.]
    
    # Equivalent, but inefficient method
    tf.matrix_diag_part(my_operator.to_dense())
    ==> [1., 2.]

    參數(shù):

    • name:這個運算的名字.

    返回:

    • diag_part:一個與self具有相同dtype的Tensor.
  • domain_dimension_tensor
    domain_dimension_tensor(name='domain_dimension_tensor')

    此運算符的域的維度(在向量空間的意義上).

    在運行時確定.

    如果這個操作符的作用類似于具有A.shape = [B1,...,Bb, M, N]的批量矩陣A,則返回N.

    參數(shù):

    • name:這個運算的名字.

    返回:

    返回int32類型的Tensor.

  • log_abs_determinant
    log_abs_determinant(name='log_abs_det')

    記錄每個批處理成員的行列式的對數(shù)絕對值.

    參數(shù):

    • name:這個運算的名字.

    返回:

    返回具有形狀self.batch_shape并且和self具有相同dtype的Tensor.

    可能引發(fā)的異常:

    • NotImplementedError:如果self.is_square是False.
  • matmul
    matmul(
        x,
        adjoint=False,
        adjoint_arg=False,
        name='matmul'
    )

    使用左乘法:x --> Ax轉(zhuǎn)換[batch]矩陣x.

    # Make an operator acting like batch matrix A.  Assume A.shape = [..., M, N]
    operator = LinearOperator(...)
    operator.shape = [..., M, N]
    
    X = ... # shape [..., N, R], batch matrix, R > 0.
    
    Y = operator.matmul(X)
    Y.shape
    ==> [..., M, R]
    
    Y[..., :, r] = sum_j A[..., :, j] X[j, r]

    參數(shù):

    • x:具有兼容的形狀,并且和self具有相同dtype的Tensor.
    • adjoint:Python bool,如果True,則左邊乘以伴隨:A^H x.
    • adjoint_arg:Python bool,如果True,則計算A x^H,其中x^H是hermitian轉(zhuǎn)置(轉(zhuǎn)置和復(fù)合共軛).
    • name:這個運算的名字.

    返回:

    返回具有形狀[..., M, R],并且和delf具有相同dtype的Tensor.

  • matvec
    matvec(
        x,
        adjoint=False,
        name='matvec'
    )

    用左乘法:x --> Ax變換[batch]向量x.

    # Make an operator acting like batch matric A.  Assume A.shape = [..., M, N]
    operator = LinearOperator(...)
    
    X = ... # shape [..., N], batch vector
    
    Y = operator.matvec(X)
    Y.shape
    ==> [..., M]
    
    Y[..., :] = sum_j A[..., :, j] X[..., j]

    參數(shù):

    • x:具有兼容的形狀,并且和self具有相同dtype的Tensor.x被視為[batch]向量,對每一組前導(dǎo)維度都有意義,最后一個維度定義向量.
    • adjoint:Python bool,如果為True,左邊乘以伴隨:A^H x.
    • name:這個運算的名字.

    返回:

    返回具有形狀[..., M],并且和self具有相同dtype的Tensor.

  • range_dimension_tensor
    range_dimension_tensor(name='range_dimension_tensor')

    此運算符范圍的維度(在向量空間意義上).

    在運行時確定.

    如果這個運算符的作用類似于具有A.shape = [B1,...,Bb, M, N]的批量矩陣A,則返回M.

    參數(shù):

    • name:這個運算的名字.

    返回:

    返回int32類型的Tensor.

  • shape_tensor
    shape_tensor(name='shape_tensor')

    該LinearOperator的形狀,在運行時確定.

    如果此操作符的作用類似于具有A.shape = [B1,...,Bb, M, N]的批次矩陣A,則返回一個具有[B1,...,Bb, M, N]的Tensor,相當(dāng)于tf.shape(A).

    參數(shù):

    • name:這個運算的名字.

    返回:

    返回int32類型的Tensor

  • solve
    solve(
        rhs,
        adjoint=False,
        adjoint_arg=False,
        name='solve'
    )

    求解(精確或近似)R(批量)方程組:A X = rhs.

    如果A條件良好,則返回的Tensor將接近一個精確的解決方案.否則親密程度會有所不同.

    例子:

    # Make an operator acting like batch matrix A.  Assume A.shape = [..., M, N]
    operator = LinearOperator(...)
    operator.shape = [..., M, N]
    
    # Solve R > 0 linear systems for every member of the batch.
    RHS = ... # shape [..., M, R]
    
    X = operator.solve(RHS)
    # X[..., :, r] is the solution to the r'th linear system
    # sum_j A[..., :, j] X[..., j, r] = RHS[..., :, r]
    
    operator.matmul(X)
    ==> RHS

    參數(shù):

    • rhs:Tensor與此運算符和兼容形狀相同dtype的Tensor.rhs被視為[batch]矩陣,表示每組前導(dǎo)維度;后兩個維度定義矩陣.
    • adjoint:Python bool,如果為True,則解決涉及這個LinearOperator伴隨的系統(tǒng):A^H X = rhs.
    • adjoint_arg:Python bool,如果為True,則解決A X = rhs^H,其中rhs^H是hermitian轉(zhuǎn)置(轉(zhuǎn)置和復(fù)共軛).
    • name:用于此方法添加的運算的名稱范圍.

    返回:

    返回具有形狀[...,N, R],并且和rhs具有相同dtype的Tensor.

    可能引發(fā)的異常:

    • NotImplementedError:如果self.is_non_singular或is_square為False.
  • solvevec
    solvevec(
        rhs,
        adjoint=False,
        name='solve'
    )

    盡最大努力解決單個方程式:A X = rhs.

    如果A條件良好,返回的Tensor將接近一個精確的解決方案.否則親密程度會有所不同.

    例子:

    # Make an operator acting like batch matrix A.  Assume A.shape = [..., M, N]
    operator = LinearOperator(...)
    operator.shape = [..., M, N]
    
    # Solve one linear system for every member of the batch.
    RHS = ... # shape [..., M]
    
    X = operator.solvevec(RHS)
    # X is the solution to the linear system
    # sum_j A[..., :, j] X[..., j] = RHS[..., :]
    
    operator.matvec(X)
    ==> RHS

    參數(shù):

    • rhs:與此運算符具有相同dtype的Tensor,rhs被視為[batch]向量,對每一組前導(dǎo)維度都有意義,最后一個維度定義向量.
    • adjoint:Python bool,如果為True,則解決涉及這個LinearOperator伴隨的系統(tǒng):A^H X = rhs.
    • name:用于此方法添加的運算的名稱范圍.

    返回:

    返回具有形狀[...,N],并且和rhs具有相同dtype的Tensor.

    可能引發(fā)的異常:

    • NotImplementedError:如果self.is_non_singular或is_square是False.
  • tensor_rank_tensor
    tensor_rank_tensor(name='tensor_rank_tensor')

    對應(yīng)于該運算符的矩陣的秩(在張量的意義上).

    如果這個操作符的作用類似于具有A.shape = [B1,...,Bb, M, N]的批量矩陣A,則返回b + 2.

    參數(shù):

    • name:這個運算的名字.

    返回:

    返回int32類型的Tensor,在運行時確定.

  • to_dense
    to_dense(name='to_dense')

    返回表示此運算符的密集(批處理)矩陣.

  • trace
    trace(name='trace')

    線性操作的跟蹤,等于self.diag_part()的總和.

    如果運算符為平方,則這也是特征值的總和.

    參數(shù):

    • name:這個運算的名字.

    返回:

    返回形狀為[B1,...,Bb]的Tensor,與self具有相同的dtype.

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號