创建一个张量,其中每个条目都是其索引的函数

问题描述

我想创建一个D 定义的矩阵 D[i,j]=d(i-j),其中 d 是一些我可以选择的任意函数

用循环可以很容易地完成,但速度很慢。有没有一种用火炬或 numpy 创建这个矩阵的有效方法

解决方法

您可以将该函数(如果向量化)应用于 numpy.indices

import numpy as np

i,j = np.indices((n,m))
D = d(i - j)
,

以下代码向您展示了如何为您的问题配置基于张量的计算过程:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np
import time

#let's define heigth and width of D:
height=45
width=77

#Let's configure inputs for neural network having input shape similar with D but also extra dimension of size 2
syote=keras.Input(shape=(height,width,2))

#Let's make next layer for the network...
valikerros=layers.Dense(1)

#And attach input to this layer...
x=valikerros(syote)
x=layers.Dense(1)(x)
x=layers.Dense(1)(x)

#...and select so many layers you need...according to complexity of the function d,more layers can easily be added...

#Let's make the neural network...
matriisimalli=keras.Model(inputs=syote,outputs=x,name="Special neural network model presenting D including function d")

#And show its strutuce
matriisimalli.summary()

#next let's create ONCE the i,j -matrix index basis for the input,where there is in each i,j coordinate the index values of those coordinates...this need to be done once only,and can also be saved as a variable and be lodaded,if it is essential to avoid usage of for-loops
pohjasyote=np.ones((1,height,2))

for korkeus in range(height):
    for leveys in range(width):
        pohjasyote[0,korkeus,leveys,0]=korkeus
        pohjasyote[0,1]=leveys

#Now let's see how long time it takes to calculate the result for D:

alkuaika=time.time()
result_including_information_of_D=matriisimalli.predict(pohjasyote)
loppuaika=time.time()
print("It took ",loppuaika-alkuaika," seconds to calculate D")

#...and to use the created (rapid tensor-based) structure for calculation let's next train the network...
#using the standard protocol ... where you train the network first to predict d accurately... then verify it works OK ...
#after that simply use it...

#alternative for the training is you arithmetically deduce the correct values for the weight tensors of the model (accurate results..)

...当然请注意,这是一种利用 keras 中张量优势的“技巧”,但是通过遵循代码中的想法,我认为您可以找到一种直接的方法 为您的问题找到解决方案。

如果您发现在计算中很难遵循这个想法(抱歉评论不好),那么首先在计算中使用 D 的大小来测试代码,并比较这个速度是否比当前基于 for-loop 的解决方案更好.如果“matriisimalli”要好得多,那么值得仔细阅读代码并利用其思想来达到更好的性能。