So che questa domanda è stata posta in varie forme, ma non riesco a trovare alcuna risposta che riesca a capire e utilizzare. Quindi, mi perdoni se questa è una domanda fondamentale, perche' sono un novizio di questi strumenti (Theano/keras)Come monitorare i valori del tensore in Theano/Keras?
problema da risolvere
Supervisione delle variabili nel Reti Neurali (ad esempio ingresso/dimenticare/valori porta di uscita in LSTM)
Quello che sto attualmente ricevendo
non importa in quale fase sto ottenendo quei valori, sto ottenendo qualcosa di simile:
Elemwise{mul,no_inplace}.0
Elemwise{mul,no_inplace}.0
[for{cpu,scan_fn}.2, Subtensor{int64::}.0, Subtensor{int64::}.0]
[for{cpu,scan_fn}.2, Subtensor{int64::}.0, Subtensor{int64::}.0]
Subtensor{int64}.0
Subtensor{int64}.0
C'è un modo che non posso monitorare (ad es. stampare su stdout, scrivere su un file, ecc.)?
Possibile soluzione
Sembra come callback in Keras può fare il lavoro, ma non funziona neanche per me. Sto diventando stessa cosa come sopra
mia ipotesi
sembra che io sto facendo errori molto semplici.
Grazie mille in anticipo, a tutti.
AGGIUNTO
In particolare, sto cercando di monitorare input/dimenticare valori gating/uscita in LSTM. ho scoperto che LSTM.step() è per calcolare questi valori:
def step(self, x, states):
h_tm1 = states[0] # hidden state of the previous time step
c_tm1 = states[1] # cell state from the previous time step
B_U = states[2] # dropout matrices for recurrent units?
B_W = states[3] # dropout matrices for input units?
if self.consume_less == 'cpu': # just cut x into 4 pieces in columns
x_i = x[:, :self.output_dim]
x_f = x[:, self.output_dim: 2 * self.output_dim]
x_c = x[:, 2 * self.output_dim: 3 * self.output_dim]
x_o = x[:, 3 * self.output_dim:]
else:
x_i = K.dot(x * B_W[0], self.W_i) + self.b_i
x_f = K.dot(x * B_W[1], self.W_f) + self.b_f
x_c = K.dot(x * B_W[2], self.W_c) + self.b_c
x_o = K.dot(x * B_W[3], self.W_o) + self.b_o
i = self.inner_activation(x_i + K.dot(h_tm1 * B_U[0], self.U_i))
f = self.inner_activation(x_f + K.dot(h_tm1 * B_U[1], self.U_f))
c = f * c_tm1 + i * self.activation(x_c + K.dot(h_tm1 * B_U[2], self.U_c))
o = self.inner_activation(x_o + K.dot(h_tm1 * B_U[3], self.U_o))
with open("test_visualization.txt", "a") as myfile:
myfile.write(str(i)+"\n")
h = o * self.activation(c)
return h, [h, c]
E come è nel codice di cui sopra, ho tentato di scrivere il valore di i in un file, ma ha dato solo a me valori come:
Elemwise{mul,no_inplace}.0
[for{cpu,scan_fn}.2, Subtensor{int64::}.0, Subtensor{int64::}.0]
Subtensor{int64}.0
Così ho provato i.eval() o i.get_value(), ma entrambi non sono riusciti a darmi valori.
.eval() mi ha dato questo:
theano.gof.fg.MissingInputError: An input of the graph, used to compute Subtensor{::, :int64:}(<TensorType(float32, matrix)>, Constant{10}), was not provided and not given a value.Use the Theano flag exception_verbosity='high',for more information on this error.
e .get_value() mi ha dato questo:
AttributeError: 'TensorVariable' object has no attribute 'get_value'
Così ho fatto marcia indietro quelle catene (che le chiamate di linea che funzioni ..) e ho cercato di ottenere valori ad ogni passo che ho trovato, ma invano.
Mi sento come se fossi in alcune insidie di base.
Come si ottengono i valori? Includi il tuo codice, sembra che tu stia stampando le variabili simboliche e non i loro valori. –
Grazie mille per la tua risposta veloce @MatiasValdenegro. Ho aggiornato la mia domanda sopra con codici e messaggi di errore. – totuta