Keras 构建DNN 对用户名检测判断是否为非法用户名(从数据预处理到模型在线预测)
一. 数据集的准备与预处理
1 . 收集dataset
(大量用户名--包含正常用户名与非法用户名)
包含两个txt文件 legal_name.txt ilegal_name.txt. 如下图所示
2. 用文件进行预处理
- # Data sets
- import os
- import pandas as pd
- DATAPATH = "../dataset"
- POS = os.path.join(DATAPATH, "legal_name.txt")
- POS_OUTPUT = os.path.join(DATAPATH, "legal_name.csv")
- NEG = os.path.join(DATAPATH, "ilegal_name.txt")
- NEG_OUTPUT = os.path.join(DATAPATH, "ilegal_name.csv")
- def process_org_data(input_data, output_data, lable):
- reader = pd.read_csv(input_data, iterator=True)
- while True:
- try:
- train = reader.get_chunk(10000)
- train['username'] = train['username'].astype(str)
- train['username'] = map(lambda x: x.strip(), train['username'])
- train['length'] = train['username'].apply(len)
- ... ...
- train['label'] = map(lambda x: lable, train['username'])
- train.to_csv(output_data, encoding='utf-8', mode='a', index=False, header=False)
- except StopIteration:
- print "Iteration is stopped."
- break
- if __name__ == '__main__':
- process_org_data(POS, POS_OUTPUT, 1)
- process_org_data(NEG, NEG_OUTPUT, 0)
根据需求提取相应的特征, 输出成 csv 格式,包含特征列与label列
把合法用户dataset与非法用户dataset,合并打乱,切割成 train.csv 和 test.csv
- pos_dataset = read_dataset(POS)
- neg_dataset = read_dataset(NEG)
- dataset = pd.concat([pos_dataset, neg_dataset])
- dataset = dataset.sample(frac=1).reset_index(drop=True)
- train_data = dataset.loc[:200000, :]
- test_data = dataset.loc[200000:, :]
- train_data.to_csv(os.path.join(DataPath, "train.csv"), index=False)
- test_data.to_csv(os.path.join(DataPath, "test.csv"), index=False)
二. Keras 构建DNN模型进行训练与模型保存
- import pandas as pd
- import os
- import tensorflow as tf
- import matplotlib.pyplot as plt
- from sklearn.metrics import confusion_matrix
- from sklearn.metrics import classification_report
- import numpy as np
- tf.logging.set_verbosity(tf.logging.INFO)
- DataPath = "../dataset"
- TRAIN = os.path.join(DataPath, "train.csv")
- TEST = os.path.join(DataPath, "test.csv")
- COLUMNS = ["username", ... , "label"]
- train_dataset = pd.read_csv(TRAIN, skipinitialspace=True, skiprows=1, names=COLUMNS)
- test_dataset = pd.read_csv(TEST, skipinitialspace=True, skiprows=1, names=COLUMNS)
- for col in train_dataset.columns[1:]:
- train_dataset[col] = pd.to_numeric(train_dataset[col], errors='coerce')
- for col in test_dataset.columns[1:]:
- test_dataset[col] = pd.to_numeric(test_dataset[col], errors='coerce')
- X_train = train_dataset.iloc[:, range(1, 19)].values
- y_train = train_dataset.iloc[:, 19].values
- X_test = test_dataset.iloc[:, range(1, 19)].values
- y_test = test_dataset.iloc[:, 19].values
- def build_model():
- ############
- model = tf.keras.models.Sequential()
- model.add(tf.keras.layers.Dense(64, input_dim=18))
- # model.add(tf.keras.layers.BatchNormalization())
- model.add(tf.keras.layers.Activation('relu'))
- model.add(tf.keras.layers.Dense(32))
- # model.add(tf.keras.layers.BatchNormalization())
- model.add(tf.keras.layers.Activation('relu'))
- model.add(tf.keras.layers.Dense(16))
- # model.add(tf.keras.layers.BatchNormalization())
- model.add(tf.keras.layers.Activation('relu'))
- model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
- return
- if __name__ == '__main__':
- model_file = './my_model.h5'
- if (os.path.isfile(model_file)):
- print('model file detected. Loading.')
- model = tf.keras.models.load_model(model_file)
- else:
- print('No model file detected. Starting from scratch.')
- model = build_model()
- model.compile(loss='binary_crossentropy', optimizer="adam", metrics=['accuracy'])
- model.fit(X_train, y_train, batch_size=100, epochs=1, validation_data=(X_test, y_test))
模型输出为 my_model.h5 , 准确率百分之90%
三. 导出tensorflow-serving 模型, 运行在线预测服务
- def save_model_for_production(model, version, path='prod_models'):
- tf.keras.backend.set_learning_phase(1)
- if not os.path.exists(path):
- os.mkdir(path)
- export_path = os.path.join(
- tf.compat.as_bytes(path),
- tf.compat.as_bytes(version))
- builder = tf.saved_model.builder.SavedModelBuilder(export_path)
- model_input = tf.saved_model.utils.build_tensor_info(model.input)
- model_output = tf.saved_model.utils.build_tensor_info(model.output)
- prediction_signature = (
- tf.saved_model.signature_def_utils.build_signature_def(
- inputs={'inputs': model_input},
- outputs={'output': model_output},
- method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))
- with tf.keras.backend.get_session() as sess:
- builder.add_meta_graph_and_variables(
- sess=sess, tags=[tf.saved_model.tag_constants.SERVING],
- signature_def_map={
- 'predict':
- prediction_signature,
- })
- builder.save()
导出为 tensorflow serving 模型
- export_path = "tf-model"
- save_model_for_production(model, "7", export_path)
运行在线预测服务(tensorflow 官方方法)
- /serving/bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=username --model_base_path=/data/model/tf-model
四. client通过grpc 调用预测服务
- #!/usr/bin/env python
- # encoding: utf-8
- """
- @version: v1.0
- @author: zwqjoy
- @contact: zwqjoy@163.com
- @site: https://blog.csdn.net/zwqjoy
- @file: client
- @time: 2018/6/29 15:02
- """
- from grpc.beta import implementations
- import tensorflow as tf
- from tensorflow_serving.apis import predict_pb2
- from tensorflow_serving.apis import prediction_service_pb2
- import numpy as np
- tf.app.flags.DEFINE_string('server', '172.xxx.xxx.xxx:9000',
- 'PredictionService host:port')
- tf.app.flags.DEFINE_string('username', 'demo_user',
- '传入一个username')
- FLAGS = tf.app.flags.FLAGS
- def nametovec(username):
- username = username.astype(str)
- length = len(username)
- ... ...
- return np.array([length, ...])
- def main(_):
- host, port = FLAGS.server.split(':')
- channel = implementations.insecure_channel(host, int(port))
- stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)
- # Send request
- # See prediction_service.proto for gRPC request/response details.
- data = nametovec(FLAGS.username)
- data = data.astype(np.float32)
- request = predict_pb2.PredictRequest()
- request.model_spec.name = 'username' # 这个name跟tensorflow_model_server --model_name="username" 对应
- request.model_spec.signature_name = 'predict' # 这个signature_name 跟signature_def_map 对应
- request.inputs['inputs'].CopyFrom(
- tf.contrib.util.make_tensor_proto(data, shape=(1, 18)))
- result = stub.Predict(request, 10.0) # 10 secs timeout
- print(result)
- if __name__ == '__main__':
- tf.app.run()
Keras 构建DNN 对用户名检测判断是否为非法用户名(从数据预处理到模型在线预测)的更多相关文章
- 数据挖掘入门系列教程(十一)之keras入门使用以及构建DNN网络识别MNIST
简介 在上一篇博客:数据挖掘入门系列教程(十点五)之DNN介绍及公式推导中,详细的介绍了DNN,并对其进行了公式推导.本来这篇博客是准备直接介绍CNN的,但是想了一下,觉得还是使用keras构建一个D ...
- 【新人赛】阿里云恶意程序检测 -- 实践记录10.13 - Google Colab连接 / 数据简单查看 / 模型训练
1. 比赛介绍 比赛地址:阿里云恶意程序检测新人赛 这个比赛和已结束的第三届阿里云安全算法挑战赛赛题类似,是一个开放的长期赛. 2. 前期准备 因为训练数据量比较大,本地CPU跑不起来,所以决定用Go ...
- 数据挖掘入门系列教程(十二)之使用keras构建CNN网络识别CIFAR10
简介 在上一篇博客:数据挖掘入门系列教程(十一点五)之CNN网络介绍中,介绍了CNN的工作原理和工作流程,在这一篇博客,将具体的使用代码来说明如何使用keras构建一个CNN网络来对CIFAR-10数 ...
- 如何用js检测判断时间日期的间距
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Jenkins+PMD构建自动化静态代码检测
前言:软件缺陷是不可避免的,要尽量减少错误并提高软件质量,主要有两在类技术,即缺陷预防和缺陷检测 缺陷预防包括编写更好的设计规范.实施代码审核制度.运行代码静态分析工具.运行单元测试等 PMD是一种开 ...
- Python:判断文本中的用户名在数据库中是否存在,存在返回1,不存在返回0
下面是我写的python的一个小脚本,作用是:判断文本中的用户名在数据库中是否存在,存在返回1,不存在返回0.用的是MySQL数据库. 要注意的是:strip函数的使用,该函数的作用是去除字符串两端多 ...
- ajax实现注册用户名时动态显示用户名是否已经被注册(1、ajax可以实现我们常见的注册用户名动态判断)(2、jquery里面的ajax也是类似我们这样封装了的函数)
ajax实现注册用户名时动态显示用户名是否已经被注册(1.ajax可以实现我们常见的注册用户名动态判断)(2.jquery里面的ajax也是类似我们这样封装了的函数) 一.总结 1.ajax可以实现我 ...
- 人脸检测及识别python实现系列(3)——为模型训练准备人脸数据
人脸检测及识别python实现系列(3)——为模型训练准备人脸数据 机器学习最本质的地方就是基于海量数据统计的学习,说白了,机器学习其实就是在模拟人类儿童的学习行为.举一个简单的例子,成年人并没有主动 ...
- 转:Android 判断用户2G/3G/4G移动数据网络
Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...
随机推荐
- svn的基本使用方法
一,svn的介绍 Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据. 这些数据放置在一个中央资料档案库(repository) 中. ...
- select下拉框左右变换
效果图: 使用jQuery插件---multiselect2side做法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...
- selenium3+python3.6爬页面源码的代码
from selenium import webdriver import unittest,time class my_test(unittest.TestCase): def setUp(self ...
- maven 不能使用 snapshot 的解决方式
最近项目需要用到snapshot的包来进行构建过程,但是怎么都下不了构建的snapshot包.查询了相关资料,发现网上的资料不全,特总结下: 我使用的是nexus来作为代理中央库proxy. 检查步骤 ...
- 用mplayer从视频中按周期提取帧
使用方法:extract file time step folder time 设置时间长度 step 设置周期 均以秒(s)为单位 贡献:1. 从视频文件中周期性提取图片:2. Windows下批处 ...
- Ubuntu 离线安装 docker
1.下载离线包,网址:https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/ 离线安装docker需要下载3个 ...
- 2019/3/7 Java学习之多线程(基础)
Java学习之多线程 讲到线程,就必须要懂得进程,进程是相当于一个程序的开始到结束,而线程是依赖于进程的,没有进程,就没有线程.线程也分主线程和子线程,当在主线程开启子线程时,主线程结束,而子线程还可 ...
- 安装Pangolin
Pangolin是一个用于OpenGL显示/交互以及视频输出的一个轻量级 快速开发库 一:安装必要的库 1.Glew sudo apt-get install libglew-dev 2.Cmake ...
- Android开发者的Anko使用指南(四)之Layouts
为什么不使用xml绘制Andoird的UI? 类型不安全 非空不安全 xml迫使你在很多布局中写很多相同的代码 设备在解析xml时会耗费更多的cpu运行时间和电池 最重要的时,它允许任何代码重用 简单 ...
- 第一课:Python入门(笔记)
一.变量 1.什么是变量 #变量即变化的量,核心是“变”与“量”二字,变即变化,量即衡量状态. 2.为什么要有变量 #程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制 ...