2015-12-04 28 views
10

Sto cercando di applicare la parte dell'esperto del tutorial ai miei dati, ma continuo a riscontrare errori dimensionali. Ecco il codice che porta all'errore.Come posso correggere un errore di quota in TensorFlow?

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 

def conv2d(x, W): 
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

def max_pool_2x2(x): 
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], 
         strides=[1, 2, 2, 1], padding='SAME') 

W_conv1 = weight_variable([1, 8, 1, 4]) 
b_conv1 = bias_variable([4]) 

x_image = tf.reshape(tf_in, [-1,2,8,1]) 

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 
h_pool1 = max_pool_2x2(h_conv1) 

E poi, quando si tenta di eseguire questo comando:

W_conv2 = weight_variable([1, 4, 4, 8]) 
b_conv2 = bias_variable([8]) 

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
h_pool2 = max_pool_2x2(h_conv2) 

Ottengo i seguenti errori:

ValueError        Traceback (most recent call last) 
<ipython-input-41-7ab0d7765f8c> in <module>() 
     3 
     4 h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
----> 5 h_pool2 = max_pool_2x2(h_conv2) 

ValueError: ('filter must not be larger than the input: ', 'Filter: [', Dimension(2), 'x', Dimension(2), '] ', 'Input: [', Dimension(1), 'x', Dimension(4), '] ') 

Solo per alcune informazioni di base, i dati che ho a che fare con è un file CSV in cui ogni riga contiene 10 funzioni e 1 colonna vuota che può essere un 1 o uno 0. Quello che sto cercando di ottenere è una probabilità nella colonna vuota che la colonna sarà uguale a 1.

+0

Che cos'è 'tf_in'? Suppongo che sia l'input originale 1x8. – erickrf

+0

'data = genfromtxt ('cs-training.csv', delimitatore = ',')'. 'A = data.shape [1] -1'. 'tf_in = tf.placeholder (" float ", [None, A])'. – NickTheInventor

risposta

4

È necessario modellare l'input in modo che sia compatibile sia con il tensore di allenamento che con l'uscita. Se si immette la lunghezza 1, l'output deve essere lunghezza 1 (la lunghezza è sostituita per dimensione).

Quando hai a che fare con-

def conv2d(x, W): 
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

def max_pool_2x2(x): 
    return tf.nn.max_pool(x, ksize=[1, 1, 1, 1], 
        strides=[1, 1, 1, 1], padding='SAME') 

Notate come ho cambiato i passi da gigante e la Kdim a [1, 1, 1, 1]. Questo corrisponderà a un output a un input 1 dimensionale e preverrà errori lungo la strada.

Quando si sta definendo la variabile di peso (vedi codice qui sotto) -

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 

si sta andando ad avere per fare i primi 2 numeri sono conformi alla tensore funzione che si sta utilizzando per addestrare il vostro modello , gli ultimi due numeri saranno la dimensione dell'output previsto (uguale alla dimensione dell'input).

W_conv1 = weight_variable([1, 10, 1, 1]) 
b_conv1 = bias_variable([1]) 

Avviso il [1, 10, in principio che significa che la funzione tensore sta per essere un tensore funzione 1x10; gli ultimi due numeri 1, 1] corrispondono alle dimensioni dei tensori/predittori di input e output.

Quando si rimodellare il tensore x_foo (I chiamarla x_ [x primo]), è, per qualsiasi motivo, devono definire come così-

x_ = tf.reshape(x, [-1,1,10,1]) 

Avviso del 1 e 10 nel middle ...1,10,.... Ancora una volta, questi numeri corrispondono alla dimensione del tuo tensore di funzionalità.

Per ogni variabile di polarizzazione, si sceglie il numero finale della variabile definita in precedenza. Ad esempio, se W_conv1 = weight_variable([1, 10, 1, 1]) appare così, prendi il numero finale e inseriscilo nella tua variabile di polarizzazione in modo che possa corrispondere alle dimensioni dell'input. Questo è fatto come così- b_conv1 = bias_variable([1]).

Se avete bisogno di ulteriori spiegazioni si prega di commentare qui sotto.

3

Le dimensioni utilizzate per il filtro non corrispondono all'output del livello nascosto.

Fammi vedere se ti ho capito: il tuo input è composto da 8 funzionalità e tu vuoi rimodellarlo in una matrice 2x4, giusto?

I pesi creati con weight_variable([1, 8, 1, 4]) prevedono un ingresso 1x8, in un canale e producono un'uscita 1x8 in 4 canali (o unità nascoste). Il filtro che stai usando trascina l'input in 2x2 quadrati. Tuttavia, poiché il risultato dei pesi è 1x8, non corrispondono.

Si dovrebbe rimodellare l'ingresso come

x_image = tf.reshape(tf_in, [-1,2,4,1]) 

Ora, l'input è in realtà 2x4 invece di 1x8. Quindi è necessario modificare la forma del peso in (2, 4, 1, hidden_units) per gestire un'uscita 2x4. Produrrà anche un'uscita 2x4 e ora è possibile applicare il filtro 2x2.

Successivamente, il filtro corrisponderà all'emissione dei pesi. Si noti inoltre che sarà necessario modificare la forma della seconda matrice di peso su weight_variable([2, 4, hidden_units, hidden2_units])

+0

ok, quindi quello che ho fatto è stato 'W_conv1 = weight_variable ([2, 4, 1, 8])' e 'b_conv1 = bias_variable ([8])'. Quindi ho fatto questo 'x_image = tf.reshape (tf_in, [-1,2,4,1])'. Poi arrivo a questo e ottengo un errore- 'W_conv2 = weight_variable ([2, 4, 4, 8])', 'b_conv2 = bias_variable ([8])'. Non capisco cosa intendi per hidden_units e hidden_units2 alla fine. Immaginavo di poter inserire quanti ne volevo, ma i tutorial fanno sembrare che raddoppi sempre il numero precedente. Anche in questo caso continuo a ricevere questo errore: "ValueError: Dimensions Dimension (8) and Dimension (4) non sono compatibili". – NickTheInventor

+0

Ooops, ho modificato la mia risposta per correggerlo. La forma dei secondi pesi deve corrispondere alla dimensione del precedente, quindi è '[2, 4, hidden_units, hidden2_units]'. Le unità nascoste sono il numero di unità in ogni livello nascosto, cioè la loro dimensione. Corrispondono al numero di canali che produci in un'immagine. La dimensione ottimale dipende dal problema. – erickrf

+0

Non sto usando le immagini però. Sto usando un file CSV in cui ci sono 8 caratteristiche per riga e una riga da prevedere o data una probabilità che ci sia un 1 invece di uno 0. Puoi usare queste informazioni per chiarire cosa intendi? – NickTheInventor

Problemi correlati