2017-05-17 9 views
7

Używam Keras z backendem TensorFlow do zbudowania i uruchomienia sieci neuronowej. Muszę użyć funkcji numpy na moim tensorze wyjściowym w funkcji utraty. Dokładniej, moja funkcja utraty obejmuje znalezienie najbliższych sąsiadów i muszę użyć do tego celu funkcjonalności Keras dla ckdTree. Próbowałem konwertować mój tensor wyjściowy do tablicy numpy przy użyciu K.eval(). Jednak to powoduje błąd InvalidArgument, gdy próbuję skompilować model, jak sądzę, ponieważ nie można uruchomić eval() dla zmiennej symbolicznej.Jak korzystać z funkcji numpy na tensorze keras w funkcji loss?

Oto fragment kodu zabawki, który odtwarza ten błąd.

import numpy as np 
from keras import backend as K 
from keras.models import Sequential 
from keras.layers.core import Flatten, Dense, Reshape 
from keras.optimizers import Adam 

def loss(y_true, y_pred): 

    y_pred_numpy = K.eval(y_pred) 
    # perform some numpy operations on y_pred_numpy 
    return K.constant(0) 

''' Model ''' 

input_shape = (10,10,10,3) 
train_images = np.zeros((1,10,10,10,3)) 
train_labels = np.zeros((1,1,1,1,3)) 

model = Sequential() 
model.add(Flatten(input_shape=input_shape)) 
model.add(Dense(3000, use_bias=True, bias_initializer='zeros')) 
model.add(Reshape((10,10,10,3))) 
model.summary() 

opt = Adam(lr=1E-4) 
model.compile(optimizer=opt, loss=loss) 

Powyższe daje następujący błąd:

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'flatten_3_input' with dtype float 
    [[Node: flatten_3_input = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/gpu:0"]()]] 
    [[Node: reshape_3/Reshape/_11 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_20_reshape_3/Reshape", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

Jak więc mogę pracować z tensorów Keras bez konieczności przepisywania (kompleks) numpy funkcjonalności przy użyciu Keras?

+0

Czy to naprawdę problem w funkcji utraty? Czy próbowałeś kompilacji z 'loss = 'mse''? - Chociaż nie jestem pewna, czy keras zaakceptuje odrętwienia z tensorami. :( –

+0

Czy spojrzałeś na [to pytanie] (https://stackoverflow.com/questions/39921607/how-to-make-a-ustom-activation-function-with-only-python-in-tensorflow) już? –

Odpowiedz

1

Bezpośrednie użycie tej funkcji numpy jest niemożliwe - ponieważ nie jest zaimplementowane ani w Tensorflow ani w Theano. Co więcej - nie ma bezpośredniej korespondencji między tensors i arrays. Tensors należy rozumieć jako zmienne algebraiczne, a jako liczby - tablice numpy. tensor jest rzeczą abstrakcyjną i zastosowanie do niej funkcji numpy jest zwykle niemożliwe.

Ale nadal możesz spróbować ponownie zastosować tę funkcję samodzielnie, używając funkcji keras.backend. Następnie użyjesz poprawnych operacji tensor i nie powinno być problemu.

Powiązane problemy