作者zax5566x2 (Shad0w)
看板Python
标题[问题] 请教有关CNN分类的问题
时间Tue Nov 19 19:37:09 2019
板上的大大好,
最近自学时所遇到这个问题不能理解,
我想利用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)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.156.98 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1574163431.A.399.html
1F:推 TuCH: 所以是几%?11/19 20:22
测了四组,第一个epoch就会99.5%以上,後面每个epoch都会是100%了,但是我以为应该
要第一个epoch就是100%,所以才会问这个问题
2F:推 OnePiecePR: 就没有说有模型看过资料就能够100%的规定啊11/19 21:19
3F:推 OnePiecePR: 有可能第一个epoch 67%,第二个epoch 76%,第三个82%,11/19 21:22
4F:→ OnePiecePR: 慢慢爬上去,说不定爬到86%就上不去了。11/19 21:22
5F:→ OnePiecePR: relu 还好啊。我也是新手,希望没说错。11/19 21:22
6F:推 OnePiecePR: 不然就再加更多层啊。有没有考虑第一个卷积层的 filte11/19 21:25
7F:→ OnePiecePR: r 比第二层多看看?11/19 21:25
我会觉得要100%是因为都是同样两个资料的关系啦XD 所以想说有没有其他原因导致这个
问题 基本上20个data在第二个epoch就会100%了 但我想说同样的资料不是应该第一个e
poch就应该100%吗(? 才会提出这个问题
※ 编辑: zax5566x2 (140.113.156.98 台湾), 11/19/2019 21:34:29
8F:推 kaneson: 因为gradient descent 找 loss 的 local min 不是一次到11/19 22:32
9F:→ kaneson: 位, learning rate也是因素11/19 22:32
了解,这感觉是我的问题的答案
10F:推 ddavid: 这要看你的准确率怎麽算的吧?11/19 22:39
11F:→ ddavid: 如果是设定为二元分类的话,照理说这边只有0% 50% 100%三11/19 22:41
12F:→ ddavid: 种值,当然这是你的两张图在training testing data都均匀11/19 22:42
13F:→ ddavid: 的情况11/19 22:42
14F:→ ddavid: 但如果你不是做成二元分类而是最後拿到一个分数,比如是A11/19 22:43
15F:→ ddavid: 这张图的分数0.8 B是0.2,然後把1/0做为正确答案的话,就11/19 22:44
16F:→ ddavid: 会评估出非0% 50% 100%的评估值了11/19 22:45
17F:→ ddavid: 另外如果在testing data里面不均匀的话,当然也可能有不一11/19 22:46
18F:→ ddavid: 样的值出现,就算使用二元分类。比如是4:6的话就会有11/19 22:46
19F:→ ddavid: 0% 40% 60% 100%四种可能11/19 22:47
20F:→ ddavid: 而以99.5%这个情况来看,应该不是不均匀的状态,所以就比 11/19 22:47
21F:→ ddavid: 较像是你最後的结果是regression导致的,你得到了非常接近 11/19 22:48
22F:→ ddavid: 1的分数,但可能训练还有不足、或是lr不够小导致最後掉不 11/19 22:49
23F:→ ddavid: 到完美的那个点、又或者掉到某个99.5%的local maximum出不 11/19 22:50
24F:→ ddavid: 来了之类的 11/19 22:50
不太懂二元分类跟分数的说法,二元分类是指只有两种分类情况就是二元分类,还是说需
要特别去设定。
然後不均匀的状态是指两种资料的分布吗?但batch size不是会随机将资料分配,还是因
为只有两种资料,batch size 设为2容易造成分布不均匀的情况。
25F:推 numpy: 两张图片的情况下你复制资料1000倍跟跑1000倍的epochs其实 11/19 23:43
26F:→ numpy: 应该是一样的意思XD 11/19 23:43
27F:推 numpy: 刚好你batch size是211/19 23:47
其实主要是我主观认为应该要第一个epoch就要100%啦XD,因为我自己也没讲清楚我的问
题,但上面好像已经有答案了,就结果而言用相同的资料最终会达到100%是没问题的,只
是不会在第1个epoch而已QQ。
28F:推 ddavid: 其实如果有洗牌的话就有可能稍微跟1000倍epochs不一样啦,11/20 00:08
29F:→ ddavid: 因为前者就有可能连续多次train到同一张图,改epochs的话11/20 00:08
30F:→ ddavid: 就算洗牌也最多就是AB BA这样的连续两次XD11/20 00:09
有洗牌的话是指batch size会随机分布,导致每个batch里两种图像数量分布不一样,所
以还是跟1000倍epoch不一样嘛(?希望我理解没有错
※ 编辑: zax5566x2 (140.113.156.98 台湾), 11/20/2019 21:39:12
※ 编辑: zax5566x2 (140.113.156.98 台湾), 11/20/2019 21:41:15
31F:推 ddavid: 二元分类其实就是你最後吐output之前有没有过一层强制把它 11/20 22:45
32F:→ ddavid: 变成1/0 or 1/-1 or 1/2这样的输出 11/20 22:46
33F:→ ddavid: 如果没有的话,例如两个类别是1 2,那就可能吐出0.892、 11/20 22:47
34F:→ ddavid: 1.812、1.433之类的值,而我们看离1近还离2近最终判断是哪 11/20 22:48
35F:→ ddavid: 一边,但计算Error的时候是用实际的y去减预测出来这个值( 11/20 22:49
36F:→ ddavid: 然後看取绝对值或平方或其他处理)来评估的 11/20 22:50
37F:→ ddavid: 也就是说当你最後有没有通过那层强制离散化处理,则计算的 11/20 22:51
38F:→ ddavid: Error概念是有一点差别的 11/20 22:51
39F:→ ddavid: 有通过的话,你评估的是 预测正确数/应预测总数,也就是以 11/20 22:52
40F:→ ddavid: 案例「数量」为单位的评估 11/20 22:52
41F:→ ddavid: 但最後没有通过那样一层的话,你评估的就会是「你的预测平 11/20 22:53
42F:→ ddavid: 均离实际答案多近」。也就是答案是第2类,结果吐出1.9跟 11/20 22:54
43F:→ ddavid: 1.6,虽然到最後实用时都会当成预测第2类正确来处理,但在 11/20 22:55
44F:→ ddavid: 内部分析评估时1.9显然是比1.6更好的预测 11/20 22:55
45F:→ ddavid: 也因此,例如以你的情况,就算2000张图都猜对了,但是对第 11/20 22:56
46F:→ ddavid: 1类图吐出的output都是1.005,对第2类图吐出的都是1.995, 11/20 22:56
47F:→ ddavid: 那麽你就还是有个0.005的平均误差存在 11/20 22:57
48F:→ ddavid: 即便实用上它吐出1.995我们就会做为预测为第2类来使用 11/20 22:58
49F:→ ddavid: 然後洗牌的部分是说单一epoch里面train图的顺序会打乱 11/20 22:58
50F:→ ddavid: 比如你的training data里面有500张A跟500张B,但连进500张 11/20 22:59
51F:→ ddavid: A再进500张B循环,或者ABABABABAB循环,或者每个epoch都打 11/20 23:00
52F:→ ddavid: 乱,第一个epoch AAABAAABBBABABBA...,第二个BBABAABBAB 11/20 23:00
53F:→ ddavid: ...,不同的打乱方式是有可能让训练出来的模型出现差异的 11/20 23:01
54F:→ ddavid: ,并不会因为都是同样张数就肯定有一样结果 11/20 23:02
55F:→ ddavid: 这也会跟使用的机器学习模型有关,有些模型确实不受顺序影 11/20 23:02
56F:→ ddavid: 响,但以NN往往相对都比较会受到training data顺序影响 11/20 23:03
57F:推 Rockman5042: 把最後一层softmax改成sigmoid ,输出就会只有0跟1 11/21 03:29
58F:推 ddavid: sigmoid也没有直接变成0/1啊 11/21 22:10
59F:→ ddavid: 你要最後直接过一层离散化的0/1 function才行 11/21 22:11
60F:→ ddavid: Sigmoid跟Softmax的差异不是在这边 11/21 22:11
61F:推 ddavid: Softmax确保一次输出多个类别的机率值时,加总会是1 11/21 22:18
62F:→ ddavid: 而Sigmoid没有这个特性,它可以对A类别说0.9同时也对B类别 11/21 22:18
63F:→ ddavid: 说是0.85 11/21 22:18
64F:→ ddavid: 所以如果做multi-label learning的时候就比较会采Sigmoid 11/21 22:19