Ray.tune可视化调整超参数Tensorflow 2.0


Ray.tune官方文档

调整超参数通常是机器学习工作流程中最昂贵的部分。 Tune专为解决此问题而设计,展示了针对此痛点的有效且可扩展的解决方案。 请注意,此示例取决于Tensorflow 2.0。
Code: ray/python/ray/tune at master · ray-project/ray · GitHub

Examples: https://github.com/ray-project/ray/tree/master/python/ray/tune/examples)

Documentation: Tune: Scalable Hyperparameter Tuning — Ray v1.6.0

Mailing List: https://groups.google.com/forum/#!forum/ray-dev

## If you are running on Google Colab, uncomment below to install the necessary dependencies 
## before beginning the exercise.# print("Setting up colab environment")
# !pip uninstall -y -q pyarrow
# !pip install -q https://s3-us-west-2.amazonaws.com/ray-wheels/latest/ray-0.8.0.dev5-cp36-cp36m-manylinux1_x86_64.whl
# !pip install -q ray[debug]# # A hack to force the runtime to restart, needed to include the above dependencies.
# print("Done installing! Restarting via forced crash (this is not an issue).")
# import os
# os._exit(0)
## If you are running on Google Colab, please install TensorFlow 2.0 by uncommenting below..# try:
#   # %tensorflow_version only exists in Colab.
#   %tensorflow_version 2.x
# except Exception:
#   pass

本教程将逐步介绍使用Tune进行超参数调整的几个关键步骤。

  1. 可视化数据。
  2. 创建模型训练过程(使用Keras)。
  3. 通过调整上述模型训练过程以使用Tune来调整模型。
  4. 分析Tune创建的模型。

请注意,这使用了Tune的基于函数的API。 这主要是用于原型制作。 后面的教程将介绍Tune更加强大的基于类的可训练 API。

import numpy as np
np.random.seed(0)import tensorflow as tf
try:tf.get_logger().setLevel('INFO')
except Exception as exc:print(exc)
import warnings
warnings.simplefilter("ignore")from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Densefrom tensorflow.keras.optimizers import SGD, Adam
from tensorflow.keras.callbacks import ModelCheckpointimport ray
from ray import tune
from ray.tune.examples.utils import get_iris_dataimport inspect
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
%matplotlib inline


Visualize your data

首先让我们看一下数据集的分布。

鸢尾花数据集由3种不同类型的鸢尾花(Setosa,Versicolour和Virginica)的花瓣和萼片长度组成,存储在150x4 numpy中。

行为样本,列为:隔片长度,隔片宽度,花瓣长度和花瓣宽度。


本教程的目标是提供一个模型,该模型可以准确地预测给定的萼片长度,萼片宽度,花瓣长度和花瓣宽度4元组的真实标签。

from sklearn.datasets import load_irisiris = load_iris()
true_data = iris['data']
true_label = iris['target']
names = iris['target_names']
feature_names = iris['feature_names']def plot_data(X, y):# Visualize the data setsplt.figure(figsize=(16, 6))plt.subplot(1, 2, 1)for target, target_name in enumerate(names):X_plot = X[y == target]plt.plot(X_plot[:, 0], X_plot[:, 1], linestyle='none', marker='o', label=target_name)plt.xlabel(feature_names[0])plt.ylabel(feature_names[1])plt.axis('equal')plt.legend();plt.subplot(1, 2, 2)for target, target_name in enumerate(names):X_plot = X[y == target]plt.plot(X_plot[:, 2], X_plot[:, 3], linestyle='none', marker='o', label=target_name)plt.xlabel(feature_names[2])plt.ylabel(feature_names[3])plt.axis('equal')plt.legend();plot_data(true_data, true_label)


创建模型训练过程(使用Keras)

现在,让我们定义一个函数,该函数将包含一些超参数并返回一个可用于训练的模型。

