python - 即使在调整了密集层、激活层和层数之后,损失也被卡住并且准确度低于 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
解决方案
这里有几件事是错误的:
- 在对它们进行最大池化之前首先激活您的 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'))
在评论中告诉我这些变化给你带来的结果!
推荐阅读
- dc.js - 如何在 dc.js 中制作带有 X 轴日期的系列图表
- reactjs - 在功能组件中刷新后反应从本地存储中获取项目
- node.js - 在时间段上过滤节点 js
- python - 使用查询字符串和变量进行 Scrapy
- html - 在导航栏上实现中心垂直标志品牌
- reactjs - 如何告诉 useEffect 等待数据
- python - 如何在 MySQL DB 和 Python 列表中查找常见行数和位置
- excel - 如何使用网络抓取从我的网站注销?
- php - 使用 codeIgniter 使数据不会从文件字段中消失
- r - 如何从 geom_boxplot (ggplot2) 中的图例中删除 alpha?