ValueError: 形状 (None, 3) 和 (None, 1) 不兼容

我的机器学习代码出现了问题

这是我的模型:

model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(32, 3, activation='relu', input_shape=input_shape),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(64, 3, activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(128, 3, activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(512, 3, activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(1, activation='softmax')])model.summary()

这是我的模型摘要结果:

Model: "sequential_32"_________________________________________________________________Layer (type)                 Output Shape              Param #   =================================================================conv2d_128 (Conv2D)          (None, 148, 148, 32)      896       _________________________________________________________________max_pooling2d_128 (MaxPoolin (None, 74, 74, 32)        0         _________________________________________________________________conv2d_129 (Conv2D)          (None, 72, 72, 64)        18496     _________________________________________________________________max_pooling2d_129 (MaxPoolin (None, 36, 36, 64)        0         _________________________________________________________________conv2d_130 (Conv2D)          (None, 34, 34, 128)       73856     _________________________________________________________________max_pooling2d_130 (MaxPoolin (None, 17, 17, 128)       0         _________________________________________________________________conv2d_131 (Conv2D)          (None, 15, 15, 512)       590336    _________________________________________________________________max_pooling2d_131 (MaxPoolin (None, 7, 7, 512)         0         _________________________________________________________________flatten_32 (Flatten)         (None, 25088)             0         _________________________________________________________________dense_79 (Dense)             (None, 128)               3211392   _________________________________________________________________dense_80 (Dense)             (None, 1)                 129       =================================================================Total params: 3,895,105Trainable params: 3,895,105Non-trainable params: 0

这是我使用的编译设置:

model.compile(optimizer='adam',          loss='categorical_crossentropy',          metrics=['accuracy'])

这是训练模型的代码:

EPOCH = 100history = model.fit(train_data,    steps_per_epoch=len(train_generator),    epochs=EPOCH,    validation_data=val_data,    validation_steps=len(val_generator),    shuffle=True,    verbose = 1)

对于train_data,我使用tensorflow的tf.data来创建,因为我认为它与tf.keras更兼容。这是tf.data生成器函数的代码:

def tf_data_generator(generator, input_shape):num_class = generator.num_classestf_generator = tf.data.Dataset.from_generator(    lambda: generator,    output_types=(tf.float32, tf.float32),    output_shapes=([None                    , input_shape[0]                    , input_shape[1]                    , input_shape[2]]                   ,[None, num_class]))return tf_generatortrain_data = tf_data_generator(train_generator, input_shape)val_data = tf_data_generator(val_generator, input_shape)

实际上,我是从medium.com上找到这个函数的。但是当我尝试训练我的机器学习代码时出现了错误,有人能帮我解决这个错误吗?这是错误消息:

---------------------------------------------------------------------------ValueError                                Traceback (most recent call last)<ipython-input-16-448faadd058c> in <module>()      6         validation_steps=len(val_generator),      7         shuffle=True,----> 8         verbose = 1)9 frames/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs)    984           except Exception as e:  # pylint:disable=broad-except    985             if hasattr(e, "ag_error_metadata"):--> 986               raise e.ag_error_metadata.to_exception(e)    987             else:    988               raiseValueError: in user code:/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:855 train_function  *    return step_function(self, iterator)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:845 step_function  **    outputs = model.distribute_strategy.run(run_step, args=(data,))/usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:1285 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:2833 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:3608 _call_for_each_replica    return fn(*args, **kwargs)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:838 run_step  **    outputs = model.train_step(data)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:797 train_step    y, y_pred, sample_weight, regularization_losses=self.losses)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/compile_utils.py:204 __call__    loss_value = loss_obj(y_t, y_p, sample_weight=sw)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/losses.py:155 __call__    losses = call_fn(y_true, y_pred)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/losses.py:259 call  **    return ag_fn(y_true, y_pred, **self._fn_kwargs)/usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:206 wrapper    return target(*args, **kwargs)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/losses.py:1644 categorical_crossentropy    y_true, y_pred, from_logits=from_logits)/usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:206 wrapper    return target(*args, **kwargs)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/backend.py:4862 categorical_crossentropy    target.shape.assert_is_compatible_with(output.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

抱歉如果我的问题让人困惑,我在机器学习领域还是新手。谢谢你的帮助


回答:

我猜你想得到一个多类分类器,用于3个类别。如果是这样的话,你错误地将最后一层设置为大小为1的DENSE层。你可以通过替换这一行来解决问题:

tf.keras.layers.Dense(1, activation='softmax')])

为这一行:

tf.keras.layers.Dense(3, activation='softmax')])

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注