def create_model(learning_rate, dense_1, dense_2):assert learning_rate > 0 and dense_1 > 0 and dense_2 > 0, "Did you set the right configuration?"model = Sequential()model.add(Dense(int(dense_1), input_shape=(4,), activation='relu', name='fc1'))model.add(Dense(int(dense_2), activation='relu', name='fc2'))model.add(Dense(3, activation='softmax', name='output'))optimizer = SGD(lr=learning_rate)model.compile(optimizer, loss='categorical_crossentropy', metrics=['accuracy'])return model

下面是一个使用create_model函数训练模型并返回训练后的模型的函数。

def train_on_iris():train_x, train_y, test_x, test_y = get_iris_data()model = create_model(learning_rate=0.1, dense_1=2, dense_2=2)# This saves the top model. `accuracy` is only available in TF2.0.checkpoint_callback = ModelCheckpoint("model.h5", monitor='accuracy', save_best_only=True, save_freq=2)# Train the modelmodel.fit(train_x, train_y, validation_data=(test_x, test_y),verbose=0, batch_size=10, epochs=20, callbacks=[checkpoint_callback])return model

让我们在数据集中快速训练模型。 准确性应该很低。

original_model = train_on_iris()  # This trains the model and returns it.
train_x, train_y, test_x, test_y = get_iris_data()
original_loss, original_accuracy = original_model.evaluate(test_x, test_y, verbose=0)
print("Loss is {:0.4f}".format(original_loss))
print("Accuracy is {:0.4f}".format(original_accuracy))


与tune整合

现在,让我们使用Tune优化学习鸢尾花分类的模型。 这将分为两个部分-修改训练功能以支持Tune,然后配置Tune。

让我们首先定义一个回调函数,以将中间训练进度报告回Tune。

import tensorflow.keras as keras
from ray.tune import trackclass TuneReporterCallback(keras.callbacks.Callback):"""Tune Callback for Keras.The callback is invoked every epoch."""def __init__(self, logs={}):self.iteration = 0super(TuneReporterCallback, self).__init__()def on_epoch_end(self, batch, logs={}):self.iteration += 1track.log(keras_info=logs, mean_accuracy=logs.get("accuracy"), mean_loss=logs.get("loss"))


整合第1部分:修改训练功能

说明按照接下来的2个步骤来修改train_iris函数以支持Tune。

  1. 更改函数的签名以接收超参数字典。 该函数将在Ray上调用。
    def tune_iris(config)
  2. 将配置值传递到create_model中:
    model = create_model(learning_rate=config["lr"], dense_1=config["dense_1"], dense_2=config["dense_2"])
def tune_iris():  # TODO: Change me.train_x, train_y, test_x, test_y = get_iris_data()model = create_model(learning_rate=0, dense_1=0, dense_2=0)  # TODO: Change me.checkpoint_callback = ModelCheckpoint("model.h5", monitor='loss', save_best_only=True, save_freq=2)# Enable Tune to make intermediate decisions by using a Tune Callback hook. This is Keras specific.callbacks = [checkpoint_callback, TuneReporterCallback()]# Train the modelmodel.fit(train_x, train_y, validation_data=(test_x, test_y),verbose=0, batch_size=10, epochs=20, callbacks=callbacks)assert len(inspect.getargspec(tune_iris).args) == 1, "The `tune_iris` function needs to take in the arg `config`."print("Test-running to make sure this function will run correctly.")
tune.track.init()  # For testing purposes only.
tune_iris({"lr": 0.1, "dense_1": 4, "dense_2": 4})
print("Success!")


第2部分:配置Tune以调整超参数。

说明按照接下来的2个步骤来配置Tune,以识别顶部的超参数。

  1. 指定超参数空间。
    hyperparameter_space = { "lr": tune.loguniform(0.001, 0.1), "dense_1": tune.uniform(2, 128), "dense_2": tune.uniform(2, 128), }
  2. 增加样品数量。 我们评估的试验越多,选择好的模型的机会就越大。
    num_samples = 20


