【问题标题】:Value Error and dimensionality problem using the Iris Data Set with Tensorflow使用带有 Tensorflow 的 Iris 数据集的值误差和维度问题
【发布时间】:2021-10-30 12:49:04
【问题描述】:

我正在尝试使用神经网络和从 scikit-learn 导入的旧 Iris 数据集来练习分类,但我遇到了一个维度问题,我不知道如何解决。

我也意识到还有其他方法,包括 tensorflow 本身,来检索虹膜数据,可能已经以更好的格式来使用数据,但只是为了理解,希望继续使用导入的数据来自 scikit-learn。

# import some data to play with
iris = datasets.load_iris()
X = iris.data  # we only take the first two features.
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)

# get sequence length
T = X_train.shape[1]

X_train.shape

(100, 4)

i = Input(shape=(T,))
x = Dense(32, activation='swish')(i)
x = Dropout(0.40)(x)
x = Dense(64, activation='swish')(x)
x = Dropout(0.40)(x)
x = Dense(32, activation='swish')(x)
x = Dropout(0.40)(x)
x = Dense(3, activation="softmax")(x)

model_1 = Model(i, x)

# Compile the model
model_1.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(),
                 optimizer=tf.keras.optimizers.Adam(),
                 metrics=["accuracy", precision])

# Fit the model (to the normalized data)
r = model_1.fit(X_train,
                y_train,
                epochs=40,
                validation_data=(X_test, y_test))

以上代码导致以下错误信息:

Epoch 1/40
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-19-262061005876> in <module>()
      8                 y_train,
      9                 epochs=40,
---> 10                 validation_data=(X_test, y_test))

9 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs)
    992           except Exception as e:  # pylint:disable=broad-except
    993             if hasattr(e, "ag_error_metadata"):
--> 994               raise e.ag_error_metadata.to_exception(e)
    995             else:
    996               raise

ValueError: in user code:

    /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:853 train_function  *
        return step_function(self, iterator)
    /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:842 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:1286 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:2849 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:3632 _call_for_each_replica
        return fn(*args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:835 run_step  **
        outputs = model.train_step(data)
    /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:792 train_step
        self.compiled_metrics.update_state(y, y_pred, sample_weight)
    /usr/local/lib/python3.7/dist-packages/keras/engine/compile_utils.py:457 update_state
        metric_obj.update_state(y_t, y_p, sample_weight=mask)
    /usr/local/lib/python3.7/dist-packages/keras/utils/metrics_utils.py:73 decorated
        update_op = update_state_fn(*args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/keras/metrics.py:177 update_state_fn
        return ag_update_state(*args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/keras/metrics.py:1366 update_state  **
        sample_weight=sample_weight)
    /usr/local/lib/python3.7/dist-packages/keras/utils/metrics_utils.py:623 update_confusion_matrix_variables
        y_pred.shape.assert_is_compatible_with(y_true.shape)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/tensor_shape.py:1161 assert_is_compatible_with
        raise ValueError("Shapes %s and %s are incompatible" % (self, other))

    ValueError: Shapes (None, 3) and (None, 1) are incompatible

不清楚我应该如何解决这个问题。

【问题讨论】:

    标签: python tensorflow multidimensional-array scikit-learn dimensions


    【解决方案1】:

    好的,我完成了两项工作,但不知道这是如何或为什么会这样。

    我还导入了 Precision

    from tensorflow.keras.metrics import Precision
    precision = Precision()
    

    并且最初与"accuracy" 一起在指标中传递了它。删除它允许它运行只需要:

    # Compile the model
    model_1.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(),
                     optimizer=tf.keras.optimizers.Adam(),
                     metrics=["accuracy"])
    

    不过,我必须弄清楚如何传递其他指标,因为我认为这应该可行

    编辑

    答案是right here。我正在将精度度量传递给多类分类问题。删除即可解决问题

    【讨论】:

      【解决方案2】:

      在处理 tensorflow 和 scikit-learn 时,您的某些导入可能会混淆或出现意外的命名冲突,因为如果您不使用完整的导入路径,则会出现重叠的名称。下面的代码完全适合我。您可能需要重新启动内核/笔记本以清除所有变量。

      from sklearn import datasets
      from sklearn.model_selection import train_test_split
      from tensorflow import keras
      
      iris = datasets.load_iris()
      X = iris.data  # we only take the first two features.
      y = iris.target
      
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
      
      # get sequence length
      T = X_train.shape[1]
      
      print(X_train.shape) # (100, 4)
      print(X_test.shape)  # (50, 4)
      
      i = keras.Input(shape=(T,))
      x = keras.layers.Dense(32, activation='swish')(i)
      x = keras.layers.Dropout(0.40)(x)
      x = keras.layers.Dense(64, activation='swish')(x)
      x = keras.layers.Dropout(0.40)(x)
      x = keras.layers.Dense(32, activation='swish')(x)
      x = keras.layers.Dropout(0.40)(x)
      x = keras.layers.Dense(3, activation="softmax")(x)
      
      model_1 = keras.Model(i, x)
      
      # This helpful line prints out model information:
      print(model_1.summary()) 
      
      model_1.compile(loss=keras.losses.SparseCategoricalCrossentropy(),
                       optimizer=keras.optimizers.Adam(),
                       metrics=["accuracy"])
      
      # Fit the model (to the normalized data)
      r = model_1.fit(X_train,
                      y_train,
                      epochs=40,
                      validation_data=(X_test, y_test))
      

      【讨论】:

      • 这很奇怪。我在 google colab 中执行此操作,刚刚重新启动运行时,但仍然无法正常工作。不知道我做错了什么导致了这种情况。
      • 您是否复制了我的确切代码,包括所有导入并以我的方式调用它们? (例如 keras.Input() 不是 Input())仍然出现同样的错误?
      猜你喜欢
      • 1970-01-01
      • 2020-01-28
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多