首页 > 解决方案 > 即使在调整了密集层、激活层和层数之后,损失也被卡住并且准确度低于 0.01

问题描述

如标题所述,我不知道如何建立犬种识别的最佳模型。

我尝试了各种方法,例如删除层,更改密集值,添加学习率,添加衰减率,甚至更改优化器但无济于事

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Dropout,Activation, Flatten, Conv2D, MaxPooling2D

#print(X)
# print(y)
model = Sequential()

# METHOD TWO(Works but not accurate, built by self)
model.add(Conv2D(128,(3,3),input_shape=X.shape[1:]))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Activation("relu"))

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

model.add(Flatten())
model.add(Activation("relu"))
model.add(Dense(2048))
model.add(Dropout(0.5))

model.add(Activation("relu"))
model.add(Dense(2048))
model.add(Dropout(0.5))

model.add(Activation("relu"))
model.add(Dense(2048))
model.add(Dropout(0.5))

model.add(Activation("softmax"))
model.add(Dense(120))

opt = tf.keras.optimizers.Adam()
model.compile(optimizer = opt,
             loss='sparse_categorical_crossentropy',
             metrics=['accuracy'])

# from tfkeras.utils import to_categorical
# y_binary = tf.keras.utils.to_categorical(y)
# y_binary = to_categorical(y)

model.fit(X, y,epochs=2)

Epoch 1/2
20580/20580 [==============================] - 311s 15ms/sample - loss: 4.8735 - acc: 0.0084

Epoch 2/2
12448/20580 [=================>............] - ETA: 2:02 - loss: 4.7875 - acc: 0.0071

标签: pythonmachine-learningkerasjupyter-notebook

解决方案


这里有几件事是错误的:

  • 在对它们进行最大池化之前首先激活您的 conv2d 层!->
model.add(Conv2D(128, (3, 3), input_shape=X.shape[1:], activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))

或者

model.add(Conv2D(128,(3,3),input_shape=X.shape[1:]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
  • 其次,您需要在最后一层之后而不是之前进行 softmax 激活!Softmax 用于计算最后一层的每个神经元的概率,您需要这样做:
model.add(Dense(120))
model.add(Activation("softmax"))
  • 第三,就像 Matias 说的,2 epochs 根本不够,试着增加这个数字!
  • 第四,这种分类的 2 个 conv 层根本不够,也增加它,并改变过滤器的数量以捕获图像上的不同特征
    一个常见的卷积块架构可以如下所示:
model.add(Conv2D(64, (3, 3) , padding='SAME'))
model.add(Activation("relu"))
model.add(Conv2D(64, (3, 3) , padding='SAME'))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

您可以根据需要操作这种块,尝试使用不同数量的过滤器的多个块等

  • 第五,你的全连接网络中有太多的神经元来解决你的问题,尝试一个更简单的架构,在更短的时间内给出更好的结果:
model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu')
model.add(Dense(128)(x)
model.add(Activation('relu'))
model.add(Dense(120))
model.add(Activation('softmax'))

在评论中告诉我这些变化给你带来的结果!


推荐阅读