一.  数据集的准备与预处理

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 对用户名检测判断是否为非法用户名(从数据预处理到模型在线预测)的更多相关文章

  1. 数据挖掘入门系列教程(十一)之keras入门使用以及构建DNN网络识别MNIST

    简介 在上一篇博客:数据挖掘入门系列教程(十点五)之DNN介绍及公式推导中,详细的介绍了DNN,并对其进行了公式推导.本来这篇博客是准备直接介绍CNN的,但是想了一下,觉得还是使用keras构建一个D ...

  2. 【新人赛】阿里云恶意程序检测 -- 实践记录10.13 - Google Colab连接 / 数据简单查看 / 模型训练

    1. 比赛介绍 比赛地址:阿里云恶意程序检测新人赛 这个比赛和已结束的第三届阿里云安全算法挑战赛赛题类似,是一个开放的长期赛. 2. 前期准备 因为训练数据量比较大,本地CPU跑不起来,所以决定用Go ...

  3. 数据挖掘入门系列教程(十二)之使用keras构建CNN网络识别CIFAR10

    简介 在上一篇博客:数据挖掘入门系列教程(十一点五)之CNN网络介绍中,介绍了CNN的工作原理和工作流程,在这一篇博客,将具体的使用代码来说明如何使用keras构建一个CNN网络来对CIFAR-10数 ...

  4. 如何用js检测判断时间日期的间距

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. Jenkins+PMD构建自动化静态代码检测

    前言:软件缺陷是不可避免的,要尽量减少错误并提高软件质量,主要有两在类技术,即缺陷预防和缺陷检测 缺陷预防包括编写更好的设计规范.实施代码审核制度.运行代码静态分析工具.运行单元测试等 PMD是一种开 ...

  6. Python:判断文本中的用户名在数据库中是否存在,存在返回1,不存在返回0

    下面是我写的python的一个小脚本,作用是:判断文本中的用户名在数据库中是否存在,存在返回1,不存在返回0.用的是MySQL数据库. 要注意的是:strip函数的使用,该函数的作用是去除字符串两端多 ...

  7. ajax实现注册用户名时动态显示用户名是否已经被注册(1、ajax可以实现我们常见的注册用户名动态判断)(2、jquery里面的ajax也是类似我们这样封装了的函数)

    ajax实现注册用户名时动态显示用户名是否已经被注册(1.ajax可以实现我们常见的注册用户名动态判断)(2.jquery里面的ajax也是类似我们这样封装了的函数) 一.总结 1.ajax可以实现我 ...

  8. 人脸检测及识别python实现系列(3)——为模型训练准备人脸数据

    人脸检测及识别python实现系列(3)——为模型训练准备人脸数据 机器学习最本质的地方就是基于海量数据统计的学习,说白了,机器学习其实就是在模拟人类儿童的学习行为.举一个简单的例子,成年人并没有主动 ...

  9. 转:Android 判断用户2G/3G/4G移动数据网络

    Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...

随机推荐

  1. LOJ-10104(割点+dfs)

    题目链接:传送门 思路: 求割点的同时求割点删除后所剩的不连通的点的对数,在遍历完成后回溯统计点的个数,具体操作见代码: 注意:结果是long long 类型. #include<iostrea ...

  2. 20155205 郝博雅 《网络对抗技术》Exp1 PC平台逆向破解

    20155205 郝博雅 <网络对抗技术>Exp1 PC平台逆向破解 一.实验准备 1. 掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令& ...

  3. 计算机网络三:域名、IP地址和TCP/IP协议

    一.域名        域名(Domain Name),简称域名.网域,是由一串用点分隔的字符型标志名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时 ...

  4. dell T130服务器加内存

    需求:客户一台dell T130塔式服务器,由于本机只有一条8G内存,系统运行比较慢,需要再增加一条8G内存. 增加过程:第一次增加时由于没有注意机器上内存频率是2133的,所以新增加的一条2400频 ...

  5. 京东618:Docker扛大旗,弹性伸缩成重点 (2015-06-23)

    不知不觉中,年中的618和年终的11.11已经成为中国电商的两大促销日,当然,这两天也是一年中系统访问压力最大的两天.对于京东而言,618更是这一年中最大的一次考试,考点是系统的扩展性.稳定性.容灾能 ...

  6. Jenkins pipeline 并行执行任务流

    笔者在<Jenkins 在声明式 pipeline 中并行执行任务>一文中介绍了如何在声明式 pipeline 中执行并行的任务.前一段时间,Jenkins 发布了 1.3 版的声明式 p ...

  7. 亲子编程玩Micro:bit-动力小车“麦昆”

    少儿编程之风已经吹进各大城市,编程猫.乐博机器人.童程童美等专业培训机构逐渐进入大家的视野,年龄段已经从K12逐渐降低到幼儿园中班.其实,少儿编程的门槛并不高,它不会让孩子一上手就去接触代码,而是会通 ...

  8. 背水一战 Windows 10 (95) - 选取器: 自定义文件保存选取器

    [源码下载] 背水一战 Windows 10 (95) - 选取器: 自定义文件保存选取器 作者:webabcd 介绍背水一战 Windows 10 之 选取器 自定义文件保存选取器 示例1.演示如何 ...

  9. 一篇入门 — Scala 宏

    前情回顾 上一节, 我简单的说了一下反射的基本概念以及运行时反射的用法, 同时简单的介绍了一下编译原理知识, 其中我感觉最为绕的地方, 就属泛型的几种使用方式了. 而最抽象的概念, 就是对于符号和抽象 ...

  10. IM群聊消息究竟是存1份(即扩散读)还是存多份(即扩散写)?

    1.前言 IM的群聊消息,究竟存1份(即扩散读方式)还是存多份(即扩散写方式)? 上一篇文章<IM群聊消息的已读回执功能该怎么实现?>是说,“很容易想到,是存一份”,被网友们骂了,大家争论 ...