Ran*_*amy 7 machine-learning sparse-matrix multilabel-classification keras
我有一个多标签分类问题,我使用了以下代码,但是在第一个时期,验证准确性跳升到99%,考虑到数据的复杂性,这是很奇怪的,因为输入特征是从初始模型(pool3:0)层中提取的2048个输入特征,标签为[1000],(这是文件的链接,其中包含功能和标签的示例:https : //drive.google.com/file/d/0BxI_8PO3YBPPYkp6dHlGeExpS1k/view?usp=sharing),我是否有此东西在这里做错了?
注意:标签为稀疏向量,仅包含1〜10项,因为1其余为零
model.compile(optimizer='adadelta', loss='binary_crossentropy', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
预测的输出为零!
在训练模型以干扰预测时,我做错了什么?
#input is the features file and labels file
def generate_arrays_from_file(path ,batch_size=100):
x=np.empty([batch_size,2048])
y=np.empty([batch_size,1000])
while True:
f = open(path)
i = 1
for line in f:
# create Numpy arrays of input data
# and labels, from each line in the file
words=line.split(',')
words=map(float, words[1:])
x_= np.array(words[0:2048])
y_=words[2048:]
y_= np.array(map(int,y_))
x_=x_.reshape((1, -1))
#print np.squeeze(x_)
y_=y_.reshape((1,-1))
x[i]= x_
y[i]=y_
i += 1
if i == batch_size:
i=1
yield (x, y)
f.close()
model = Sequential()
model.add(Dense(units=2048, activation='sigmoid', input_dim=2048))
model.add(Dense(units=1000, activation="sigmoid",
kernel_initializer="uniform"))
model.compile(optimizer='adadelta', loss='binary_crossentropy', metrics=
['accuracy'])
model.fit_generator(generate_arrays_from_file('train.txt'),
validation_data= generate_arrays_from_file('test.txt'),
validation_steps=1000,epochs=100,steps_per_epoch=1000,
verbose=1)
Run Code Online (Sandbox Code Playgroud)
我认为准确性的问题是您的输出稀疏。
Keras使用以下公式计算准确性:
K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
Run Code Online (Sandbox Code Playgroud)
因此,在您的情况下,只有1〜10个非零标签,对全0的预测将产生99.9%〜99%的准确性。
至于没有学习的问题,我认为问题是您使用了S型作为最后一次激活,并使用0或1作为输出值。这是一种不好的做法,因为为了使S型返回0或1,它作为输入获得的值必须非常大或非常小,这反映在具有很大(绝对值)权重的网络上。此外,由于每个训练输出中的1远小于0,因此网络很快就会到达一个固定点,在该点中,它只输出所有零(这种情况下的损失也不大,应该在0.016〜0.16左右)。
您可以做的是缩放输出标签,例如使它们在(0.2,0.8)之间,以使网的权重不会太大或太小。或者,您可以使用relu作为激活功能。
| 归档时间: |
|
| 查看次数: |
1813 次 |
| 最近记录: |