简体   繁体   English

Keras形状错误的密集输出层

[英]Keras dense output layer having wrong shape

I've been trying to write a python model in keras that can detect a few types of DDOS attacks for a high school project but can't get the output layer to have the correct shape. 我一直在尝试在keras中编写一个python模型,该模型可以为高中项目检测几种类型的DDOS攻击,但无法使输出层具有正确的形状。

My code: https://github.com/Jacobvs/DDOS-ML-Detection 我的代码: https : //github.com/Jacobvs/DDOS-ML-Detection

import os

import arff
import numpy as np
from keras.layers import Dense, Dropout
from keras.models import Sequential
from keras.utils import to_categorical

file = open("data/final-dataset-short.arff", 'r')


# print(type(d))

# file = open('data/final dataset.arff', 'r')

# d = decoder.decode(file.read(), encode_nominal=True)
# pprint.pprint(d)
#
# dataset = arff.load(open('data/final dataset.arff', 'rb'))
# #data = dataset['data']
# pprint.pprint(dataset)


def generate_model(shape):
    model = Sequential()

    model.add(Dense(26, input_dim=shape, activation='relu'))
    model.add(Dropout(0.15))
    model.add(Dense(64, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.25))
    model.add(Dense(64, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(32, activation='relu'))
    model.add(Dropout(0.15))
    model.add(Dense(1, activation='sigmoid'))

    return model


def scrape_data():
    # outputs d as a dictionary
    decoder = arff.ArffDecoder()
    data = decoder.decode(file, encode_nominal=True)

    vals = [val[0: -1] for val in data['data']]
    labels = [label[-1] for label in data['data']]
    labels = to_categorical(labels, 5)
    training_data = vals[0: int(.9 * len(vals))]
    training_labels = labels[0: int(.9 * len(vals))]
    validation_data = vals[int(.9 * len(vals)):]
    validation_labels = vals[int(.9 * len(vals)):]

    print(training_labels.shape)

    np.save('saved-data/vals', np.asarray(vals))
    np.save('saved-data/labels', np.asarray(labels))
    np.save('saved-data/training_data', np.asarray(training_data))
    np.save('saved-data/validation_data', np.asarray(validation_data))
    np.save('saved-data/training_labels', np.asarray(training_labels))
    np.save('saved-data/validation_labels', np.asarray(validation_labels))

scrape_data()
data_train = np.load('saved-data/training_data.npy')
label_train = np.load('saved-data/training_labels.npy')

data_eval = np.load('saved-data/validation_data.npy')
label_eval = np.load('saved-data/validation_labels.npy')


model = generate_model(data_train.shape[1])
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')

model.fit(data_train, label_train, epochs=5)

print(model.evaluate(data_eval, label_eval))

The error i'm getting: 我得到的错误:

Using TensorFlow backend.
/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/importlib/_bootstrap.py:205: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6
  return f(*args, **kwds)
Traceback (most recent call last):
  File "/Users/Jacob/git/DDOS-ML-Detection/ddos-detect.py", line 73, in <module>
    model.fit(data_train, label_train, epochs=5)
  File "/usr/local/lib/python3.6/site-packages/keras/models.py", line 960, in fit
    validation_steps=validation_steps)
  File "/usr/local/lib/python3.6/site-packages/keras/engine/training.py", line 1581, in fit
    batch_size=batch_size)
  File "/usr/local/lib/python3.6/site-packages/keras/engine/training.py", line 1418, in _standardize_user_data
    exception_prefix='target')
  File "/usr/local/lib/python3.6/site-packages/keras/engine/training.py", line 153, in _standardize_input_data
    str(array.shape))
ValueError: Error when checking target: expected dense_6 to have shape (None, 1) but got array with shape (22, 5)

I'd appreciate any help I can get on this issue. 我很乐意就此问题提供任何帮助。

Thanks 谢谢

在最后一层中,您有1个输出神经元,但显然您的label_train有6个。因此,您需要更改为具有相同数量的输出神经元或调整标签数据。

If your target data really should have 5 values per sample, then you should have a Dense(5) at the end, not a Dense(1) . 如果目标数据确实每个样本应该有5个值,那么最后应该有一个Dense(5) ,而不是Dense(1)

If that's not true, then you've got a problem with your data. 如果那不是真的,则说明您的数据有问题。

The generate_model() function should be as follows generate_model()函数应如下所示

def generate_model(shape):
    model = Sequential()
    model.add(Dense(26, input_dim=shape, activation='relu'))
    model.add(Dropout(0.15))
    model.add(Dense(64, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.25))
    model.add(Dense(64, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(32, activation='relu'))
    model.add(Dropout(0.15))
    model.add(Dense(5, activation='sigmoid'))

   return model

The last dimension of your training labels must be 5, hence the error 训练标签的最后一个尺寸必须为5,因此会出现错误

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM