0

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

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

4

1 回答 1

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

匹配 (None, 30, 30, 3) 的一个简单解决方法是将最后一个 conv_2d 更改为具有 3 个卷积过滤器以匹配最后一个维度和一个“有效”填充,因此它是 30 而不是 32。像这样:

decoder = tflearn.conv_2d(decoder,3, [3,3], activation='relu', padding='valid')
于 2017-10-17T02:11:58.353 回答