重塑Keras张量

时间:2017-05-05 13:15:53

标签: python python-3.x keras

如何在不指定初始输入形状的情况下将Keras张量从形状(1,1,10)重塑为形状(10)? 使用Flatten()(作为命令)给出

 <tf.Tensor 'flatten_11/Reshape:0' shape=(?, ?) dtype=float32>

作为输出 并在模型

中使用它时出错
model = Sequential()
    model.add(Convolution1D(filters=self.nb_filters,
                            kernel_size=self.n_gram,
                            padding='valid',
                            activation='relu',
                            input_shape=(None,3*self.vecsize)))
    model.add(MaxPooling1D(pool_size=3*self.vecsize-self.n_gram+1))
    model.add(Flatten())
    model.add(Dense(num_categories, activation='softmax'))

它说:    &#34; Flatten&#34;的输入形状没有完全定义(得到(无,10)。确保将完整的&#34; input_shape&#34;或#34; batch_input_shape&#34;参数传递给模型中的第一层。

初始输入形状是1 *任意尺寸* vecsize,我强烈不想事先指定任意尺寸。

使用Flatten((1,1,10))而不仅仅是Flatten()也会产生错误:

TypeError:__ init __()需要1个位置参数但是2个被赋予

那么我该怎么做才能让它发挥作用呢?

2 个答案:

答案 0 :(得分:2)

在提供第一层的input_shape时,您不得添加None部分。这是为批量大小保留的,将在培训或预测时自动推断。

因此,在定义您的第一个Convolution1D时,如果您最后使用频道,则input_shape应该只是input_shape = (3*self.vecsize,1),如果您使用频道,则(1,3*self.vecsize)第一。

答案 1 :(得分:0)

这当然是来自NumPy的假设。我们都熟悉使用np.reshape(-1,224,224,3)重新整形数组。这是NumPy格式。但是,我是直接从Keras的文档中向您发布代码。

as first layer in a Sequential model
model = Sequential()
model.add(Reshape((3, 4), input_shape=(12,)))
now: model.output_shape == (None, 3, 4)
note: `None` is the batch dimension

intermediate layer in a Sequential model
model.add(Reshape((6, 2)))
now: model.output_shape == (None, 6, 2)

also supports shape inference using `-1` as dimension
model.add(Reshape((-1, 2, 2)))
now: model.output_shape == (None, 3, 2, 2)

您可以看到其格式为

model.add(Reshape((targetsize)))

希望它有所帮助。