2017-08-25 1 views
1

Ich habe die folgende Warnung in Tensorflow: UserWarning: Konvertieren spärlicher indizierterSlices in einen dichten Tensor unbekannter Form. Dies kann eine große Menge an Speicher belegen.Umgang mit UserWarning: Konvertieren spärlicher indizierterSlices in einen dichten Tensor unbekannter Form

Der Grund, warum ich bin immer dies:

# Flatten batch elements to rank-2 tensor where 1st max_length rows 
belong to first batch element and so forth 
all_timesteps = tf.reshape(raw_output, [-1, n_dim]) # 
(batch_size*max_length, n_dim) 
# Indices to last element of each sequence. 
# Index to first element is the sequence order number times max 
sequence length. 
# Index to last element is the index to first element plus sequence 
length. 
row_inds = tf.range(0, batch_size) * max_length + (seq_len - 1) 
# Gather rows with indices to last elements of sequences 
# http://stackoverflow.com/questions/35892412/tensorflow-dense- 
gradient-explanation 
# This is due to gather returning IndexedSlice which is later 
converted 
into a Tensor for gradient 
# calculation. 
last_timesteps = tf.gather(all_timesteps, row_inds) # (batch_size, 
n_dim) 

tf.gather das Problem verursacht. Ich habe es bis jetzt ignoriert, weil meine Architekturen nicht wirklich groß waren. Aber jetzt habe ich größere Architekturen und viele Daten. Ich habe Probleme mit zu wenig Speicherplatz, wenn ich mit Losgrößen größer als 10 trainiere. Ich glaube, dass ich mit dieser Warnung meine Modelle in die GPU einbauen könnte.

Bitte beachten Sie, dass ich Tensorflow 1.3 verwende.

Antwort

0

Ich habe es geschafft, das Problem zu lösen, indem ich tf.dynamic_partition statt tf.gather. Ich ersetzte den obigen Code wie folgt:

# Flatten batch elements to rank-2 tensor where 1st max_length rows belong to first batch element and so forth 
    all_timesteps = tf.reshape(raw_output, [-1, n_dim]) # (batch_size*max_length, n_dim) 
    # Indices to last element of each sequence. 
    # Index to first element is the sequence order number times max sequence length. 
    # Index to last element is the index to first element plus sequence length. 
    row_inds = tf.range(0, batch_size) * max_length + (seq_len - 1) 
    # Creating a vector of 0s and 1s that will specify what timesteps to choose. 
    partitions = tf.reduce_sum(tf.one_hot(row_inds, tf.shape(all_timesteps)[0], dtype='int32'), 0) 
    # Selecting the elements we want to choose. 
    last_timesteps = tf.dynamic_partition(all_timesteps, partitions, 2) # (batch_size, n_dim) 
    last_timesteps = last_timesteps[1] 
Verwandte Themen