【问题标题】:ValueError: Shapes (None, 3) and (None, 1) are incompatibleValueError:形状 (None, 3) 和 (None, 1) 不兼容
【发布时间】:2021-07-06 04:56:10
【问题描述】:

我的机器学习代码有问题

这是模型:

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.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,105
Trainable params: 3,895,105
Non-trainable params: 0

这是我使用的编译设置:

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

这是适合的模型代码:

EPOCH = 100
history = 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_classes
tf_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_generator
train_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               raise

ValueError: 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

对不起,如果我的问题令人困惑,我还是机器学习领域的新手。谢谢你帮助我

【问题讨论】:

    标签: python tensorflow machine-learning keras conv-neural-network


    【解决方案1】:

    我猜你打算得到一个多类分类器,用于 3 个类。如果是这种情况,您错误地将最后一层分配给大小为 1 的 DENSE。您可以通过替换此行来解决问题:

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

    通过这个:

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

    【讨论】:

    • 我已经替换了它,错误变为 ValueError: could not broadcast input array from shape (150,150,3) into shape (150,150,3,3),你能再帮帮我吗?跨度>
    猜你喜欢
    • 1970-01-01
    • 2020-08-27
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2021-07-07
    • 2021-08-25
    • 1970-01-01
    相关资源
    最近更新 更多