【问题标题】:Keras/Tenserflow - Cannot make model.fit() workKeras/Tensorflow - 无法使 model.fit() 工作
【发布时间】:2022-01-07 16:34:18
【问题描述】:

我正在尝试制作一个 CNN 网络来对蘑菇图像进行预测。

遗憾的是,我什至无法开始训练我的模型,fit() 方法总是给我错误。

有 10 个类,tf 数据集根据它们的子文件夹正确找到了它们的名称。

使用我当前的代码,它说:

InvalidArgumentError:  logits and labels must have the same first
dimension, got logits shape [12800,10] and labels shape [32]

模型总结:

 Layer (type)                Output Shape              Param #   
=================================================================  
input_5 (InputLayer)        [(None, 64, 64, 3)]       0         
                                                                           
conv2d_4 (Conv2D)           (None, 62, 62, 32)        896       
                                                                           
max_pooling2d_2 (MaxPooling  (None, 20, 20, 32)       0              
2D) 
    
                                                                       
re_lu_2 (ReLU)              (None, 20, 20, 32)        0         
                                                                       
dense_2 (Dense)             (None, 20, 20, 10)        330 

  
                                                                 
=================================================================

这是我的代码:

#Data loading
train_set = keras.preprocessing.image_dataset_from_directory(
      data_path, 
      labels="inferred",
      label_mode="int",
      batch_size=32, 
      image_size=(64, 64),
      shuffle=True,
      seed=1446,
      validation_split = 0.2,
      subset="training")

validation_set = keras.preprocessing.image_dataset_from_directory(
  data_path, 
  labels="inferred",
  label_mode="int",
  batch_size=32, 
  image_size=(64, 64),
  shuffle=True,
  seed=1446,
  validation_split = 0.2,
  subset="validation")

#Constructing layers
input_layer = keras.Input(shape=(64, 64, 3))
x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(input_layer)
x = layers.MaxPooling2D(pool_size=(3, 3))(x)
x = keras.layers.ReLU()(x)
output = layers.Dense(10, activation="softmax")(x)

#Making and fitting the model
model = keras.Model(inputs=input_layer, outputs=output)
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=['accuracy'])
model.fit(train_set, epochs=5, validation_data=validation_set)

【问题讨论】:

  • 欢迎。请告诉我们您的错误到底是什么。另外,不要使用input 作为变量名,因为input 是一个内置函数。
  • 我更正了输入变量的名称。使用当前代码,它吐出:“logits 和 labels 必须具有相同的第一维,得到 logits 形状 [12800,10] 和标签形状 [32]”

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


【解决方案1】:

我认为您需要在传递到Dense 层之前进行展平

input_layer = keras.Input(shape=(64, 64, 3))
x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(input_layer)
x = layers.MaxPooling2D(pool_size=(3, 3))(x)
x = keras.layers.ReLU()(x)
x = keras.layers.Flatten()(x) # try adding this
output = layers.Dense(10, activation="softmax")(x)

【讨论】:

  • 这行得通,非常感谢!我要查一下,想知道为什么。至少我现在可以真正开始工作了:)
【解决方案2】:

你需要做的是在你的模型中的 ReLU 层和输出层之间添加一个 flatten 层。

input_layer = keras.Input(shape=(64, 64, 3))
x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(input_layer)
x = layers.MaxPooling2D(pool_size=(3, 3))(x)
x = keras.layers.ReLU()(x)
x = keras.layers.Flatten()(x)
output = layers.Dense(10, activation="softmax")(x)

当您看到 model.fit 由于 logits 和标签的差异而引发错误时,最好打印出模型摘要

print(model.summary())

通过查看摘要通常有助于找出问题所在。

【讨论】:

  • 这很有效,建议很好,我会用摘要更新我的帖子,以防有人遇到和我一样的问题。
猜你喜欢
  • 2021-07-18
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2018-01-31
相关资源
最近更新 更多