问题描述
我想创建一个由 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”要好得多,那么值得仔细阅读代码并利用其思想来达到更好的性能。