【问题标题】:Can not squeeze dim[1], expected a dimension of 1, got 2无法挤压 dim[1],预期维度为 1,得到 2
【发布时间】:2019-04-11 13:51:20
【问题描述】:

我有非常简单的输入:点,我正在尝试对它们是否在某个区域进行分类。所以我的训练数据的形状是(1000000, 2),它是一个数组,形式为:
[ [x1,y1], [x2,y2],... ]
我的标签具有类似的形式(形状 (10000, 2)):
[ [1,0], [0,1], [0,1],... ]
[0,1]表示该点在区域内,[1,0]表示不在)

我的模型是这样设置的:

import tensorflow as tf
from tensorflow import keras
import numpy as np

# Reads the points and labels from .csv format files
train_data = np.genfromtxt('data/train_data.csv', delimiter=',')
train_labels = np.genfromtxt('data/train_labels.csv', delimiter=',')

model = keras.models.Sequential()
model.add(keras.layers.Dense(128, activation='relu', input_shape=(2,)))
model.add(keras.layers.Dense(128, activation='relu'))
model.add(keras.layers.Dense(2, activation='softmax'))

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(train_data, train_labels, epochs=1, batch_size=100, verbose=1) # ERROR

请注意,输入形状是(2,),这意味着(根据reference)模型需要(*, 2) 形式的数组。

我收到错误消息:
tensorflow.python.framework.errors_impl.InvalidArgumentError: Can not squeeze dim[1], expected a dimension of 1, got 2

我不知道为什么。有什么建议吗?

堆栈跟踪:

Traceback (most recent call last):
  File "C:/Users/omer/Desktop/Dots/train.py", line 25, in <module>
    model.fit(train_data, train_labels, epochs=1, batch_size=100, verbose=1)
  File "C:\Users\omer\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py", line 880, in fit
    validation_steps=validation_steps)
  File "C:\Users\omer\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 329, in model_iteration
    batch_outs = f(ins_batch)
  File "C:\Users\omer\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\backend.py", line 3076, in __call__
    run_metadata=self.run_metadata)
  File "C:\Users\omer\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\client\session.py", line 1439, in __call__
    run_metadata_ptr)
  File "C:\Users\omer\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 528, in __exit__
    c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Can not squeeze dim[1], expected a dimension of 1, got 2
     [[{{node metrics/acc/Squeeze}}]]

【问题讨论】:

  • 请创建一个完整的示例,其中包含导致错误的代码 (minimal reproducible example)。作为第一个猜测,请注意 Python 列表不是数组。
  • @IonicSolutions 抱歉,我将它们写成列表以显示它们的形状,但我使用 NumPy 数组,并且一直称它们为数组。现在添加一个示例。
  • 你能试试input_shape=(1,2)吗?
  • 请包含发生错误的确切代码行,以及完整的堆栈跟踪(如果有)。
  • 尝试在第一个密集层之前添加扁平层

标签: python tensorflow keras


【解决方案1】:

您的标签形状错误。见the documentation

当使用sparse_categorical_crossentropy 损失时,您的目标应该是整数 目标。如果你有分类目标,你应该使用categorical_crossentropy

所以您需要将标签转换为整数:

train_labels = np.argmax(train_labels, axis=1)

【讨论】:

    【解决方案2】:

    根据您对问题的描述,这似乎是一个二元分类任务(即区域内与区域外)。因此,您可以执行以下操作:

    1. 使用'sigmoid'作为最后一层的激活函数。
    2. 在最后一层使用一个单位(而不是 2 个)。
    3. 使用'binary_crossentropy'作为损失函数。

    您还需要将当前标签(即 [1,0][0,1])映射到 0 和 1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 2020-10-27
      • 1970-01-01
      相关资源
      最近更新 更多