我尝试使用LocallyConnected1D
图层(而不是Dense
)构建自动编码器,但在理解两种图层类型的差异方面遇到了很多麻烦 - 特别是在输出方面维数。
model = Sequential()
model.add(Reshape(input_shape=(input_size,), target_shape=(input_size,1))
model.add(LocallyConnected1D(encoded_size, kernel_size)
model.add(LocallyConnected1D(input_size, kernal_size_2, name="decoded_layer"))
这个模型编译得很好,但是当我去训练它时......
model.fit(x_train, x_train,
epochs=epochs,
batch_size=batch_size,
shuffle=True,
validation_data=(x_test, x_test))
其中x_train
和x_test
分别是形状(60000,784)和(10000,784)的numpy数组。我在这一行收到以下错误:
ValueError: Error when checking target: expected decoded_layer to have 3 dimensions, but got array with shape (60000, 784)
进入decoded_layer
的张量的形状是不是(60000,encoded_size
,1)?
答案 0 :(得分:3)
首先,您不必将None
作为input_shape中的第一个维度。 Keras自动假设存在另一个输入维度,即样本数。
其次,LocallyConnected1D
需要3D输入。这意味着你的input_shape应该是(int,int)的形式,keras推断形状为(None,int,int)
一个例子:
model = Sequential()
model.add(LocallyConnected1D(64, 3, input_shape=(10,10))) #takes a 10 by 10 array for each sample
model.add(LocallyConnected1D(32, 3))
如果数据形状不正确,您可以始终使用Reshape()
图层。假设你的输入是(batch_size,50)的形状,所以每个样本都是50个元素的一维向量:
model = Sequential()
model.add(Reshape(input_shape=(50,), target_shape=(50,1)) #makes array 3D
model.add(LocallyConnected1D(64, 3))
model.add(LocallyConnected1D(32, 3))