试图适应tflearn代码,形状错误

问题描述:

我正试图适应这个简单的自动编码器代码: https://github.com/tflearn/tflearn/blob/master/examples/images/autoencoder.py。 我试图改变代码的方式,它使用卷积图层和输入488图像* 30高度* 30宽度* 3颜色通道(RGB)[488,30,30,3]并输出一个新的图像与原始图像看起来相似但不同。我没有使用任何类型的验证数据集(我不关心过度拟合,除了帮助防止过度拟合,我没有看到使用验证数据集的其他原因。我可能是完全错误的,我想知道如果是这样的话)。我是一个新手,对于编译器和解码器结构不好的人抱歉。试图适应tflearn代码,形状错误

# 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) 

当试图运行完整的代码我得到的错误:

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)' 

为什么 'TargetsData/Y:0' 具有形状和怎么可能(32,32,1?)我解决了它?

你的尺寸是不正确的,这是你拥有的一切:

_________________________________________________________________ 
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  
================================================================= 

一个简单的办法,以匹配(无,30,30,3)是改变过去conv_2d有3个卷积过滤器来匹配最后一个维度和一个“有效”填充,所以它是30而不是32.像这样:

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

它的工作!谢谢:D –

+1

很高兴工作!如果你发现这个有用的请接受答案:) –