常见问题:并行在Tune中如何工作?

设置num_samples将总共运行20个试验(超参数配置示例)。 但是,并非所有这些都可以一次运行。 最大训练并发性是您正在运行的计算机上的CPU内核数。 对于2核机器,将同时训练2个模型。 完成后,新的训练过程将从新的超参数配置示例开始。

每个试用版都将在新的Python进程上运行。 试用结束后,python进程将被杀死。


常见问题解答:如何调试Tune中的内容?

错误文件列将显示在输出中。 运行下面带有错误文件路径路径的单元格以诊断您的问题。
! cat /home/ubuntu/tune_iris/tune_iris_c66e1100_2019-10-09_17-13-24x_swb9xs/error_2019-10-09_17-13-29.txt


启动Tune超参数搜索

# This seeds the hyperparameter sampling.
import numpy as np; np.random.seed(5)  
hyperparameter_space = {}  # TODO: Fill me out.
num_samples = 1  # TODO: Fill me out.####################################################################################################
################ This is just a validation function for tutorial purposes only. ####################
HP_KEYS = ["lr", "dense_1", "dense_2"]
assert all(key in hyperparameter_space for key in HP_KEYS), ("The hyperparameter space is not fully designated. It must include all of {}".format(HP_KEYS))
######################################################################################################ray.shutdown()  # Restart Ray defensively in case the ray connection is lost. 
ray.init(log_to_driver=False)
# We clean out the logs before running for a clean visualization later.
! rm -rf ~/ray_results/tune_irisanalysis = tune.run(tune_iris, verbose=1, config=hyperparameter_space,num_samples=num_samples)assert len(analysis.trials) == 20, "Did you set the correct number of samples?"


分析最佳调整的模型

让我们将真实标签与分类标签进行比较。

_, _, test_data, test_labels = get_iris_data()
plot_data(test_data, test_labels.argmax(1))
# Obtain the directory where the best model is saved.
print("You can use any of the following columns to get the best model: \n{}.".format([k for k in analysis.dataframe() if k.startswith("keras_info")]))
print("=" * 10)
logdir = analysis.get_best_logdir("keras_info/val_loss", mode="min")
# We saved the model as `model.h5` in the logdir of the trial.
from tensorflow.keras.models import load_model
tuned_model = load_model(logdir + "/model.h5")tuned_loss, tuned_accuracy = tuned_model.evaluate(test_data, test_labels, verbose=0)
print("Loss is {:0.4f}".format(tuned_loss))
print("Tuned accuracy is {:0.4f}".format(tuned_accuracy))
print("The original un-tuned model had an accuracy of {:0.4f}".format(original_accuracy))
predicted_label = tuned_model.predict(test_data)
plot_data(test_data, predicted_label.argmax(1))

我们可以通过可视化与基本事实相比较的预测来比较最佳模型的性能。

def plot_comparison(X, y):# Visualize the data setsplt.figure(figsize=(16, 6))plt.subplot(1, 2, 1)for target, target_name in enumerate(["Incorrect", "Correct"]):X_plot = X[y == target]plt.plot(X_plot[:, 0], X_plot[:, 1], linestyle='none', marker='o', label=target_name)plt.xlabel(feature_names[0])plt.ylabel(feature_names[1])plt.axis('equal')plt.legend();plt.subplot(1, 2, 2)for target, target_name in enumerate(["Incorrect", "Correct"]):X_plot = X[y == target]plt.plot(X_plot[:, 2], X_plot[:, 3], linestyle='none', marker='o', label=target_name)plt.xlabel(feature_names[2])plt.ylabel(feature_names[3])plt.axis('equal')plt.legend();plot_comparison(test_data, test_labels.argmax(1) == predicted_label.argmax(1))


额外-使用Tensorboard获得结果

您可以使用TensorBoard查看试用表演。 如果未加载图形,请单击“切换所有运行”。

