在使用Keras运行CNN模型时如何解决此错误?



在运行CNN模型时,下面是我使用Keras编写的代码

import tensorflow as tf
import numpy as np
from tensorflow import keras
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator,array_to_img, img_to_array, load_img
from tensorflow.keras.preprocessing import image
import matplotlib.pyplot as plt
train = ImageDataGenerator(
rotation_range=90,    
width_shift_range=0.2,  
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.3, 
horizontal_flip = True, 
vertical_flip = True,
zca_whitening = True, 
brightness_range=[0.2,1.2], 
fill_mode='wrap')
test = ImageDataGenerator(rescale=1./255)
train_dataset = train.flow_from_directory("/content/drive/MyDrive/dataset",
target_size=(256,256),
batch_size = 32,
class_mode = 'binary')

test_dataset = test.flow_from_directory("/content/drive/MyDrive/dataset",
target_size=(256,256),
batch_size = 32,
class_mode = 'binary')
model = keras.Sequential()
# Convolutional layer and maxpool layer 1
model.add(keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(256,256,3)))
model.add(keras.layers.MaxPool2D(2,2))
# Convolutional layer and maxpool layer 2
model.add(keras.layers.Conv2D(128,(3,3),activation='relu'))
model.add(keras.layers.MaxPool2D(2,2))
# Convolutional layer and maxpool layer 3
model.add(keras.layers.Conv2D(256,(3,3),activation='relu'))
model.add(keras.layers.MaxPool2D(2,2))
# Flattening Operation
model.add(keras.layers.Flatten())
# Fully Connected layer
model.add(keras.layers.Dense(1024,activation='relu'))
## Output layer
model.add(keras.layers.Dense(10,activation='softmax'))  
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
train_imagesize = 327
batch_size = 32
epochs = 10 
steps_per_epoch = train_imagesize//batch_size
model.fit_generator(
train_dataset,
steps_per_epoch = steps_per_epoch,
epochs = epochs,
validation_data = test_dataset)

我在下面得到了这样的错误,这显示了我的validation_data = test_dataset行的错误,但我真的不理解logitslabels必须具有相同形状的含义。


ValueError: in user code:
File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1021, in train_function  *
return step_function(self, iterator)
File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1010, in step_function  **
outputs = model.distribute_strategy.run(run_step, args=(data,))
File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1000, in run_step  **
outputs = model.train_step(data)
File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 860, in train_step
loss = self.compute_loss(x, y, y_pred, sample_weight)
File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 919, in compute_loss
y, y_pred, sample_weight, regularization_losses=self.losses)
File "/usr/local/lib/python3.7/dist-packages/keras/engine/compile_utils.py", line 201, in __call__
loss_value = loss_obj(y_t, y_p, sample_weight=sw)
File "/usr/local/lib/python3.7/dist-packages/keras/losses.py", line 141, in __call__
losses = call_fn(y_true, y_pred)
File "/usr/local/lib/python3.7/dist-packages/keras/losses.py", line 245, in call  **
return ag_fn(y_true, y_pred, **self._fn_kwargs)
File "/usr/local/lib/python3.7/dist-packages/keras/losses.py", line 1932, in binary_crossentropy
backend.binary_crossentropy(y_true, y_pred, from_logits=from_logits),
File "/usr/local/lib/python3.7/dist-packages/keras/backend.py", line 5247, in binary_crossentropy
return tf.nn.sigmoid_cross_entropy_with_logits(labels=target, logits=output)
ValueError: `logits` and `labels` must have the same shape, received ((None, 10) vs (None, 1)).

我不知道如何解决这个问题。如有任何帮助,不胜感激。

因为这是一个二值分类问题,所以输出层应该有1个神经元(单元)和一个sigmoid激活函数。要克服该错误,请替换以下代码行:

# Output layer
model.add(keras.layers.Dense(10,activation='softmax'))

,代码如下:

# Output layer
model.add(keras.layers.Dense(1,activation='sigmoid'))

相关内容

最新更新