keras autoencoder"检查目标时出错#34;

时间:2017-12-13 16:23:21

标签: machine-learning neural-network keras deep-learning autoencoder

我试图改编keras网站上的2d卷积自动编码器示例:https://blog.keras.io/building-autoencoders-in-keras.html

到我自己的情况,我使用1d输入:

from keras.layers import Input, Dense, Conv1D, MaxPooling1D, UpSampling1D
from keras.models import Model
from keras import backend as K
import scipy as scipy
import numpy as np 

mat = scipy.io.loadmat('edata.mat')
emat = mat['edata']

input_img = Input(shape=(64,1))  # adapt this if using `channels_first` image data format

x = Conv1D(32, (9), activation='relu', padding='same')(input_img)
x = MaxPooling1D((4), padding='same')(x)
x = Conv1D(16, (9), activation='relu', padding='same')(x)
x = MaxPooling1D((4), padding='same')(x)
x = Conv1D(8, (9), activation='relu', padding='same')(x)
encoded = MaxPooling1D(4, padding='same')(x)

x = Conv1D(8, (9), activation='relu', padding='same')(encoded)
x = UpSampling1D((4))(x)
x = Conv1D(16, (9), activation='relu', padding='same')(x)
x = UpSampling1D((4))(x)
x = Conv1D(32, (9), activation='relu')(x)
x = UpSampling1D((4))(x)
decoded = Conv1D(1, (9), activation='sigmoid', padding='same')(x)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

x_train = emat[:,0:80000]
x_train = np.reshape(x_train, (x_train.shape[1], 64, 1))
x_test = emat[:,80000:120000]
x_test = np.reshape(x_test, (x_test.shape[1], 64, 1))

from keras.callbacks import TensorBoard

autoencoder.fit(x_train, x_train,
                epochs=50,
                batch_size=128,
                shuffle=True,
                validation_data=(x_test, x_test),
                callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])

但是,当我尝试运行autoencoder.fit()时收到此错误:

  

ValueError:检查目标时出错:预期conv1d_165有   形状(无,32,1)但有阵列形状(80000,64,1)

我知道我在设置图层时可能做错了,我只是将maxpool和conv2d尺寸更改为1d表格...我对keras或自动编码器的经验很少,任何人都能看到我和我#39;我做错了吗?

感谢

编辑: 我在一个全新的控制台上运行时的错误:

  

ValueError:检查目标时出错:预期conv1d_7有   形状(无,32,1)但有阵列形状(80000,64,1)

这是autoencoder.summary()