%load_ext tensorboard
%load_ext tensorboard


Ray.tune官方文档

调整超参数通常是机器学习工作流程中最昂贵的部分。 Tune专为解决此问题而设计,展示了针对此痛点的有效且可扩展的解决方案。 请注意,此示例取决于Tensorflow 2.0。
Code: ray/python/ray/tune at master · ray-project/ray · GitHub

Examples: https://github.com/ray-project/ray/tree/master/python/ray/tune/examples)

Documentation: Tune: Scalable Hyperparameter Tuning — Ray v1.6.0

Mailing List: https://groups.google.com/forum/#!forum/ray-dev

## If you are running on Google Colab, uncomment below to install the necessary dependencies 
## before beginning the exercise.# print("Setting up colab environment")
# !pip uninstall -y -q pyarrow
# !pip install -q https://s3-us-west-2.amazonaws.com/ray-wheels/latest/ray-0.8.0.dev5-cp36-cp36m-manylinux1_x86_64.whl
# !pip install -q ray[debug]# # A hack to force the runtime to restart, needed to include the above dependencies.
# print("Done installing! Restarting via forced crash (this is not an issue).")
# import os
# os._exit(0)
## If you are running on Google Colab, please install TensorFlow 2.0 by uncommenting below..# try:
#   # %tensorflow_version only exists in Colab.
#   %tensorflow_version 2.x
# except Exception:
#   pass

本教程将逐步介绍使用Tune进行超参数调整的几个关键步骤。

  1. 可视化数据。
  2. 创建模型训练过程(使用Keras)。
  3. 通过调整上述模型训练过程以使用Tune来调整模型。
  4. 分析Tune创建的模型。

请注意,这使用了Tune的基于函数的API。 这主要是用于原型制作。 后面的教程将介绍Tune更加强大的基于类的可训练 API。

import numpy as np
np.random.seed(0)import tensorflow as tf
try:tf.get_logger().setLevel('INFO')
except Exception as exc:print(exc)
import warnings
warnings.simplefilter("ignore")from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Densefrom tensorflow.keras.optimizers import SGD, Adam
from tensorflow.keras.callbacks import ModelCheckpointimport ray
from ray import tune
from ray.tune.examples.utils import get_iris_dataimport inspect
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
%matplotlib inline


Visualize your data

首先让我们看一下数据集的分布。

鸢尾花数据集由3种不同类型的鸢尾花(Setosa,Versicolour和Virginica)的花瓣和萼片长度组成,存储在150x4 numpy中。

行为样本,列为:隔片长度,隔片宽度,花瓣长度和花瓣宽度。

本教程的目标是提供一个模型,该模型可以准确地预测给定的萼片长度,萼片宽度,花瓣长度和花瓣宽度4元组的真实标签。

from sklearn.datasets import load_irisiris = load_iris()
true_data = iris['data']
true_label = iris['target']
names = iris['target_names']
feature_names = iris['feature_names']def plot_data(X, y):# Visualize the data setsplt.figure(figsize=(16, 6))plt.subplot(1, 2, 1)for target, target_name in enumerate(names):X_plot = X[y == target]plt.plot(X_plot[:, 0], X_plot[:, 1], linestyle='none', marker='o', label=target_name)plt.xlabel(feature_names[0])plt.ylabel(feature_names[1])plt.axis('equal')plt.legend();plt.subplot(1, 2, 2)for target, target_name in enumerate(names):X_plot = X[y == target]plt.plot(X_plot[:, 2], X_plot[:, 3], linestyle='none', marker='o', label=target_name)plt.xlabel(feature_names[2])plt.ylabel(feature_names[3])plt.axis('equal')plt.legend();plot_data(true_data, true_label)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30


创建模型训练过程(使用Keras)

现在,让我们定义一个函数,该函数将包含一些超参数并返回一个可用于训练的模型。

