Ich habe eine Notiz gemacht, weil sie nicht herausgekommen ist, als ich sie gegoogelt habe. Ich habe eine diskrete Kosinustransformation (DCT) mit der Klasse chainer.links.Linear erstellt.
Die diskrete Cosinustransformation ist ein Verwandter der Fast Fourier Transform (FFT) und hat dieselbe Bedeutung wie das Extrahieren des Realteils der FFT. (Die ausführliche Erklärung hängt von der Erklärung anderer Personen ab.)
Ich habe bestätigt, dass die Verwendung der folgenden Funktion DCT (Welle) das gleiche Ergebnis wie scipy.fftpack.dct (Welle) zurückgibt. Module werden gemäß Chainer Tutorial importiert.
DCT.py
def DCT(wave):
num_base = np.size(wave.data[0,:])
lDCT = L.Linear(num_base,num_base)
for n in range(num_base):
for k in range(num_base):
lDCT.W.data[k,n] = 2*np.cos(np.pi*k*(2*n+1)/(2*num_base))
lDCT.b.data[:] = 0.0
return lDCT(wave)
Der Punkt, auf den ich gekommen bin, ist -Variables Format zur Übergabe an Linear -Pass als zwei Dimensionen wie np.array ([[Eingabevektor]]) Das ist der Punkt. Mit DCT können (sollten) Sie eine Ketten- oder Fehlerfunktion erstellen. (Noch nicht verwendet)
(Ergänzung: 4. Februar 2016) Ich habe auch eine inverse diskrete Cosinustransformation (Inverse DCT, IDCT) durchgeführt. In Scipy-Dokumente ist scipy.fftpack.dct (Welle) standardmäßig Typ 2. Kehrt zurück. In diesem Fall sollte Typ 3 für die inverse Konvertierung verwendet werden, daher ist die Implementierung wie folgt.
IDCT.py
def IDCT(wave):
num_base = np.size(wave.data[0,:])
lIDCT = L.Linear(num_base,num_base)
for n in range(num_base):
for k in range(num_base):
if(n==0):
lIDCT.W.data[k,n] = 0.0
else:
lIDCT.W.data[k,n] = 2*np.cos(np.pi*(k+0.5)*n/num_base)
lIDCT.b.data[:] = wave.data[0,0]
return lIDCT(wave)
Die Einschränkung dieses IDCT ist, dass es nicht für die Stapelverarbeitung (!) Verwendet werden kann. Ich wünschte, es gäbe eine bessere Umsetzung. ..