Author: volica

5,325  2

内网穿透技术汇总

全球IPv4有42.9亿地址,因此随着互联网的发展,IPv4地址已不足以满足增长需要。 对于IP地址空间枯竭的问题两种延缓办法: 使用子网掩码,将网络分成更小块,提高利用率 使用NAT[/latex]gt; NAPT NAT简介 NAT技术 NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了内网IP地址,但又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。 NAT的用法是有一个公网IP地址池,当有内网IP地址要向公网通讯的时候,就随机选一IP地址作为其出口IP。 更常用的NAPT技术 NAPT(Network Address Port Translation,网络端口地址转换)是一种较流行的NAT变体,是<内部地址+内部端口>与<外部地址+外部端口>之间的转换。他只有一个外部IP地址,如果有内部IP地址要出去,他就随机选一个端口来连接Internet,来表示那台内网机器。 NAT的四种类型 Full Cone NAT将内网请求(例192.168.1.2:3990)映射至路由(例60.220.123.12:45003),公网主机(例201.11.23.1:80)即可与之直接通讯(向60.220.123.12:45003发包即可);另一台公网主机(例102.1.2.3:99)向路由器映射地址(60.220.123.12:45003)发包也可以到达内网主机端口(192.168.1.2:3990) Restricted Cone NAT增加了安全措施,内网机器(例192.168.1.2:3990)需先向公网主机(例201.11.23.1:任意端口)发送过包,NAT路由才会转发公网主机的包,其他主机的包则丢弃;另一台公网主机(例102.1.2.3:99)向路由器映射地址(60.220.123.12:45003)发包不能到达内网主机端口(192.168.1.2:3990),必须内网机器(192.168.1.2:3990)先向公网主机(102.1.2.3:任意端口)发送过包 Port-Restricted Cone NAT继续提升安全措施,内网机器(例192.168.1.2:3990)需先向公网主机指定端口(例201.11.23.1:80)发送过包,NAT路由才会转发公网主机80端口的包,其他端口的包则丢弃;另一台公网主机(例102.1.2.3:99)向路由器映射地址(60.220.123.12:45003)发包不能到达内网主机端口(192.168.1.2:3990),必须内网机器(192.168.1.2:3990)先向公网主机(102.1.2.3:99)发送过包 Symmetric NAT变态提升安全性,内网主机相同端口对不同公网主机的映射端口不同,例如内网发包 192.168.1.2:3990[/latex]gt;201.11.23.1:80 映射至路由 60.220.123.12:45003 此时 60.220.123.12:45003 发包至 60.220.123.12:45003 可接受内网发包 192.168.1.2:3990[/latex]gt;102.1.2.3:99 映射至路由 60.220.123.12:6033此时 102.1.2.3:99 发包至 60.220.123.12:6033 可接受但是 102.1.2.3:99 发包至 60.220.123.12:45003 被拒绝 内网穿透 NAT穿透原理 对于 Full Cone NAT处于不同内网的主机A和主机B,各自先连接服务器,从而在各自NAT设备上打开了一个“孔”,服务器收到主机A和主机B的连接后,知道A与B的公网地址和NAT分配给它们的端口号,然后把这些NAT地址与端口号告诉A与B;A与B即可连接对方的公网地址和端口直接进行通信。服务器在这里充当“介绍人”,告诉A与B对方的地址和端口号。 对于 Restricted Cone NAT 及 Port Restricted Cone NAT处于不同内网的主机A和主机B,各自先连接服务器,从而在各自NAT设备上打开了一个“孔”,服务器收到主机A和主机B的连接后,知道A与B的公网地址和NAT分配给它们的端口号,然后把这些NAT地址与端口号告诉A与B;然后主机A发送一个UDP信息到主机B的公网地址上,同时在会话期内主机B也发送一个UDP信息到主机A的公网地址上;A与B即可直接进行通信。 对于 Symmetric NAT处于不同内网的主机A和主机B,各自先连接服务器,服务器收到主机A和主机B的连接后,知道A与B的公网地址,然后把这些NAT地址告诉A与B;但A与B无法知道应该向哪个端口发送包,目前可用的是端口预测打孔,即会话期内主机A发送多个UDP信息到主机B的公网地址:所有端口上,同时主机B也发送多个UDP信息到主机A的公网地址:所有端口上;A与B即可直接进行通信。 常用穿透技术 UPnP协议 Universal Plug and Play,缩写为UPnP,对于一台内网电脑,UPnP功能可以使网关或路由器的NAT模块做自动端口映射,将监听的端口从网关或路由器映射到内网电脑上,同时网关或路由器的网络防火墙模块开始对Internet上其他电脑开放这个端口。 STUN协议 Simple Traversal of UDP over NATs (NAT下UDP的简单穿越)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。一旦客户端得知了Internet端的UDP端口,通信就可以开始了。 UDP打洞 即使用NAT穿透原理完成内网穿透 端口转发 由服务器来转发包(消耗服务器带宽),有正向代理、反向代理等方式,类似于VPN 常用穿透软件 ngork 及各种分支 ngork官网 开源,可以自己搭建 frp fast reverse proxy 开源,安全,可以自己搭建 花生壳 闭源,收费较贵 PP透 Peergine 商业基础服务 nat123 闭源,收费...

