我试图通过breast Cancer Wisconsin学习我的NN
(我将"id"
列添加为索引,并用"diagnosis"
将sklearn.preprocessing.LabelEncoder
列更改为0和1),但是我的NN并没有减少损失。
我尝试了其他优化器和损失,但这是行不通的。
那是我的NN:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, BatchNormalization, InputLayer
import tensorflow.nn as tfnn
model = Sequential()
model.add(Dense(30, activation = tfnn.relu, input_dim = 30))
model.add(BatchNormalization(axis = 1))
model.add(Dense(60, activation = tfnn.relu))
model.add(BatchNormalization(axis = 1))
model.add(Dense(1, activation = tfnn.softmax))
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.fit(data, target, epochs = 6)
我的输出:
Epoch 1/6
569/569 [==============================] - 2s 3ms/sample - loss: 10.0025 - acc: 0.3726
Epoch 2/6
569/569 [==============================] - 0s 172us/sample - loss: 10.0025 - acc: 0.3726
Epoch 3/6
569/569 [==============================] - 0s 176us/sample - loss: 10.0025 - acc: 0.3726
Epoch 4/6
569/569 [==============================] - 0s 167us/sample - loss: 10.0025 - acc: 0.3726
Epoch 5/6
569/569 [==============================] - 0s 163us/sample - loss: 10.0025 - acc: 0.3726
Epoch 6/6
569/569 [==============================] - 0s 169us/sample - loss: 10.0025 - acc: 0.3726
我似乎经过几次迭代后NN停止了学习(看纪元学习时,在第一个纪元是2s,在其他纪元是0s,在第一个纪元中处理数据的速度是ms / sample,但是在其他纪元中时代使我们/样品) 谢谢您的时间!
答案 0 :(得分:3)
Softmax有sum=1
。
您不能将softmax与1个单位一起使用。永远是1。
使用'sigmoid'
。
也请注意'relu'
。它可能会(由于运气)落入“全零”区域并停止发展。
理想情况下,批处理规范化应该在它之前(这样可以保证总会有一些正数):
model = Sequential()
model.add(Dense(30, input_dim = 30))
model.add(BatchNormalization(axis = 1))
model.add(Activation(tfnn.relu))
model.add(Dense(60)
model.add(BatchNormalization(axis = 1))
model.add(Activation(tfnn.relu))
model.add(Dense(1, activation = tfnn.sigmoid))
答案 1 :(得分:3)
由于您的二进制分类任务包含一个最终单元,因此您不应该不使用tfnn.softmax
作为该层的激活。改用tfnn.sigmoid
,即
model.add(Dense(1, activation = tfnn.sigmoid)) # last layer