ValueError:logits 和标签必须具有相同的形状 ((None, 23, 23, 1) vs (None, 1))

问题描述

我是 ML 的新手,所以我真的不知道在做什么我不知道 logits 在代码中的含义我什至没有编写 logits 我只是按照 YouTube 教程来让我自己熟悉环境。 .这是完整的代码,感谢您的帮助。我知道在stackoverflow上已经有这种帖子,但我认为它不适用于我的情况,也许我不知道,但我仍然不知道知道如何实施它,即使这样做也请帮助我在这里挣扎:) tnx 代码

from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
from tensorflow.keras.optimizers import RMSprop
import matplotlib.pyplot as plt
import tensorflow as tf
import cv2
import os
import numpy as np 
    
img = cv2.imread("/content/drive/MyDrive/data/train/ha/2.jpg").shape
print(img)
imgg = image.load_img("/content/drive/MyDrive/data/train/ha/2.jpg")
plt.imshow(imgg)
train = ImageDataGenerator(rescale=1/255)
validation = ImageDataGenerator(rescale=1/255)
train_dataset = train.flow_from_directory("/content/drive/MyDrive/data/train/",target_size = (100,100),batch_size = 3,class_mode ="binary")
    print(train_dataset.class_indices)
    
validation_dataset = train.flow_from_directory("/content/drive/MyDrive/data/validate/",class_mode ="binary")
    
    
model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(16,(3,3),activation = 'relu',input_shape =(200,200,3)),tf.keras.layers.MaxPool2D(2,2),#
    tf.keras.layers.Conv2D(32,activation = 'relu'),#
    tf.keras.layers.Conv2D(64,##
    tf.keras.layers.Dense(134,##
    tf.keras.layers.Dense(1,activation = 'sigmoid')
    ])
    
    model.compile(loss = 'binary_crossentropy',optimizer = RMSprop(lr=0.001),metrics =['accuracy'])
    
    model_fit = model.fit(train_dataset,steps_per_epoch = 3,epochs = 1,validation_data = validation_dataset)

错误

2021-01-01 13:39:18.588397: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.10.1
(51,51,3)
Found 9 images belonging to 2 classes.
{'ha': 0,'hu': 1}
Found 4 images belonging to 2 classes.
2021-01-01 13:39:22.999078: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices,tf_xla_enable_xla_devices not set
2021-01-01 13:39:23.026197: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcuda.so.1
2021-01-01 13:39:23.092853: E tensorflow/stream_executor/cuda/cuda_driver.cc:328] Failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
2021-01-01 13:39:23.092917: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (6e4fde799083): /proc/driver/nvidia/version does not exist
2021-01-01 13:39:23.093374: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices,tf_xla_enable_xla_devices not set
2021-01-01 13:39:23.846859: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)
2021-01-01 13:39:23.850373: I tensorflow/core/platform/profile_utils/cpu_utils.cc:112] cpu Frequency: 2300000000 Hz

Traceback (most recent call last):
  File "/content/drive/MyDrive/main.py",line 48,in <module>
    validation_data = validation_dataset)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py",line 1100,in fit
    tmp_logs = self.train_function(iterator)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/def_function.py",line 828,in __call__
    result = self._call(*args,**kwds)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/def_function.py",line 871,in _call
    self._initialize(args,kwds,add_initializers_to=initializers)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/def_function.py",line 726,in _initialize
    *args,**kwds))
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/function.py",line 2969,in _get_concrete_function_internal_garbage_collected
    graph_function,_ = self._maybe_define_function(args,kwargs)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/function.py",line 3361,in _maybe_define_function
    graph_function = self._create_graph_function(args,line 3206,in _create_graph_function
    capture_by_value=self._capture_by_value),File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/func_graph.py",line 990,in func_graph_from_py_func
    func_outputs = python_func(*func_args,**func_kwargs)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/def_function.py",line 634,in wrapped_fn
    out = weak_wrapped_fn().__wrapped__(*args,**kwds)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/func_graph.py",line 977,in wrapper
    raise e.ag_error_Metadata.to_exception(e)
ValueError: in user code:

    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:805 train_function  *
        return step_function(self,iterator)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:795 step_function  **
        outputs = model.distribute_strategy.run(run_step,args=(data,))
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:1259 run
        return self._extended.call_for_each_replica(fn,args=args,kwargs=kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2730 call_for_each_replica
        return self._call_for_each_replica(fn,args,kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:3417 _call_for_each_replica
        return fn(*args,**kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:788 run_step  **
        outputs = model.train_step(data)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:756 train_step
        y,y_pred,sample_weight,regularization_losses=self.losses)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/compile_utils.py:203 __call__
        loss_value = loss_obj(y_t,y_p,sample_weight=sw)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/losses.py:152 __call__
        losses = call_fn(y_true,y_pred)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/losses.py:256 call  **
        return ag_fn(y_true,**self._fn_kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/util/dispatch.py:201 wrapper
        return target(*args,**kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/losses.py:1608 binary_crossentropy
        K.binary_crossentropy(y_true,from_logits=from_logits),axis=-1)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/util/dispatch.py:201 wrapper
        return target(*args,**kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/backend.py:4979 binary_crossentropy
        return nn.sigmoid_cross_entropy_with_logits(labels=target,logits=output)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/util/dispatch.py:201 wrapper
        return target(*args,**kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/nn_impl.py:174 sigmoid_cross_entropy_with_logits
        (logits.get_shape(),labels.get_shape()))

    ValueError: logits and labels must have the same shape ((None,23,1) vs (None,1))

解决方法

您的问题是密集层的输入必须是向量。为了实现这一点

you can
replace tf.keras.layers.MaxPool2D(2,2)
with  tf.keras.layers.GlobalMaxPooling2D()

或者只是添加

tf.keras.layers.GlobalMaxPooling2D() after tf.keras.layers.MaxPool2D(2,2)