的输出
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 64, 1)             0         
_________________________________________________________________
conv1d_1 (Conv1D)            (None, 64, 32)            320       
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 16, 32)            0         
_________________________________________________________________
conv1d_2 (Conv1D)            (None, 16, 16)            4624      
_________________________________________________________________
max_pooling1d_2 (MaxPooling1 (None, 4, 16)             0         
_________________________________________________________________
conv1d_3 (Conv1D)            (None, 4, 8)              1160      
_________________________________________________________________
max_pooling1d_3 (MaxPooling1 (None, 1, 8)              0         
_________________________________________________________________
conv1d_4 (Conv1D)            (None, 1, 8)              584       
_________________________________________________________________
up_sampling1d_1 (UpSampling1 (None, 4, 8)              0         
_________________________________________________________________
conv1d_5 (Conv1D)            (None, 4, 16)             1168      
_________________________________________________________________
up_sampling1d_2 (UpSampling1 (None, 16, 16)            0         
_________________________________________________________________
conv1d_6 (Conv1D)            (None, 8, 32)             4640      
_________________________________________________________________
up_sampling1d_3 (UpSampling1 (None, 32, 32)            0         
_________________________________________________________________
conv1d_7 (Conv1D)            (None, 32, 1)             289       
=================================================================
Total params: 12,785
Trainable params: 12,785
Non-trainable params: 0
_________________________________________________________________

1 个答案:

答案 0 :(得分:4)

由于自动编码器输出应重建输入,因此最低要求是它们的尺寸应该匹配,对吗?

查看您的conv1d_7,很容易确认情况并非如此:您的输入形状为(32,1),而上一个卷积层None的输出为{ {1}}(我们忽略了第一维中的from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D from keras.models import Model from keras import backend as K input_img = Input(shape=(28, 28, 1)) # adapt this if using `channels_first` image data format x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img) x = MaxPooling2D((2, 2), padding='same')(x) x = Conv2D(8, (3, 3), activation='relu', padding='same')(x) x = MaxPooling2D((2, 2), padding='same')(x) x = Conv2D(8, (3, 3), activation='relu', padding='same')(x) encoded = MaxPooling2D((2, 2), padding='same')(x) # at this point the representation is (4, 4, 8) i.e. 128-dimensional x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded) x = UpSampling2D((2, 2))(x) x = Conv2D(8, (3, 3), activation='relu', padding='same')(x) x = UpSampling2D((2, 2))(x) x = Conv2D(16, (3, 3), activation='relu')(x) x = UpSampling2D((2, 2))(x) decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x) autoencoder = Model(input_img, decoded) autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy') ,因为它们引用了批量大小。)

让我们看看你链接的example in the Keras blog(它是一个2D自动编码器,但想法是一样的):

autoencoder.summary()

以下是_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 28, 28, 1) 0 _________________________________________________________________ conv2d_1 (Conv2D) (None, 28, 28, 16) 160 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 14, 14, 16) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 14, 14, 8) 1160 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 7, 7, 8) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 7, 7, 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, 14, 14, 16) 1168 _________________________________________________________________ up_sampling2d_3 (UpSampling2 (None, 28, 28, 16) 0 _________________________________________________________________ conv2d_7 (Conv2D) (None, 28, 28, 1) 145 ================================================================= Total params: 4,385 Trainable params: 4,385 Non-trainable params: 0 在这种情况下的结果:

conv2d_7

很容易确认输入和输出(最后一个卷积层(28, 28, 1))的尺寸确实都是summary()

因此,构建自动编码器时,size方法是您的朋友;您应该试验参数,直到您确定生成与输入相同维度的输出。我设法使用您的自动编码器,只需将最后UpSampling1D图层的input_img = Input(shape=(64,1)) x = Conv1D(32, (9), activation='relu', padding='same')(input_img) x = MaxPooling1D((4), padding='same')(x) x = Conv1D(16, (9), activation='relu', padding='same')(x) x = MaxPooling1D((4), padding='same')(x) x = Conv1D(8, (9), activation='relu', padding='same')(x) encoded = MaxPooling1D(4, padding='same')(x) x = Conv1D(8, (9), activation='relu', padding='same')(encoded) x = UpSampling1D((4))(x) x = Conv1D(16, (9), activation='relu', padding='same')(x) x = UpSampling1D((4))(x) x = Conv1D(32, (9), activation='relu')(x) x = UpSampling1D((8))(x) ## <-- change here (was 4) decoded = Conv1D(1, (9), activation='sigmoid', padding='same')(x) autoencoder = Model(input_img, decoded) autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy') 参数从4更改为8:

autoencoder.summary()

在这种情况下,Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 64, 1) 0 _________________________________________________________________ conv1d_1 (Conv1D) (None, 64, 32) 320 _________________________________________________________________ max_pooling1d_1 (MaxPooling1 (None, 16, 32) 0 _________________________________________________________________ conv1d_2 (Conv1D) (None, 16, 16) 4624 _________________________________________________________________ max_pooling1d_2 (MaxPooling1 (None, 4, 16) 0 _________________________________________________________________ conv1d_3 (Conv1D) (None, 4, 8) 1160 _________________________________________________________________ max_pooling1d_3 (MaxPooling1 (None, 1, 8) 0 _________________________________________________________________ conv1d_4 (Conv1D) (None, 1, 8) 584 _________________________________________________________________ up_sampling1d_1 (UpSampling1 (None, 4, 8) 0 _________________________________________________________________ conv1d_5 (Conv1D) (None, 4, 16) 1168 _________________________________________________________________ up_sampling1d_2 (UpSampling1 (None, 16, 16) 0 _________________________________________________________________ conv1d_6 (Conv1D) (None, 8, 32) 4640 _________________________________________________________________ up_sampling1d_3 (UpSampling1 (None, 64, 32) 0 _________________________________________________________________ conv1d_7 (Conv1D) (None, 64, 1) 289 ================================================================= Total params: 12,785 Trainable params: 12,785 Non-trainable params: 0 变为:

{{1}}

输入和输出的维度匹配,因为它应该是......