如何在不指定初始输入形状的情况下将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个被赋予
那么我该怎么做才能让它发挥作用呢?
答案 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)))
希望它有所帮助。