def create_model(learning_rate, dense_1, dense_2):assert learning_rate > 0 and dense_1 > 0 and dense_2 > 0, "Did you set the right configuration?"model = Sequential()model.add(Dense(int(dense_1), input_shape=(4,), activation='relu', name='fc1'))model.add(Dense(int(dense_2), activation='relu', name='fc2'))model.add(Dense(3, activation='softmax', name='output'))optimizer = SGD(lr=learning_rate)model.compile(optimizer, loss='categorical_crossentropy', metrics=['accuracy'])return model
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

下面是一个使用create_model函数训练模型并返回训练后的模型的函数。

def train_on_iris():train_x, train_y, test_x, test_y = get_iris_data()model = create_model(learning_rate=0.1, dense_1=2, dense_2=2)# This saves the top model. `accuracy` is only available in TF2.0.checkpoint_callback = ModelCheckpoint("model.h5", monitor='accuracy', save_best_only=True, save_freq=2)# Train the modelmodel.fit(train_x, train_y, validation_data=(test_x, test_y),verbose=0, batch_size=10, epochs=20, callbacks=[checkpoint_callback])return model

让我们在数据集中快速训练模型。 准确性应该很低。

original_model = train_on_iris()  # This trains the model and returns it.
train_x, train_y, test_x, test_y = get_iris_data()
original_loss, original_accuracy = original_model.evaluate(test_x, test_y, verbose=0)
print("Loss is {:0.4f}".format(original_loss))
print("Accuracy is {:0.4f}".format(original_accuracy))
  • 1
  • 2
  • 3
  • 4
  • 5


与tune整合

现在,让我们使用Tune优化学习鸢尾花分类的模型。 这将分为两个部分-修改训练功能以支持Tune,然后配置Tune。

让我们首先定义一个回调函数,以将中间训练进度报告回Tune。

import tensorflow.keras as keras
from ray.tune import trackclass TuneReporterCallback(keras.callbacks.Callback):"""Tune Callback for Keras.The callback is invoked every epoch."""def __init__(self, logs={}):self.iteration = 0super(TuneReporterCallback, self).__init__()def on_epoch_end(self, batch, logs={}):self.iteration += 1track.log(keras_info=logs, mean_accuracy=logs.get("accuracy"), mean_loss=logs.get("loss"))

整合第1部分:修改训练功能

说明按照接下来的2个步骤来修改train_iris函数以支持Tune。

  1. 更改函数的签名以接收超参数字典。 该函数将在Ray上调用。
    def tune_iris(config)
  2. 将配置值传递到create_model中:
    model = create_model(learning_rate=config["lr"], dense_1=config["dense_1"], dense_2=config["dense_2"])
def tune_iris():  # TODO: Change me.train_x, train_y, test_x, test_y = get_iris_data()model = create_model(learning_rate=0, dense_1=0, dense_2=0)  # TODO: Change me.checkpoint_callback = ModelCheckpoint("model.h5", monitor='loss', save_best_only=True, save_freq=2)# Enable Tune to make intermediate decisions by using a Tune Callback hook. This is Keras specific.callbacks = [checkpoint_callback, TuneReporterCallback()]# Train the modelmodel.fit(train_x, train_y, validation_data=(test_x, test_y),verbose=0, batch_size=10, epochs=20, callbacks=callbacks)assert len(inspect.getargspec(tune_iris).args) == 1, "The `tune_iris` function needs to take in the arg `config`."print("Test-running to make sure this function will run correctly.")
tune.track.init()  # For testing purposes only.
tune_iris({"lr": 0.1, "dense_1": 4, "dense_2": 4})
print("Success!")

第2部分:配置Tune以调整超参数。

说明按照接下来的2个步骤来配置Tune,以识别顶部的超参数。

  1. 指定超参数空间。
    hyperparameter_space = { "lr": tune.loguniform(0.001, 0.1), "dense_1": tune.uniform(2, 128), "dense_2": tune.uniform(2, 128), }
  2. 增加样品数量。 我们评估的试验越多,选择好的模型的机会就越大。
    num_samples = 20