17,384  1

Win10下安装Tensorflow1.8 GPU版(CUDA9.2)(更新至TF1.12)

装Ubuntu死活进不了系统,貌似是显卡问题,所以退而求其次,在Windows下装Tensorflow GPU版本。出乎意料的是这一次安装相比Tensorflow-0.8的时候容易多了,网上的教程和答疑多了很多,遇到的问题基本都能找到解决方法,同时社区对新版本的支持力度也很大。所需基础软件(对,就说的NVIDIA家)都可以放心使用最新版了! 操作系统:Windows 10 64位 专业版 1803 Visual Studio Community 2017 版本15.7.4 Python:Anaconda 5.2 下 Python 3.6 GPU:显卡驱动398.11-notebook-win10-64bit-international-whql + cuda_9.2.88_win10 + cudnn-9.2-windows10-x64-v7.1 Tensorflow: 1.8 Tips:查看Windows版本 一起按Windows键和I键,点击系统,最下方关于 一、安装vs2017 从CUDA指南中可以找到对VS的要求,如下图CUDA9.2目前支持Visual Studio 2017 (RTW and Update 6),因此我目前VS的版本明显高出指南的要求,但高了总比低了好。 安装VS时,按自己需求选择功能,然后要注意选择右边的Windows 10 SDK,否则CUDA的Sample会编译失败。 二、安装CUDA9.2 首先更新显卡驱动,到NVIDA官网下载显卡最新的驱动,然后安装 下载CUDA 9.2 Windows x86_64 10 exe(local),将Base Installer和 Patch 1 (Released May 16, 2018)都下载下来,得到cuda_9.2.88_win10.exe(主程序)和cuda_9.2.88.1_windows.exe(补丁包)。 右键cuda主程序,用解压软件解压到临时目录,然后运行setup.exe,选择自定义安装,只勾选CUDA下的Development、Runtime、Documentation、Samples,如下图。不选择Visual Studio Integration是因为我的VS版本高于CUDA支持版本,会有Visual Studio Integration安装失败问题,因此要绕一下,感谢知乎申尚昆的帮助,以及英伟达社区 顺利安装完CUDA后,打开CUDA解压的临时目录,找到 CUDAVisualStudioIntegration/extras/visual_studio_integration/MSBuildExtensions 复制里面的所有文件到 VS2017 的安装目录(C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/VCVCTargets/BuildCustomizations)VS对应目录可在CUDA指南找到,如下图。 查看环境变量中是否有CUDA_PATH,没有的话自己加上,如下图。 三、安装CUDNN 很多攻略贴中提供的CUDNN下载页面版本不全,v7.1只有Linux版,推荐从NVIDIA首页登录后找到cudnn,按网站指引下载。贴几个可能有效的地址: 官网 https://developer.nvidia.com/rdp/cudnn-downloadCSDN https://download.csdn.net/download/enight0000/10490781 解压cudnn压缩包,将压缩包里的内容拷贝到CUDA的安装目录(C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.2)并覆盖对应的文件夹 四、测试CUDA Samples(可跳过) 打开CUDA安装目录:C:/ProgramData/NVIDIA Corporation/CUDA Samples/v9.2/5_Simulations/nbody 找到nbody_vs2017.sln,用vs2017打开,编译成功并运行,如成功则CUDA安装成功,如有错也不一定是CUDA的问题。 五、安装Tensorflow-gpu 为了Python不混乱,首先安装Anaconda 5.2(犹豫了很久怕麻烦,装上后发现真好用,一下就上手!) 设置Anaconda镜像加速下载,在CMD命令行下执行以下命令:conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config –set show_channel_urls yes 添加Tensorflow环境conda create –name tensorflow python=3.6...

