keras 值错误:形状(None,)和(None,150,150,6)不兼容

brc7rcf0  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(129)

我正在使用Keras、SGD和Softmax激活构建一个图像分类模型。训练数据集由RGB图像组成,尺寸为512x384。
为此,我遵循了Keras“Getting Started”指南,然而,当我试图训练模型时,我得到了标题中提到的错误,这是我到目前为止的代码:

import numpy as np
import tensorflow as tf
from tensorflow import keras

FOLDER_PATH = 'dataset'

dataset = keras.utils.image_dataset_from_directory(
    FOLDER_PATH,
    batch_size=64,
    image_size=(512, 384)
)

# None x None x 3 -> Arbitrarily sized images with 3 channels
inputs = keras.Input(shape=(None, None, 3))

x = CenterCrop(height=150, width=150)(inputs)
x = Rescaling(scale= 1.0 / 255)(x)

outputs = layers.Dense(6, activation="softmax")(x)

model = keras.Model(inputs=inputs, outputs=outputs)

model.compile(
    optimizer=keras.optimizers.SGD(learning_rate=0.01),
    loss=keras.losses.CategoricalCrossentropy()
)

model.fit(dataset, epochs=3)

以下是该模型的总结:

Model: "model_6"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_8 (InputLayer)        [(None, None, None, 3)]   0         
                                                                 
 center_crop_7 (CenterCrop)  (None, 150, 150, 3)       0         
                                                                 
 rescaling_7 (Rescaling)     (None, 150, 150, 3)       0         
                                                                 
 dense_7 (Dense)             (None, 150, 150, 6)       24        
                                                                 
=================================================================
Total params: 24
Trainable params: 24
Non-trainable params: 0
_________________________________________________________________

我还检查了数据的形状:

for data, labels in dataset:
   print(data.shape)   # (64, 512, 384, 3)
   print(data.dtype)   # <dtype: 'float32'> 
   print(labels.shape) # (64,) 
   print(labels.dtype) # <dtype: 'int32'>

那么,我该如何解决这个问题呢?我想知道我是否在数据预处理管道中犯了一些错误,或者我正在使用的数据是否与SGD优化器不兼容。

ovfsdjhp

ovfsdjhp1#

你需要改变一些事情。
首先,softmax要求您使用one-hot编码标签。您可以使用以下代码行转换您的数据:

(x_train, y_train), (x_test, y_test) =keras.utils.image_dataset_from_directory(
    FOLDER_PATH,
    batch_size=64,
    image_size=(512, 384)
)
y_onehot = tf.keras.utils.to_categorical(y_train, num_classes = 10)

在这一步之后你也需要到flatten你的输入在你feedit到你的模型之前.这是由做:

x = CenterCrop(height=150, width=150)(inputs)
x = Rescaling(scale= 1.0 / 255)(x)
x = layers.Flatten()(x) # add this line here to flatten 
outputs = layers.Dense(6, activation="softmax")(x)

别忘了改变你的体型:

model.fit(x_train, y_onehot, epochs=3)

相关问题