常见问题:并行在Tune中如何工作?

设置num_samples将总共运行20个试验(超参数配置示例)。 但是,并非所有这些都可以一次运行。 最大训练并发性是您正在运行的计算机上的CPU内核数。 对于2核机器,将同时训练2个模型。 完成后,新的训练过程将从新的超参数配置示例开始。

每个试用版都将在新的Python进程上运行。 试用结束后,python进程将被杀死。

常见问题解答:如何调试Tune中的内容?

错误文件列将显示在输出中。 运行下面带有错误文件路径路径的单元格以诊断您的问题。
! cat /home/ubuntu/tune_iris/tune_iris_c66e1100_2019-10-09_17-13-24x_swb9xs/error_2019-10-09_17-13-29.txt


启动Tune超参数搜索

# This seeds the hyperparameter sampling.
import numpy as np; np.random.seed(5)  
hyperparameter_space = {}  # TODO: Fill me out.
num_samples = 1  # TODO: Fill me out.####################################################################################################
################ This is just a validation function for tutorial purposes only. ####################
HP_KEYS = ["lr", "dense_1", "dense_2"]
assert all(key in hyperparameter_space for key in HP_KEYS), ("The hyperparameter space is not fully designated. It must include all of {}".format(HP_KEYS))
######################################################################################################ray.shutdown()  # Restart Ray defensively in case the ray connection is lost. 
ray.init(log_to_driver=False)
# We clean out the logs before running for a clean visualization later.
! rm -rf ~/ray_results/tune_irisanalysis = tune.run(tune_iris, verbose=1, config=hyperparameter_space,num_samples=num_samples)assert len(analysis.trials) == 20, "Did you set the correct number of samples?"


分析最佳调整的模型

让我们将真实标签与分类标签进行比较。

_, _, test_data, test_labels = get_iris_data()
plot_data(test_data, test_labels.argmax(1))
# Obtain the directory where the best model is saved.
print("You can use any of the following columns to get the best model: \n{}.".format([k for k in analysis.dataframe() if k.startswith("keras_info")]))
print("=" * 10)
logdir = analysis.get_best_logdir("keras_info/val_loss", mode="min")
# We saved the model as `model.h5` in the logdir of the trial.
from tensorflow.keras.models import load_model
tuned_model = load_model(logdir + "/model.h5")tuned_loss, tuned_accuracy = tuned_model.evaluate(test_data, test_labels, verbose=0)
print("Loss is {:0.4f}".format(tuned_loss))
print("Tuned accuracy is {:0.4f}".format(tuned_accuracy))
print("The original un-tuned model had an accuracy of {:0.4f}".format(original_accuracy))
predicted_label = tuned_model.predict(test_data)
plot_data(test_data, predicted_label.argmax(1))

我们可以通过可视化与基本事实相比较的预测来比较最佳模型的性能。

def plot_comparison(X, y):# Visualize the data setsplt.figure(figsize=(16, 6))plt.subplot(1, 2, 1)for target, target_name in enumerate(["Incorrect", "Correct"]):X_plot = X[y == target]plt.plot(X_plot[:, 0], X_plot[:, 1], linestyle='none', marker='o', label=target_name)plt.xlabel(feature_names[0])plt.ylabel(feature_names[1])plt.axis('equal')plt.legend();plt.subplot(1, 2, 2)for target, target_name in enumerate(["Incorrect", "Correct"]):X_plot = X[y == target]plt.plot(X_plot[:, 2], X_plot[:, 3], linestyle='none', marker='o', label=target_name)plt.xlabel(feature_names[2])plt.ylabel(feature_names[3])plt.axis('equal')plt.legend();plot_comparison(test_data, test_labels.argmax(1) == predicted_label.argmax(1))

额外-使用Tensorboard获得结果

任何程序错误,以及技术疑问或需要解答的,请添加

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySql 优化的 30 条建议