10,348  3

阿里云Centos7下搭建Jupyter Notebook服务(亦可自建外网访问)

网上安装教程鱼龙混杂,多数都有莫名其妙的坑无法走通,因此记录一下配置过程。Jupyter Notebook仅可同时一人使用,多人使用会同时修改一个文件;多人使用请关注JupyterHub自建外网访问需要路由支持公网IP+映射端口,否则请使用Holer直接转发 已经过测试的系统有:CentOS7 64位Redhat Enterprise Linux6 64位如果这篇文章能帮您成功完成安装,请您留言告知您的系统环境~如遇到问题更欢迎留言~ 在阿里云购买ECS服务器不多说,设置系统密码,并登陆进系统 第一步:安装SSH(可跳过) 阿里自带的浏览器控制延迟很大,体验极差我选择使用SSH并用Putty登陆 CentOS中安装并启动SSH rpm -qa |grep ssh #查看SSH是否安装 yum install openssh-server #安装SSH service sshd start #启动SSH服务,stop为停止 netstat -antp |grep sshd #查看是否启动22端口,会显示一条在22端口监听的信息 iptables -nL #看网络策略是否禁止了22端口,不显示为成功 chkconfig sshd on #设置SSH服务为开机启动 下载Putty并连接CentOS https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 连接并测试 为了安全起见,修改SSH服务端口 vim /etc/ssh/sshd_config 找到“#Port 22”修改为Port 22Port 20000注意去掉#即保留22端口,同时增加20000端口 重启服务 service sshd restart 修改安全策略 在阿里云-云服务器 ECS-安全组-配置规则-快速创建规则自定义端口 TCP 20000授权 地址段访问 0.0.0.0/0 连接并测试 若成功,则删除安全策略中22端口的配置,删除sshd_config中的22端口 第二步:安装Python3(亦可以安装miniconda) 查看系统信息 查看自带Python版本,得到Python2.7.5 python 查看Python安装路径,得到位于/usr/bin/python目录下 which python 由于centos7原本就安装了Python2,且有很多系统命令使用Python2,因此不删除Python2。同时为了使用Tensorflow,Jupyter服务基于Python3安装。 安装基础依赖环境 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel 下载 浏览器打开 https://www.python.org/ftp/python/ 查看寻找Python版本,由于Tensorflow还不支持Python3.6版本,因此安装Python3.5.4 wget https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tgz 创建Python3的目录 mkdir /usr/local/python3 解压下载文件并进入解压后目录 tar -zxvf Python-3.5.4.tgz cd Python-3.5.4 执行自定义安装 ./configure –prefix=/usr/local/python3...

4,046  2

[TF.7]多类别神经网络

本文参考《Google机器学习速成课程》多类别神经网络点击下载源码 设置 !wget https://storage.googleapis.com/mledu-datasets/mnist_train_small.csv -O /tmp/mnist_train_small.csv import glob import io import math import os from IPython import display from matplotlib import cm from matplotlib import gridspec from matplotlib import pyplot as plt import numpy as np import pandas as pd import seaborn as sns from sklearn import metrics import tensorflow as tf from tensorflow.python.data import Dataset tf.logging.set_verbosity(tf.logging.ERROR) pd.options.display.max_rows = 10 pd.options.display.float_format = ‘{:.1f}’.format mnist_dataframe = pd.read_csv( io.open("/tmp/mnist_train_small.csv", "r"), sep=",", header=None) # Use just the first 10,000 records for training/validation mnist_dataframe = mnist_dataframe.head(10000) mnist_dataframe = mnist_dataframe.reindex(np.random.permutation(mnist_dataframe.index)) training_targets, training_examples = parse_labels_and_features(mnist_dataframe[:7500]) validation_targets, validation_examples = parse_labels_and_features(mnist_dataframe[7500:10000]) seaborn Seaborn是基于matplotlib的python数据可视化库,提供更高层次的API封装,使用起来更加方便快捷。 构造神经网络模型 # Extracts labels and...

