Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 为什么';上采样2D Keras层不起作用吗?_Image_Tensorflow_Keras_Convolution_Autoencoder - Fatal编程技术网

Image 为什么';上采样2D Keras层不起作用吗?

Image 为什么';上采样2D Keras层不起作用吗?,image,tensorflow,keras,convolution,autoencoder,Image,Tensorflow,Keras,Convolution,Autoencoder,我试图在keras中构建卷积自动编码器,但它似乎无法正常工作。 首先,代码如下: from keras.models import Sequential from keras.layers import Reshape from keras.layers import Flatten from keras.layers import Dense from keras.layers import Conv2D from keras.layers import MaxPooling2D from k

我试图在keras中构建卷积自动编码器,但它似乎无法正常工作。 首先,代码如下:

from keras.models import Sequential
from keras.layers import Reshape
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import UpSampling2D
from keras.optimizers import RMSprop
from keras.losses import categorical_crossentropy
import numpy as np
import matplotlib.pyplot as plt
import scipy
import h5py
import random
from glob import glob
from tqdm import tqdm
from os import getcwd

learning_rate = 0.001
epochs = 10000
batch_size = 200
data_len = 400
training_data = []

for filename in tqdm(glob('D:/AI/Celeba/*.jpg')[0:data_len],desc='loading images'):
    im = scipy.misc.imread(filename)
    im = scipy.misc.imresize(im,(128,128))
    training_data.append(im)
training_data = np.array(training_data)
example = random.choice(training_data)

autoencoder = Sequential()
autoencoder.add(Conv2D(32,5,activation='relu',input_shape=(128,128,3)))
autoencoder.add(MaxPooling2D())
autoencoder.add(Conv2D(16,5,activation='relu'))
autoencoder.add(MaxPooling2D())
autoencoder.add(Conv2D(8,5,activation='relu'))
autoencoder.add(MaxPooling2D())
autoencoder.add(Conv2D(4,5,activation='relu'))
autoencoder.add(MaxPooling2D())
autoencoder.add(Conv2D(2,3,activation='relu'))
autoencoder.add(MaxPooling2D())
autoencoder.add(Flatten())
autoencoder.add(Dense(32,activation='sigmoid'))
autoencoder.add(Dense(32,activation='sigmoid'))
autoencoder.add(Reshape((4,4,2)))
autoencoder.add(Conv2D(2,3,activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(4,5,activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(8,5,activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(16,5,activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(32,5,activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(3,5,activation='relu'))
autoencoder.compile(optimizer=RMSprop(lr=learning_rate),loss=categorical_crossentropy)

for epoch in range(epochs):
    autoencoder.fit(x=training_data,y=training_data,batch_size=batch_size,epochs=1)
    output = autoencoder.predict(np.array([example]))[0]
    fig = plt.figure()
    fig.suptitle('training step: {}'.format(epoch+1))
    a=fig.add_subplot(1,2,1)
    imgplot = plt.imshow(example)
    a.set_title('Original')
    a=fig.add_subplot(1,2,2)
    imgplot = plt.imshow(output)
    imgplot.set_clim(0.0,0.7)
    a.set_title('Reconstruction')
    plt.savefig(getcwd()+'/training/{}.png'.format(epoch))

    if (epoch+1)%10 == 0:
        autoencoder.save(getcwd()+'/saved/model.h5')
所以我的问题是模型输出了错误的形状。输出形状应为
[batch\u size,2,2,3]
时,输出形状为
[batch\u size,128,128,3]
。 我已经进行了一些调试,并找出了模型输出错误尺寸的一些可能原因:

  • UpSampling2D
    层没有做任何事情
  • 由于某种原因,最后一个
    Conv2D
    层将图像的大小减小了2
  • 有人知道我该怎么解决这个问题吗

    附言。 在写这篇文章时,我意识到我的调试结果可以用另一种方式来解释:

  • UpSampling2D
    层工作正常
  • 所有的
    Conv2D
    层都将图像的大小减小了2,因此图像始终保持2*2的高度

  • 在Conv2D层中,您正在减小输入的大小

    在卷积运算中,如果您使用32 x 32的图像,并应用5x5的内核。输出图像的大小为28×28

    3乘3的内核将生成30乘30的图像,4乘4将生成29乘29的图像

    如果要防止卷积减小,可以在卷积中添加填充

    提供了一个很好的资源来了解是否要填充

    另外,当大小为奇数时,知道下采样是向下舍入还是向上舍入也是很好的,这可能会在以后对您有所帮助。我相信是四舍五入


    我还强烈建议您使用autoencoder.summary(),这将为您提供有关各层尺寸的信息。有了它,你就可以知道每一层都发生了什么。

    你应该包括model.summary()的输出,它会告诉你每一层输出的确切形状。我将
    填充设置为
    “相同”
    ,效果非常好!非常感谢。