代码之家  ›  专栏  ›  技术社区  ›  Kaique Santos

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

  •  0
  • Kaique Santos  · 技术社区  · 7 年前

    我正在尝试改编这个简单的自动编码器代码: https://github.com/tflearn/tflearn/blob/master/examples/images/autoencoder.py .

    # 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),我该如何求解它?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Julio Daniel Reyes    7 年前

    你的尺寸不对,这就是你所拥有的:

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

    一个简单的匹配修复方法(None,30,30,3)是将最后一个conv_2d更改为有3个卷积滤波器来匹配最后一个维度和一个“有效”填充,使其为30而不是32。这样地:

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