3,359  0

[TF.6]正则化Regularization

模型选择的典型方法是正则化(Regularization),正则化是结构风险最小化策略的视线,是在经验风险上加一个正则化项(regularizer)或罚项(penalty term),正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。 —————《统计学习方法》李航 L0正则化 L0范数是指向量中非0的元素的个数,很难优化求解(NP难问题) L1正则化 L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。L1正则化根据权重的绝对值的总和来惩罚权重。在依赖稀疏特征的模型中,L1 正则化有助于使不相关或几乎不相关的特征的权重正好为 0,从而将这些特征从模型中移除,有助于减小模型。但如果正则化率过高,该模型便不能收敛,损失也会很高。 L2正则化 L2正则化根据权重的平方和来惩罚权重。L2 正则化有助于使离群值(具有较大正值或较小负值)权重接近于 0,但又不正好为 0。在线性模型中,L2 正则化始终可以改进泛化,有助于防止过拟合。 工程化 正则化代码 正则化会降低训练速度 # FtrlOptimizer 是一种使用L1正则化的方法,能比标准梯度下降法得到更好结果 my_optimizer = tf.train.FtrlOptimizer(learning_rate=learning_rate, **l1_regularization_strength=regularization_strength**) my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0) 计算模型大小 #该函数深入使用了 Estimator API def model_size(estimator): variables = estimator.get_variable_names() size = 0 for variable in variables: if not any(x in variable for x in [‘global_step’, ‘centered_bias_weight’, ‘bias_weight’, ‘Ftrl’] ): size += np.count_nonzero(estimator.get_variable_value(variable)) return size

2,802  0

[TF.5]分类与评估

本文参考《Google机器学习速成课程》分类 评估方式 准确率|识别率 错误率|误分类率 当使用分类不平衡的数据集时,准确率并不能反映全面情况 精确率|精度 真正例率|敏感度|召回率 真负例率|特效性 精确率和召回率往往此消彼长 分类操作工程化 # 线性多分类器 linear_classifier = tf.estimator.LinearClassifier( feature_columns=construct_feature_columns(training_examples), optimizer=my_optimizer ) # 获取实值预测概率 training_probabilities = linear_classifier.predict(input_fn=predict_training_input_fn) training_probabilities = np.array([item[‘probabilities’] for item in training_probabilities]) #获得一个多维数组[[0.813 0.184][0.821 0.179]…[0.557 0.443]] # 使用Sklearn 的 log_loss 函数可基于这些概率计算对数损失函数 training_log_loss = metrics.log_loss(training_targets, training_probabilities) #LinearClassifier.evaluate 可计算准确率和 AUC 等实用指标 predict_validation_input_fn = lambda: my_input_fn(validation_examples, validation_targets["median_house_value_is_high"], num_epochs=1, shuffle=False) evaluation_metrics = linear_classifier.evaluate(input_fn=predict_validation_input_fn) print "AUC on the validation set: %0.2f" % evaluation_metrics[‘auc’] print "Accuracy on the validation set: %0.2f" % evaluation_metrics[‘accuracy’] ROC曲线 在逻辑回归里,我们会设一个阈值,大于这个值的为正类,小于这个值为负类。如果我们减小这个阀值,那么更多的样本会被识别为正类。这会提高正类的识别率,但同时也会使得更多的负类被错误识别为正类。为了形象化这一变化,引入ROC(Receiver Operating Characteristic)ROC曲线有个很好的特性,当测试集中的正负样本的分布变化的时候(类不平衡现象),ROC曲线能够保持不变,因此更适合用于评价一个分类器好坏AUC(Area Under Curve)被定义为ROC曲线下的面积,AUC值越大的分类器,正确率越高 # 绘制 ROC 曲线 # 使用类别概率(例如由 LinearClassifier.predict 和 validation_probabilities = linear_classifier.predict(input_fn=predict_validation_input_fn) #只要预测为正的那一列 validation_probabilities = np.array([item[‘probabilities’][3] for item in validation_probabilities])...

