CNN 输出的 keras 错误


尝试

在 Keras 中创建 CNN 模型以创建降噪自动编码器时出现错误。我的 Keras 后端是 TensorFlow。

我的输入数据是一个数字数组。numpy数组取自灰度图像。我使用 sklearn train_test_split 拆分了它。我已经调整了数据的大小并在输出层出现错误。

/opt/anaconda/anaconda3/lib/python3.6/site-
packages/keras/engine/training.py in _standardize_input_data(data, 
names, shapes, check_batch_axis, exception_prefix)
151                             ' to have shape ' + str(shapes[i]) +
152                             ' but got array with shape ' +
--> 153                             str(array.shape))
154     return arrays
155 
ValueError: Error when checking target: expected conv2d_transpose_36 
to have shape (None, 279, 559, 1) but got array with shape (129, 258, 
540, 1)
train_images = os.listdir('data/train')
test_images = os.listdir('data/test')
clean_images = os.listdir('data/train_cleaned')
def set_common_size(img_link, std_size = (258, 540)):
    '''Function will take in the argument of a link to an image and return the image 
    with the standard size.'''
    img = Image.open(img_link)
    img = image.img_to_array(img)
    img = np.resize(img, std_size)
    return img / 255
train_data = []
test_data = []
cleaned_data = []
for img in train_images:
img_file = set_common_size('data/train/' + img)
train_data.append(img_file)
for img in test_images:
    img_file = set_common_size('data/test/' + img)
    test_data.append(img_file)
for img in clean_images:
    img_file = set_common_size('data/train_cleaned/' + img)
    cleaned_data.append(img_file)
train_data = np.asarray(train_data)
test_data = np.asarray(test_data)
cleaned_data = np.asarray(cleaned_data)
x_train, x_test, y_train, y_test = train_test_split(train_data, cleaned_data, test_size=0.1, random_state=42)
input_shape = x_train[0].shape
input_layer = Input(input_shape)
#Layer 1 
layer1 = Conv2D(64, 3, activation='relu', padding='same')(input_layer)
layer1 = MaxPooling2D(2)(layer1)
#Layer 2
layer2 = Conv2D(128, 3, activation='relu', padding='same')(layer1)
layer2 = MaxPooling2D(2)(layer2)
#Layer 3 
layer3 = Conv2D(256, 3, activation='relu', padding='same')(layer2)
layer3 = MaxPooling2D(2)(layer3)
#Bottleneck
encoded = layer3
#Layer1
uplayer1 = UpSampling2D(2)(layer3)
uplayer1 = Conv2DTranspose(256, 2, activation='relu')(uplayer1)
#Layer2
uplayer2 = UpSampling2D(2)(uplayer1)
uplayer2 = Conv2DTranspose(128, 5, activation='relu')(uplayer2)
#Layer3
uplayer3 = UpSampling2D(2)(uplayer2)
uplayer3 = Conv2DTranspose(64, 10, activation='relu')(uplayer3)
output = Conv2DTranspose(1, 3, activation='sigmoid')(uplayer3)
model = Model(input=input_layer, output=output)
print(model.summary())
model.compile(optimizer='adadelta', loss='binary_crossentropy')
model.fit(
        x_train, y_train, 
        epochs=100,
        shuffle=True,
        validation_data=(x_test, y_test)
        )

以下是模型摘要结果:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 258, 540, 1)       0         
_________________________________________________________________
conv2d_60 (Conv2D)           (None, 258, 540, 64)      640       
_________________________________________________________________    
max_pooling2d_37 (MaxPooling (None, 129, 270, 64)      0         
_________________________________________________________________
conv2d_61 (Conv2D)           (None, 129, 270, 128)     73856     
_________________________________________________________________
max_pooling2d_38 (MaxPooling (None, 64, 135, 128)      0         
_________________________________________________________________
conv2d_62 (Conv2D)           (None, 64, 135, 256)      295168    
_________________________________________________________________
max_pooling2d_39 (MaxPooling (None, 32, 67, 256)       0         
_________________________________________________________________
up_sampling2d_37 (UpSampling (None, 64, 134, 256)      0         
_________________________________________________________________
conv2d_transpose_29 (Conv2DT (None, 65, 135, 256)      262400    
_________________________________________________________________
up_sampling2d_38 (UpSampling (None, 130, 270, 256)     0         
_________________________________________________________________
conv2d_transpose_30 (Conv2DT (None, 134, 274, 128)     819328    
_________________________________________________________________
up_sampling2d_39 (UpSampling (None, 268, 548, 128)     0         
___________________________________________________________    
_________________________________________________________________
conv2d_transpose_32 (Conv2DT (None, 279, 559, 1)       577       
=============================================================______
conv2d_transpose_31 (Conv2DT (None, 277, 557, 64)      819264====
Trainable params: 2,271,233
Non-   params: 0

两者不匹配:

  • 模型创建的输出的形状:(279, 559, 1((显示在摘要行conv2d_transpose_32 (Conv2DT (None, 279, 559, 1)实际上是最后一层,但您的控制台输出看起来有点混乱(

  • 您期望的输出的形状:(258, 540, 1((您输入的y_train条目的形状(

使用模型摘要查看与预期形状的偏差从何处开始,并使用正确的padding值获取预期的输出形状。

相关内容

  • 没有找到相关文章

最新更新