2017-10-17 6 views
0

j'essaye d'adapter ce code simple d'encodeur automatique: https://github.com/tflearn/tflearn/blob/master/examples/images/autoencoder.py. J'essaye de changer le code d'une manière qui utilise des couches convolutif et qui a une entrée de 488 images * 30 hauteur * 30 largeur * 3 canaux de couleur (RVB) [488, 30, 30, 3] et produit un nouveau image qui ressemble mais différente de l'original. Je n'utilise aucune sorte de jeu de données de validation (je ne me soucie pas de surapprentissage et je ne vois pas d'autre raison pour utiliser un jeu de données de validation que d'aider à prévenir le surapprentissage.) Je peux me tromper complètement, je voudrais savoir Si c'est le cas). Je suis un débutant, désolé de l'encodeur mal construit et décodeur.Essayer d'adapter le code de tflearn, erreur de forme

# Data loading and preprocessing 
from reading import * 
X = getDataColor() #A function that read my img data 
total_samples = len(X) 
np.random.seed(42) # For debugging and visualization purposes 
X = np.reshape(X, newshape=[total_samples, 30, 30, 3]) 
X = X.astype('float32')/255. #For scaling 

# Building the encoder 
encoder = tflearn.input_data(shape=[None, 30, 30, 3]) 
encoder = tflearn.conv_2d(encoder,16, 3, activation='relu', padding='same', regularizer='L2') 
encoder = tflearn.max_pool_2d(encoder,[2,2], padding='same') 
encoder = tflearn.conv_2d(encoder,8, [3,3], activation='relu', padding='same') 
encoder = tflearn.max_pool_2d(encoder,[2,2], padding='same') 
encoder = tflearn.conv_2d(encoder,8, [3,3], activation='relu', padding='same') 
encoder = tflearn.max_pool_2d(encoder,[2,2], padding='same') 


# Building the decoder 
decoder = tflearn.conv_2d(encoder,8, [3,3], activation='relu', padding='same') 
decoder = tflearn.upsample_2d(decoder,[2,2]) 
decoder = tflearn.conv_2d(decoder,8, [3,3], activation='relu', padding='same') 
decoder = tflearn.upsample_2d(decoder,[2,2]) 
decoder = tflearn.conv_2d(decoder,16, [3,3], activation='relu', padding='same') 
decoder = tflearn.upsample_2d(decoder,[2,2]) 
decoder = tflearn.conv_2d(decoder,1, [3,3], activation='relu', padding='same') 

# Regression, with mean square error 
net = tflearn.regression(decoder, optimizer='adam', learning_rate=0.001, 
         loss='mean_square', metric=None) 



# Training the auto encoder 
model = tflearn.DNN(net, tensorboard_verbose=0) 


gen_noise = np.random.uniform(-1, 1., size=[total_samples, 30, 30, 3]) 
#I'm trying to generate images based on this noise 
#I couldn't think of any other way... 
model.fit(gen_noise, X, n_epoch =10000, 
       run_id="auto_encoder", batch_size=total_samples) 

Lorsque vous essayez d'exécuter le code complet je reçois l'erreur:

Log directory: /tmp/tflearn_logs/ 
--------------------------------- 
Training samples: 488 
Validation samples: 0 
-- 
Traceback (most recent call last): 
    File "autoCNN.py", line 66, in <module> 
    run_id="auto_encoder", batch_size=total_samples) 
    File "F:\Users\Kai\Miniconda3\lib\site-packages\tflearn\models\dnn.py", line 216, in fit 
    callbacks=callbacks) 
    File "F:\Users\Kai\Miniconda3\lib\site-packages\tflearn\helpers\trainer.py", line 339, in fit 
    show_metric) 
    File "F:\Users\Kai\Miniconda3\lib\site-packages\tflearn\helpers\trainer.py", line 818, in _train 
    feed_batch) 
    File "F:\Users\Kai\Miniconda3\lib\site-packages\tensorflow\python\client\session.py", line 789, in run 
    run_metadata_ptr) 
    File "F:\Users\Kai\Miniconda3\lib\site-packages\tensorflow\python\client\session.py", line 975, in _run 
    % (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape()))) 
ValueError: Cannot feed value of shape (488, 30, 30, 3) for Tensor 'TargetsData/Y:0', which has shape '(?, 32, 32, 1)' 

Pourquoi le 'TargetsData/Y: 0' ne possède la forme et comment pourrait-(, 32, 32, 1?) je le résous?

Répondre

1

Vos dimensions ne sont pas bonnes, c'est ce que vous avez:

_________________________________________________________________ 
Layer (type)     Output Shape    Param # 
================================================================= 
conv2d_1 (Conv2D)   (None, 30, 30, 16)  448  
_________________________________________________________________ 
max_pooling2d_1 (MaxPooling2 (None, 15, 15, 16)  0   
_________________________________________________________________ 
conv2d_2 (Conv2D)   (None, 15, 15, 8)   1160  
_________________________________________________________________ 
max_pooling2d_2 (MaxPooling2 (None, 8, 8, 8)   0   
_________________________________________________________________ 
conv2d_3 (Conv2D)   (None, 8, 8, 8)   584  
_________________________________________________________________ 
max_pooling2d_3 (MaxPooling2 (None, 4, 4, 8)   0   
_________________________________________________________________ 
conv2d_4 (Conv2D)   (None, 4, 4, 8)   584  
_________________________________________________________________ 
up_sampling2d_1 (UpSampling2 (None, 8, 8, 8)   0   
_________________________________________________________________ 
conv2d_5 (Conv2D)   (None, 8, 8, 8)   584  
_________________________________________________________________ 
up_sampling2d_2 (UpSampling2 (None, 16, 16, 8)   0   
_________________________________________________________________ 
conv2d_6 (Conv2D)   (None, 16, 16, 16)  1168  
_________________________________________________________________ 
up_sampling2d_3 (UpSampling2 (None, 32, 32, 16)  0   
_________________________________________________________________ 
conv2d_7 (Conv2D)   (None, 32, 32, 1)   145  
================================================================= 

Une solution facile à assortir (None, 30, 30, 3) est de changer la dernière conv_2d d'avoir 3 filtres convolutifs pour correspondre la dernière dimension et un remplissage "valide" donc il est 30 au lieu de 32. Comme ceci:

decoder = tflearn.conv_2d(decoder,3, [3,3], activation='relu', padding='valid') 
+0

Cela a fonctionné! Merci: D –

+1

Glad cela a fonctionné! Si vous avez trouvé cela utile, veuillez accepter la réponse :) –