首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras CNN模型中的零损失和验证损失

Keras CNN模型中的零损失和验证损失
EN

Stack Overflow用户
提问于 2021-05-13 18:51:17
回答 2查看 978关注 0票数 0

我试图运行一个人群估计模型,根据图像中有多少人,将图像分为三个不同的大类。1200幅图像用于训练,其中20%用于验证。我使用Youtube上的sentdex教程作为参考,将图像数据加载到模型中;将图像作为压缩文件加载,提取图像,并根据它们所在的文件夹对它们进行分类。

我的问题是,每当我试图训练模型时,我注意到损失和验证损失总是为0,这导致模型没有经过精确的训练,验证的准确性在整个过程中保持不变,如这里所示。我怎样才能让损失真正改变呢?在执行方面,我是否做错了什么?

到目前为止,我尝试的是:

  1. 我试图添加第三个卷积层,但没有什么效果。
  2. 我还尝试将最后一个密集层更改为model.add(稠密( 3) ),但我发现一个错误,即“形状(无,1)和(无,3)不兼容”。
  3. 我尝试使用较低的学习率(0.001?),但是模型最终返回0以获得验证的准确性。
  4. 更改优化器似乎不会为我带来任何更改。

下面是到目前为止我的代码片段,展示了我的模型尝试:

代码语言:javascript
复制
import keras.backend as K

logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)

X = X/255.0

model = Sequential()
model.add(Conv2D(64, (3,3), input_shape = X.shape[1:])) #[1:] to skip the -1
model.add(Activation("relu"))
model.add(Conv2D(64, (3,3), input_shape = X.shape[1:])) #[1:] to skip the -1
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(128, (3,3)))
model.add(Activation('relu'))
model.add(Conv2D(128, (3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Dropout(0.2))

model.add(Flatten()) 

model.add(Dense(128))
model.add(Activation('relu'))

#fully connected layer 
model.add(Dense(1))
model.add(Activation('softmax'))

opt = keras.optimizers.Adam(lr=0.01)

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

model.fit(x_train, y_train, batch_size = 100, epochs = 30, validation_data = (x_val, y_val),  callbacks=[tensorboard_callback], shuffle=True)

完整的代码可以在Colab 这里上找到。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-13 19:16:52

最后一层包含一个节点,所以您只输出一个数字。但是,您需要输出3个数字,因为您有3个类。这些输出中的每一个都对应于该特定类的未规范化概率。在softmax之后,得到归一化概率分布。

票数 0
EN

Stack Overflow用户

发布于 2021-05-13 22:29:54

你有三节课。因此,更改代码

代码语言:javascript
复制
model.add(Dense(1))

代码语言:javascript
复制
model.addDense(3))

现在,如果您使用模型对图像进行预测,model.predict将生成一个包含3个概率值的列表。这些概率之和总计为1.0。模型的实际预测是具有最高概率值的列表中的指标。例如,如果model.predict的输出是.1,则为.7。.2 --概率值为.7的指数1是预测类。您的类被索引为0、1、2,因此模型可以预测1类,您可以得到模型输出的预测类。预测用

代码语言:javascript
复制
class_index=np.argmax(model,predict(....))

在某些地方,您可能有一个类列表,比如

代码语言:javascript
复制
classes=['less_than 5', 'between 5 and 10', 'more than 10']

所以实际预测的类名是

代码语言:javascript
复制
predicted_class=classes[class_index]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67524639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档