4,410  1

[TF.4]特征工程

本文参考《Google机器学习速成课程》使用TF的基本步骤 点击下载源码 一、将原始数据映射到特征 映射字符串值 为要表示的所有特征的字符串值定义一个词汇表 使用该词汇表创建一个独热编码 映射分类(枚举)值 例:Lowland Countries 的特征只包含3个可能值{‘Netherlands’, ‘Belgium’, ‘Luxembourg’} Id feature_value 0 2 1 0 2 1 则表示为 3 个单独的布尔值特征x1:是荷兰吗?x2:是比利时吗?x3:是卢森堡吗? Id feature_value_0 feature_value_1 feature_value_2 0 0 0 1 1 1 0 0 2 0 1 0 避免很少使用的离散特征值 良好的特征值应该在数据集中出现大约 5 次以上 清理数据 清查 遗漏值 重复样本 不良标签。 例如,有人错误地将一颗橡树的图片标记为枫树。 不良特征值。 例如,有人输入了多余的位数,或者温度计被遗落在太阳底下。 特征值归一化 指将浮点特征值从自然范围(例如 100 到 900)转换为标准范围(例如 0 到 1 或 -1 到 +1) 特征值缩放 不需要对每个浮点特征进行完全相同的缩放,即使特征 A 的范围是 -1 到 +1,同时特征 B 的范围是 -3 到 +3,也不会产生什么恶劣的影响 #线性缩放 def linear_scale(series): min_val = series.min() max_val = series.max() scale = (max_val – min_val) / 2.0 return series.apply(lambda x:((x – min_val) / scale) – 1.0)...

5,058  0

[TF.3]多特征训练与交叉验证

本文参考《Google机器学习速成课程》验证点击下载源码 交叉验证分为: 简单交叉验证 S折较差验证 留一交叉验证 import math from IPython import display from matplotlib import cm from matplotlib import gridspec from matplotlib import pyplot as plt import numpy as np import pandas as pd from sklearn import metrics import tensorflow as tf from tensorflow.python.data import Dataset tf.logging.set_verbosity(tf.logging.ERROR) pd.options.display.max_rows = 10 pd.options.display.float_format = ‘{:.1f}’.format #加载并准备数据 california_housing_dataframe = pd.read_csv(“https://storage.googleapis.com/mledu-datasets/california_housing_train.csv”, sep=”,”) #对数据进行随机化处理 california_housing_dataframe = california_housing_dataframe.reindex( np.random.permutation(california_housing_dataframe.index)) #对多个特征进行预处理 def preprocess_features(california_housing_dataframe): selected_features = california_housing_dataframe[ [“latitude”, “longitude”, “housing_median_age”, “total_rooms”, “total_bedrooms”, “population”, “households”, “median_income”]] processed_features = selected_features.copy() # Create a synthetic feature. processed_features[“rooms_per_person”] = ( california_housing_dataframe[“total_rooms”] / california_housing_dataframe[“population”]) return processed_features #对目标特征进行预处理 def preprocess_targets(california_housing_dataframe): output_targets = pd.DataFrame() # Scale...

3,066  1

[TF.2]合成特征和离群值

本文参考《Google机器学习速成课程》使用TF的基本步骤 尝试合成特征 california_housing_dataframe["rooms_per_person"] =(california_housing_dataframe["total_rooms"] / california_housing_dataframe["population"]) calibration_data = train_model( learning_rate=0.00005, steps=500, batch_size=5, input_feature="rooms_per_person" ) #period 09 : 237.29 处理离群值 #识别离群值 plt.figure(figsize=(15, 6)) plt.subplot(1, 2, 1) plt.scatter(calibration_data["predictions"], calibration_data["targets"]) #绘制 rooms_per_person 的直方图,发现少量离群值 plt.subplot(1, 2, 2) _ = california_housing_dataframe["rooms_per_person"].hist() #截取离群值 california_housing_dataframe["rooms_per_person"] = ( california_housing_dataframe["rooms_per_person"]).apply(lambda x: min(x, 5)) _ = california_housing_dataframe["rooms_per_person"].hist() #period 09 : 108.23