【发布时间】:2019-12-16 01:41:48
【问题描述】:
对于这个玩具模型:
from keras.layers import Input, Dense, Reshape
from keras.models import Model
# this is the size of our encoded representations
compression = 10
input_img = Input(shape=(28,28, ), name= "28x28")
encoded = Dense(int(np.floor(28*28/compression)), activation='relu',
name= "encoder_" + str(compression))(input_img)
decoded = Dense(units = 28*28, activation='sigmoid',
name = "28.28_decoder")(encoded)
reshape = Reshape(target_shape = (28,28), name = "28x28_reshape")(decoded)
autoencoder = Model(input_img, reshape)
我得到错误:
ValueError Traceback (most recent call last)
<ipython-input-27-04b835543369> in <module>
12 decoded = Dense(units = 28*28, activation='sigmoid',
13 name = "28.28_decoder")(encoded)
---> 14 reshape = Reshape(target_shape = (28,28), name = "28x28_reshape")(decoded)
15 autoencoder = Model(input_img, reshape)
16
~/.local/lib/python3.6/site-packages/keras/engine/base_layer.py in __call__(self, inputs, **kwargs)
472 if all([s is not None
473 for s in to_list(input_shape)]):
--> 474 output_shape = self.compute_output_shape(input_shape)
475 else:
476 if isinstance(input_shape, list):
~/.local/lib/python3.6/site-packages/keras/layers/core.py in compute_output_shape(self, input_shape)
396 # input shape known? then we can compute the output shape
397 return (input_shape[0],) + self._fix_unknown_dimension(
--> 398 input_shape[1:], self.target_shape)
399
400 def call(self, inputs):
~/.local/lib/python3.6/site-packages/keras/layers/core.py in _fix_unknown_dimension(self, input_shape, output_shape)
384 output_shape[unknown] = original // known
385 elif original != known:
--> 386 raise ValueError(msg)
387
388 return tuple(output_shape)
ValueError: total size of new array must be unchanged
我一直试图找出原因,但我不明白。看看help page,它相当简单,因为前一层是执行重塑的足够形状。
【问题讨论】:
-
在
Dense的文档中写着Output shape: nD tensor with shape: (batch_size, ..., units). For instance, for a 2D input with shape (batch_size, input_dim), the output would have shape (batch_size, units). -
@Ardweaden 但是文档说 target_shape:目标形状。整数元组,不包括样本维度(批量大小)。
-
The
Denselayer is applied on the last dimension。因此,encoded的形状为(None, 28, 78),decoded的形状为(None, 28, 784)。因此,您不能将形状为(28,784)的张量调整为(28,28)。解决这个问题的一种方法是在输入层之后使用Flatten层。
标签: python numpy tensorflow keras python-3.6