文章来源&#xff1a;包子博客MySql 优化的 30 条建议1、应尽量避免在 where 子句中使用!或<>操作符&#xff0c;否则将引擎放弃使用索引而进行全表扫描。2、对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引…

Ubuntu18 Win10搭建Caffe训练识别mnist手写数字demo

ubuntu 系统下的Caffe环境搭建 对于caffe的系统一般使用linux系统&#xff0c;当然也有windows版本的caffe&#xff0c;不过如果你一开始使用了windows下面的caffe&#xff0c;后面学习的过程中&#xff0c;会经常遇到各种错误&#xff0c;网上下载的一些源码、模型也往往不能…

windows server 2008 IE代理服务器实验

一、首先介绍IE代理服务器的好处如下&#xff1a;1、节省带宽 2、绕过防火墙二、下面以这个软件为代理软件&#xff0c;本人在物理机和虚拟机实验&#xff0c;1、首先在物理机安装代理软件&#xff0c;安装完成如图所示&#xff1a;2、在“设置”项代理协议端口、在本地局域网…

Java 200+ 面试题补充③ Dubbo 模块

昨天在我的 Java 面试粉丝群里&#xff0c;有一个只有一年开发经验的小伙伴只用了三天时间&#xff0c;就找到了一个年薪 20 万的工作&#xff0c;真是替他感到开心。 他的经历告诉我们&#xff1a;除了加强自我实战经验之外&#xff0c;还要努力积累自己的理论知识。 人生没有…

十一、PyQt5点击主窗口弹出另一个非模态子窗口

单击主对话框菜单“设置“下的”交换机配置”action的信号与槽 主对话框代码: # -*- coding: utf-8 -*-import sys from PyQt5 import QtCore from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QDesktopWidget import win32api import win32con

彻底搞懂 Java 中的注解 Annotation

Java注解是一系列元数据&#xff0c;它提供数据用来解释程序代码&#xff0c;但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。网络上对注解的解释过于严肃、刻板&#xff0c;这并不是我喜欢的风格。尽管这样的解释听起来非常的专业。为了缓解大…

cs时间校准

2019独角兽企业重金招聘Python工程师标准>>> c/s结构中的时间校准 拜读了风云的一篇博客 思路比较明显简单: C发包打时间戳 S收包打时间戳 S回应包打时间戳 C收包打时间戳 4个时间戳可以进行计算校准. 假设来回时间相等 转载于:https://my.oschina.net/u/1449566/bl…

使用ACME部署生成阿里云免费HTTPS证书

使用ACME部署HTTPS证书 背景 现在越来越多的服务都是基于web&#xff0c;大多数默认使用HTTP协议。HTTP协议是一种没有加密的协议&#xff0c;所有数据都通过明文传输&#xff0c;即便是只在内网使用也存在一定的安全风险。尤其是对于登录等操作&#xff0c;账号密码通过HTTP…

Java性能优化的50个细节(珍藏版)

来源&#xff1a;http://t.cn/EMze6kc在JAVA程序中&#xff0c;性能问题的大部分原因并不在于JAVA语言&#xff0c;而是程序本身。养成良好的编码习惯非常重要&#xff0c;能够显著地提升程序性能。1. 尽量在合适的场合使用单例使用单例可以减轻加载的负担&#xff0c;缩短加载…

强化学习基础篇 OpenAI Gym 环境搭建demo

1. Gym介绍 Gym是一个研究和开发强化学习相关算法的仿真平台&#xff0c;无需智能体先验知识&#xff0c;由以下两部分组成 Gym开源库&#xff1a;测试问题的集合。当你测试强化学习的时候&#xff0c;测试问题就是环境&#xff0c;比如机器人玩游戏&#xff0c;环境的集合就…

九、PyQt5 QLineEdit输入的子网字符串校验QRegExp

