【问题标题】:Tensorflow invalid shape (InvalidArgumentError)TensorFlow 无效形状(InvalidArgumentError)
【发布时间】:2019-05-06 07:13:42
【问题描述】:

model.fit 产生异常:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Cannot update variable with shape [] using a Tensor with shape [32], shapes must be equal.
         [[{{node metrics/accuracy/AssignAddVariableOp}}]]
         [[loss/dense_loss/categorical_crossentropy/weighted_loss/broadcast_weights/assert_broadcastable/AssertGuard/pivot_f/_50/_63]] [Op:__inference_keras_scratch_graph_1408]

模型定义:

model = tf.keras.Sequential()

    model.add(tf.keras.layers.InputLayer(
        input_shape=(360, 7)
    ))

    model.add(tf.keras.layers.Conv1D(32, 1, activation='relu', input_shape=(360, 7)))
    model.add(tf.keras.layers.Conv1D(32, 1, activation='relu'))
    model.add(tf.keras.layers.MaxPooling1D(3))
    model.add(tf.keras.layers.Conv1D(512, 1, activation='relu'))
    model.add(tf.keras.layers.Conv1D(1048, 1, activation='relu'))
    model.add(tf.keras.layers.GlobalAveragePooling1D())
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(32, activation='softmax'))

输入要素形状

(105, 360, 7)

输入标签形状

(105, 32, 1)

编译语句

model.compile(optimizer='adam',
                  loss=tf.keras.losses.CategoricalCrossentropy(),
                  metrics=['accuracy'])

Model.fit 语句

 model.fit(features,
              labels,
              epochs=50000,
              validation_split=0.2,
              verbose=1)

任何帮助将不胜感激

【问题讨论】:

  • 尝试通过np.squeeze(labels)labels的形状更改为(105,32)
  • @giser_yugang 哇,谢谢,这似乎奏效了。你能解释一下为什么吗?创建回复,我会将其标记为正确答案。谢谢

标签: python-3.x tensorflow tensor tensorflow2.0


【解决方案1】:

您可以使用model.summary() 查看您的模型架构。

print(model.summary())

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d (Conv1D)              (None, 360, 32)           256       
_________________________________________________________________
conv1d_1 (Conv1D)            (None, 360, 32)           1056      
_________________________________________________________________
max_pooling1d (MaxPooling1D) (None, 120, 32)           0         
_________________________________________________________________
conv1d_2 (Conv1D)            (None, 120, 512)          16896     
_________________________________________________________________
conv1d_3 (Conv1D)            (None, 120, 1048)         537624    
_________________________________________________________________
global_average_pooling1d (Gl (None, 1048)              0         
_________________________________________________________________
dropout (Dropout)            (None, 1048)              0         
_________________________________________________________________
dense (Dense)                (None, 32)                33568     
=================================================================
Total params: 589,400
Trainable params: 589,400
Non-trainable params: 0
_________________________________________________________________
None

你的输出层的形状必须是(None,32),但是你的labels的形状是(105,32,1)。所以你需要把形状改成(105,32)np.squeeze() 函数用于从数组的形状中删除一维条目。

【讨论】:

    【解决方案2】:

    在密集层之前使用 Flatten()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-20
      • 2017-12-02
      • 2021-08-05
      • 1970-01-01
      • 2022-09-24
      • 2021-08-01
      • 1970-01-01
      • 2016-12-11
      相关资源
      最近更新 更多