[问题] 请教有关CNN分类的问题

楼主: zax5566x2 (Shad0w)   2019-11-19 19:37:09
板上的大大好,
最近自学时所遇到这个问题不能理解,
我想利用keras分类2个图片,
我将这2个图片资料复制成2000个,
也就是各1000个相同的资料,
并将其中20%设为验证组,
在没有设定Dropout的情况下,
为什么训练组在第1次训练时,准确率不会是100%,
因为是用一模一样的资料不是应该不会有错误的情况,
我想问是因为activation的选用所造成的,还是有其他因素导致这个结果?
希望有人能替我解惑,感谢。
以下是模型有关的code
#建立模型
model = Sequential()
# 模型加入【输入层】与【第一层卷积层】
model.add(Conv2D(filters=16,
kernel_size=(5,5),
padding='same',
input_shape=(306,102,1),
activation='relu'))
# 模型加入【第一层池化层】
model.add(MaxPooling2D(pool_size=(2, 2)))
# 模型加入【第二层卷积层】
model.add(Conv2D(filters=64,
kernel_size=(5,5),
padding='same',
activation='relu')
# 模型加入【第二层池化层】
model.add(MaxPooling2D(pool_size=(2, 2)))
# 模型加入【平坦层】
model.add(Flatten())
# 模型加入【隐藏层】
model.add(Dense( units = 128,
activation='relu'))
model.add(Dense(2,
activation='softmax'))
print(model.summary())
# 设定模型的训练方式
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
train_history=model.fit(x=x_Train4D_normalize,
y=y_TrainOneHot,
validation_split=0.2,
epochs=5,
batch_size=2,
verbose=2)
作者: TuCH (谬客)   2019-11-19 20:22:00
所以是几%?
作者: OnePiecePR (OPPR)   2019-11-19 21:19:00
就没有说有模型看过资料就能够100%的规定啊有可能第一个epoch 67%,第二个epoch 76%,第三个82%,慢慢爬上去,说不定爬到86%就上不去了。relu 还好啊。我也是新手,希望没说错。不然就再加更多层啊。有没有考虑第一个卷积层的 filter 比第二层多看看?
作者: kaneson (Lance)   2019-11-19 22:32:00
因为gradient descent 找 loss 的 local min 不是一次到位, learning rate也是因素
作者: ddavid (谎言接线生)   2019-11-19 22:39:00
这要看你的准确率怎么算的吧?如果是设定为二元分类的话,照理说这边只有0% 50% 100%三种值,当然这是你的两张图在training testing data都均匀的情况但如果你不是做成二元分类而是最后拿到一个分数,比如是A这张图的分数0.8 B是0.2,然后把1/0做为正确答案的话,就会评估出非0% 50% 100%的评估值了另外如果在testing data里面不均匀的话,当然也可能有不一样的值出现,就算使用二元分类。比如是4:6的话就会有0% 40% 60% 100%四种可能而以99.5%这个情况来看,应该不是不均匀的状态,所以就比较像是你最后的结果是regression导致的,你得到了非常接近1的分数,但可能训练还有不足、或是lr不够小导致最后掉不到完美的那个点、又或者掉到某个99.5%的local maximum出不来了之类的
作者: numpy (那么拍)   2019-11-19 23:43:00
两张图片的情况下你复制资料1000倍跟跑1000倍的epochs其实应该是一样的意思XD刚好你batch size是2
作者: ddavid (谎言接线生)   2019-11-20 00:08:00
其实如果有洗牌的话就有可能稍微跟1000倍epochs不一样啦,因为前者就有可能连续多次train到同一张图,改epochs的话就算洗牌也最多就是AB BA这样的连续两次XD
作者: Rockman5042 (洛克面)   2019-11-21 03:29:00
把最后一层softmax改成sigmoid ,输出就会只有0跟1
作者: ddavid (谎言接线生)   2019-11-21 22:10:00
sigmoid也没有直接变成0/1啊你要最后直接过一层离散化的0/1 function才行Sigmoid跟Softmax的差异不是在这边Softmax确保一次输出多个类别的机率值时,加总会是1而Sigmoid没有这个特性,它可以对A类别说0.9同时也对B类别说是0.85所以如果做multi-label learning的时候就比较会采Sigmoid

Links booklink

Contact Us: admin [ a t ] ucptt.com