自己编写的用于对lineEdit编辑框输入的子网,例如:192.168.60.1/24字符串校验是否合规。 # 限制lineEdit编辑框只能输入./字符和数字reg = QRegExp([0-9./]+$)validator = QRegExpValidator(self)validator.setRegExp(reg)self.lineEditSubNet.setValidator(validator)

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接

本文&#xff0c;也是对于Java中字符串相关知识的一个补充&#xff0c;主要来介绍一下字符串拼接相关的知识。本文基于jdk1.8.0_181。字符串拼接字符串拼接是我们在Java代码中比较经常要做的事情&#xff0c;就是把多个字符串拼接到一起。我们都知道&#xff0c;String是Java中…

Google强化学习框架SEED RL环境部署

如上述博客有任何错误或者疑问&#xff0c;请加VX&#xff1a;1755337994&#xff0c;及时告知&#xff01;万分感激&#xff01; 本框架是Google发布于ICLR2020顶会上&#xff0c;这两天发布于Google Blog上 **论文Arxiv&#xff1a;**https://arxiv.org/abs/1910.06591 ||…

PLSQL连接oracel数据库_用户无法登陆_oci.dll_配置问题

为什么80%的码农都做不了架构师&#xff1f;>>> 由于工作需要换了台新电脑&#xff0c;在抚摸新笔记本满怀新鲜感和喜悦心情之余&#xff08;其实纯屌丝味尽显无余&#xff0c;就基本和双手捧托一颗高大上的茶叶蛋般内心激动且泪眼汪汪&#xff09;&#xff0c;重新…

CentOS7搭建部署Ambari 2.6.2.0最新版(HDP-UTILS、HDP-GPL)大数据平台

如上述博客有任何错误或者疑问&#xff0c;请加VX&#xff1a;1755337994&#xff0c;及时告知&#xff01;万分感激&#xff01; 注&#xff1a;本文基于root用户操作 一、安装环境准备 操作系统 centos7.5 hdc-data1&#xff1a;192.168.163.51 hdc-data2&#xff1a;192.16…

阿里面试题BIO和NIO数量问题附答案和代码

一、问题 BIO 和 NIO 作为 Server 端&#xff0c;当建立了 10 个连接时&#xff0c;分别产生多少个线程&#xff1f; 答案&#xff1a; 因为传统的 IO 也就是 BIO 是同步线程堵塞的&#xff0c;所以每个连接都要分配一个专用线程来处理请求&#xff0c;这样 10 个连接就会创建…

CentOS7搭建离线部署Cloudera CDH 6.2.0大数据平台

如上述博客有任何错误或者疑问&#xff0c;请加VX&#xff1a;1755337994&#xff0c;及时告知&#xff01;万分感激&#xff01; 1.概述 CDH&#xff0c;全称Clouderas Distribution, including Apache Hadoop。是Hadoop众多分支中对应中的一种&#xff0c;由Cloudera维护&a…

负载均衡实现的几种方式

负载均衡&#xff0c;英文名Load Balance&#xff0c;作用是将操作分摊到多个执行单元上执行。随着如今网络流量的不断增大&#xff0c;服务的负载均衡是必须的&#xff0c;这里就来讲一讲负载均衡的结构。 说到负载均衡&#xff0c;同学最容易想到的可能就是nginx了&…

CheckBox as Image use button

为什么80%的码农都做不了架构师&#xff1f;>>> <CheckBox android:id"id/notificationPhoneIcon" android:layout_width"wrap_content" android:layout_height"wrap_content" android:layout_centerVertical"true" an…

1-1.Win10系统利用Pycharm社区版安装Django搭建一个简单Python Web项目的步骤之一

首先&#xff0c;安装python3.8和pycharm参考其他教程。 一、安装django 使用下面命令默认安装最新版的django pip install django也可以从django官网查看安装一个LTS长期稳定支持版本&#xff0c;从下图看到3.2是LTS版本&#xff0c;能够长期支持2021年&#xff5e;2024年&…