Python 网络训练中的奇异损失函数
我正在进行深度学习。我用NSL-KDD数据集创建了一个自动编码器网络。我想用真实的方式训练网络。但在训练过程中,我的损失函数显示了奇怪的数字,我无法理解。 这是我的源代码:Python 网络训练中的奇异损失函数,python,neural-network,deep-learning,loss-function,Python,Neural Network,Deep Learning,Loss Function,我正在进行深度学习。我用NSL-KDD数据集创建了一个自动编码器网络。我想用真实的方式训练网络。但在训练过程中,我的损失函数显示了奇怪的数字,我无法理解。 这是我的源代码: import os import numpy as np from keras.layers import Dense, Input from keras.models import Model def load_nsl_kdd_cup_dataset(filename): with open(filename, '
import os
import numpy as np
from keras.layers import Dense, Input
from keras.models import Model
def load_nsl_kdd_cup_dataset(filename):
with open(filename, 'r')as f:
list1 = []
list2 = []
for i in f:
list1.append(i)
for i in list1:
i = str(i)
labels = i.split(sep=',')
list2.append(labels[:41])
arraylist = np.array(list2)
return arraylist
dirs = './NSL_KDD-master'
train_X = load_nsl_kdd_cup_dataset(os.path.join(dirs,'KDDTrain+.txt'))
test_X = load_nsl_kdd_cup_dataset(os.path.join(dirs, 'KDDTest+.txt'))
print(train_X.shape)
print(test_X.shape)
预处理阶段1。
将标称值转换为数值
def convert_nominal_to_numerical(sets):
list1 = []
col1, col2, col3 = [], [], []
for i in sets:
# print(i[1])
if i[1] == 'tcp':
i[1] = 1
elif i[1] == 'udp':
i[1] = 2
elif i[1] == 'icmp':
i[1] = 3
if i[2] == 'http':
i[2] = 1
elif i[2] == 'private':
i[2] = 2
elif i[2] == 'domain_u':
i[2] = 3
elif i[2] == 'smtp':
i[2] = 4
elif i[2] == 'ftp_data':
i[2] = 5
elif i[2] == 'eco_i':
i[2] = 6
elif i[2] == 'other':
i[2] = 7
elif i[2] == 'ecr_i':
i[2] = 8
elif i[2] == 'telnet':
i[2] = 9
elif i[2] == 'finger':
i[2] = 10
elif i[2] == 'ftp':
i[2] = 11
elif i[2] == 'auth':
i[2] = 12
elif i[2] == 'Z39_50':
i[2] = 13
elif i[2] == 'uucp':
i[2] = 14
elif i[2] == 'courier':
i[2] = 15
elif i[2] == 'bgp':
i[2] = 16
elif i[2] == 'whois':
i[2] = 17
elif i[2] == 'uucp_path':
i[2] = 18
elif i[2] == 'iso_tsap':
i[2] = 19
elif i[2] == 'time':
i[2] = 20
elif i[2] == 'imap4':
i[2] = 21
elif i[2] == 'nnsp':
i[2] = 22
elif i[2] == 'vmnet':
i[2] = 23
elif i[2] == 'urp_i':
i[2] = 24
elif i[2] == 'domain':
i[2] = 25
elif i[2] == 'ctf':
i[2] = 26
elif i[2] == 'csnet_ns':
i[2] = 27
elif i[2] == 'supdup':
i[2] = 28
elif i[2] == 'discard':
i[2] = 29
elif i[2] == 'http_443':
i[2] = 30
elif i[2] == 'daytime':
i[2] = 31
elif i[2] == 'gopher':
i[2] = 32
elif i[2] == 'efs':
i[2] = 33
elif i[2] == 'systat':
i[2] = 34
elif i[2] == 'link':
i[2] = 35
elif i[2] == 'exec':
i[2] = 36
elif i[2] == 'hostnames':
i[2] = 37
elif i[2] == 'name':
i[2] = 38
elif i[2] == 'mtp':
i[2] = 39
elif i[2] == 'echo':
i[2] = 40
elif i[2] == 'klogin':
i[2] = 41
elif i[2] == 'login':
i[2] = 42
elif i[2] == 'ldap':
i[2] = 43
elif i[2] == 'netbios_dgm':
i[2] = 44
elif i[2] == 'sunrpc':
i[2] = 45
elif i[2] == 'netbios_ssn':
i[2] = 46
elif i[2] == 'netstat':
i[2] = 47
elif i[2] == 'netbios_ns':
i[2] = 48
elif i[2] == 'ssh':
i[2] = 49
elif i[2] == 'kshell':
i[2] = 50
elif i[2] == 'nntp':
i[2] = 51
elif i[2] == 'pop_3':
i[2] = 52
elif i[2] == 'sql_net':
i[2] = 53
elif i[2] == 'IRC':
i[2] = 54
elif i[2] == 'ntp_u':
i[2] = 55
elif i[2] == 'rje':
i[2] = 56
elif i[2] == 'remote_job':
i[2] = 57
elif i[2] == 'pop_2':
i[2] = 58
elif i[2] == 'X11':
i[2] = 59
elif i[2] == 'printer':
i[2] = 60
elif i[2] == 'shell':
i[2] = 61
elif i[2] == 'urh_i':
i[2] = 62
elif i[2] == 'tim_i':
i[2] = 63
elif i[2] == 'red_i':
i[2] = 64
elif i[2] == 'pm_dump':
i[2] = 65
elif i[2] == 'tftp_u':
i[2] = 66
elif i[2] == 'http_8001':
i[2] = 67
elif i[2] == 'aol':
i[2] = 68
elif i[2] == 'harvest':
i[2] = 69
elif i[2] == 'http_2784':
i[2] = 70
if i[3] == 'SF':
i[3] = 1
elif i[3] == 'S0':
i[3] = 2
elif i[3] == 'REJ':
i[3] = 3
elif i[3] == 'RSTR':
i[3] = 4
elif i[3] == 'RSTO':
i[3] = 5
elif i[3] == 'S1':
i[3] = 6
elif i[3] == 'SH':
i[3] = 7
elif i[3] == 'S2':
i[3] = 8
elif i[3] == 'RSTOS0':
i[3] = 9
elif i[3] == 'S3':
i[3] = 10
elif i[3] == 'OTH':
i[3] = 11
list1.append(i)
col1.append(i[1])
col2.append(i[2])
col3.append(i[3])
return list1, col1, col2, col3
预处理阶段2。
在每列中查找最小值和最大值
def min_max_finder(col):
minimum_col = 10
maximum_col = 1
for i in col:
if float(i) < minimum_col:
minimum_col = float(i)
if float(i) > maximum_col:
maximum_col = float(i)
return minimum_col, maximum_col
预处理阶段4。
用原始数据替换标准化数据
def replace_normalized_with_original(normalized_col, which_col, data):
for i in range(len(data)):
data[i][which_col] = normalized_col[i]
return data
def convert_list_to_array(list1):
arrays = np.array(list1)
return arrays
list1, col1, col2, col3 = convert_nominal_to_numerical(train_X)
min_col1, max_col1 = min_max_finder(col=col1)
min_col2, max_col2 = min_max_finder(col=col2)
min_col3, max_col3 = min_max_finder(col=col3)
normalized_col1 = data_normalizer(col=col1)
normalized_col2 = data_normalizer(col=col2)
normalized_col3 = data_normalizer(col=col3)
list1 = replace_normalized_with_original(normalized_col=normalized_col1,which_col=1, data=train_X)
list1 = replace_normalized_with_original(normalized_col=normalized_col2, which_col=2, data=train_X)
list1 = replace_normalized_with_original(normalized_col=normalized_col3, which_col=3, data=train_X)
X_train_normalized = convert_list_to_array(list1)
list_test, col1_test, col2_test, col3_test = convert_nominal_to_numerical(test_X)
min_col1_test, max_col1_test = min_max_finder(col=col1_test)
min_col2_test, max_col2_test = min_max_finder(col=col2_test)
min_col3_test, max_col3_test = min_max_finder(col=col3_test)
normalized_col1_test = data_normalizer(col=col1_test)
normalized_col2_test = data_normalizer(col=col2_test)
normalized_col3_test = data_normalizer(col=col3_test)
list_test = replace_normalized_with_original(normalized_col=normalized_col1_test, which_col=1, data=test_X)
list_test = replace_normalized_with_original(normalized_col=normalized_col2_test, which_col=2, data=test_X)
list_test = replace_normalized_with_original(normalized_col=normalized_col3_test, which_col=3, data=test_X)
X_test_normalized = convert_list_to_array(list_test)
X_train_normalized = X_train_normalized.astype('float32')
X_test_normalized = X_test_normalized.astype('float32')
training_X = load_nsl_kdd_cup_dataset(os.path.join(dirs, 'KDDTrain+.txt'))
testing_X = load_nsl_kdd_cup_dataset(os.path.join(dirs, 'KDDTest+.txt'))
用密集层实现自动编码器网络
input_layer = Input(shape=(41,))
encoded = Dense(41, activation='relu')(input_layer)
encoded = Dense(20, activation='relu')(encoded)
encoded = Dense(10, activation='relu')(encoded)
decoded = Dense(10, activation='relu')(encoded)
decoded = Dense(20,activation='relu')(decoded)
decoded = Dense(41, activation='simoid')(decoded)
IDS_autoencoder = Model(inputs=input_layer, outputs=decoded)
IDS_autoencoder.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
IDS_autoencoder.summary()
IDS_autoencoder.fit(X_train_normalized, X_train_normalized,
epochs=5,
batch_size=128,
validation_data=(X_test_normalized,X_test_normalized))
这是我的输出:
对125973个样本进行训练,对22544个样本进行验证
纪元1/5
125973/125973[=========================================================3s 26us/阶跃-损耗:-25513.2260-附件:0.5736-val\u损耗:-5095.4520-val\u附件:0.6534
纪元2/5
125973/125973[==================================================================3s 23us/阶跃-损耗:-25675.6222-acc:0.6492-val_损耗:-5095.5203-val_acc:0.6512
纪元3/5
125973/125973[============================================================3s 23us/阶跃-损耗:-25675.5876-附件:0.6483-val\u损耗:-5095.5543-val\u附件:0.6520
纪元4/5
125973/125973[==============================================================================-3s 23us/阶跃-损耗:-25675.6049-附件:0.6493-val\u损耗:-5095.5665-val\u附件:0.6526
纪元5/5
125973/125973[===========================================================================-3s 23us/阶跃-损耗:-25675.6039-附件:0.6477-val\u损耗:-5095.5619-val\u附件:0.6536
您似乎有多类标签问题,因此您确定要使用二进制交叉熵损失和sigmoid激活函数吗?还有一个关于“sigmoid”的输入错误。我在中使用了很多损失函数,其中一些我得到了wierd损失函数,其中一些我得到了非常低的精度,我更改了损失和优化器,但仍然得到了wierd。你了解你使用的损失函数吗?有些损失函数适用于某些特定的东西,它们期望你的输出在一定的范围内,以便适用。不,我是这个领域的新手。你能帮我吗伙计?你想做什么分类?这是一个41类的分类,每个类都是独占的吗?也就是说,每一个物体都应该被划分为一个类别,并且只有一个类别?
input_layer = Input(shape=(41,))
encoded = Dense(41, activation='relu')(input_layer)
encoded = Dense(20, activation='relu')(encoded)
encoded = Dense(10, activation='relu')(encoded)
decoded = Dense(10, activation='relu')(encoded)
decoded = Dense(20,activation='relu')(decoded)
decoded = Dense(41, activation='simoid')(decoded)
IDS_autoencoder = Model(inputs=input_layer, outputs=decoded)
IDS_autoencoder.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
IDS_autoencoder.summary()
IDS_autoencoder.fit(X_train_normalized, X_train_normalized,
epochs=5,
batch_size=128,
validation_data=(X_test_normalized,X_test_normalized))