2017-05-19 14 views

Odpowiedz

0

Można zmienić kształt, aby zająć dodatkowy wymiar, uruchomić dekonwolucji, a następnie przekształcić go z powrotem. W praktyce to działa. Ale nie myślał już naprawdę bardzo trudne, jeśli nie ma żadnych implikacji teoretycznych (ale wydaje się być w porządku, jak również teoretycznie nie zamierzamy „convolve” nad tym wymiarem

x = Reshape((-1, 1))(x) 
x = Permute((3, 1, 2))(x) 
x = Conv2DTranspose(filters, kernel)(x) 
x = Lambda(K.squeeze, arguments={"axis":1})(x) 
1

Zastosowanie Keras backend aby dopasować wejście tensor do 2D transpozycji splot. nie zawsze używać transpozycji operację dla będzie zużywać dużo czasu.

import keras.backend as K 
from keras.layers import Conv2DTranspose 


def Conv1DTranspose(input_tensor, filters, kernel_size, strides=2, padding='same'): 
    x = Lambda(lambda x: K.expand_dims(x, axis=2))(input_tensor) 
    x = Conv2DTranspose(filters=filters, kernel_size=(kernel_size, 1), strides=(strides, 1), padding=padding)(x) 
    x = Lambda(lambda x: K.squeeze(x, axis=2))(x) 
    return x 
+1

** Z recenzji **: Podczas gdy odpowiedzi są zawsze mile widziane, to naprawdę pomaga dostarczyć informacji o tym, jak twój kod rozwiązuje problem pod ręką. Nie każdy może znać twoją dokładną logikę kodowania, ale może zrozumieć twoje ogólne * podejście * lub * pojęcie *. Aby poprawić odpowiedź, podaj [** kontekst otaczający ją **] (https://meta.stackexchange.com/questions/114762) i zobacz artykuł pomocy na temat [** pisania świetnych odpowiedzi **] (http://stackoverflow.com/help/how-to-answer), aby uzyskać wskazówki, jak sprawić, by twoje odpowiedzi się liczyły :) –

1

w mojej odpowiedzi, pewnie jesteś uprzednio używając Conv1D do splotu.

Conv2DTranspose jest nowy w Keras2 kiedyś tak było zostało to zrobione przez połączenie UpSampling2D i warstwy splotu. W StackExchange [Data Science] jest bardzo interesująca dyskusja na temat what are deconvolutional layers (jedna odpowiedź zawiera bardzo przydatne animowane gify).

Sprawdź tę dyskusję na temat "Why all convolutions (no deconvolutions) in "Building Autoencoders in Keras" interesujące. Oto fragment: "Jak już wielokrotnie wyjaśniał Francois, warstwa dekonwolucji jest tylko warstwą splotową z upsamplingiem, nie sądzę, że istnieje oficjalna warstwa dekonwolucji, a wynik jest taki sam". (Dyskusja toczy się dalej, może się okazać, że są one w przybliżeniu, nie jest to dokładnie to samo - też od tego czasu Keras 2 wprowadzono Conv2DTranspose)

Tak jak ja to rozumiem, kombinacja UpSampling1D a następnie Convolution1D jest to, czego szukam, nie widzę powodu, aby iść do 2D.

Jeśli jednak chcesz użyć Conv2DTranspose, musisz najpierw zmienić kształt danych z 1D na 2D, np.

model = Sequential() 
model.add(
    Conv1D(
     filters = 3, 
     kernel_size = kernel_size, 
     input_shape=(seq_length, M),#When using this layer as the first layer in a model, provide an input_shape argument 
    ) 
) 
model.add(
    Reshape((-1, 1, M)) 
) 
model.add(
    keras.layers.Conv2DTranspose(
     filters=M, 
     kernel_size=(10,1), 
     data_format="channels_last" 
    ) 
) 

niewygodne część za korzystanie Conv2DTranspose jest to, że trzeba określić seq_length i nie może mieć go jako brak (arbitralnej serii długość) Niestety, tak samo jest z UpSampling1D dla TensorFlow back-end (Theano wydaje się być jeszcze raz lepiej tutaj - szkoda, że ​​go nie będzie)