Python TensorFlow库【深度学习框架】全面讲解与案例
一、TensorFlow 基础知识
1. 核心概念
- 张量 (Tensor): 多维数组,是 TensorFlow 的基本数据单位(标量、向量、矩阵等)。
- 计算图 (Graph): 早期版本中的静态图机制(TF2.x 默认启用动态图)。
- 会话 (Session): 在 TF1.x 中用于执行计算图(TF2.x 中已弃用)。
2. 基本操作
import tensorflow as tf# 创建张量
a = tf.constant([[1, 2], [3, 4]]) # 形状 (2, 2)
b = tf.constant([[5, 6], [7, 8]])# 张量运算
c = tf.add(a, b) # 逐元素加法
d = tf.matmul(a, b) # 矩阵乘法print("加法结果:\n", c.numpy())
print("矩阵乘法结果:\n", d.numpy())
二、高级用法
1. Keras API 快速建模
from tensorflow.keras import layers, models# 构建顺序模型
model = models.Sequential([layers.Dense(64, activation='relu', input_shape=(784,)),layers.Dropout(0.2),layers.Dense(10, activation='softmax')
])# 编译模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 打印模型结构
model.summary()
2. 自定义训练循环
# 自定义损失函数和训练步骤
@tf.function
def train_step(inputs, labels):with tf.GradientTape() as tape:predictions = model(inputs)loss = tf.keras.losses.sparse_categorical_crossentropy(labels, predictions)gradients = tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))return loss
三、深入进阶
1. 混合精度训练
# 启用混合精度策略
from tensorflow.keras.mixed_precision import set_global_policy
set_global_policy('mixed_float16')# 模型会自动使用混合精度
model = models.Sequential([layers.Dense(1024, activation='relu'), # 自动转为 float16layers.Dense(10, dtype='float32') # 输出层保持 float32
])
2. 分布式训练
# 多GPU训练策略
strategy = tf.distribute.MirroredStrategy()with strategy.scope():model = models.Sequential([...])model.compile(...)model.fit(train_dataset, epochs=10)
四、完整案例
案例1:图像分类(CNN)
# 加载数据
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()# 预处理
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255# 构建CNN模型
model = models.Sequential([layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)),layers.MaxPooling2D((2,2)),layers.Flatten(),layers.Dense(10, activation='softmax')
])# 训练配置
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 训练模型
history = model.fit(train_images, train_labels,epochs=5,validation_split=0.2)# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Test accuracy: {test_acc}')
五、学习路径建议
1. 分阶段学习
-
基础阶段(2周):
- 张量操作
- 全连接网络
- Keras API 基础
-
中级阶段(3周):
- CNN/RNN实现
- 数据管道(tf.data)
- 模型保存/加载
-
高级阶段(4周):
- 自定义训练循环
- 分布式训练
- TensorFlow Serving 部署
2. 推荐资源
- 官方文档:tensorflow.org
- 实战书籍:《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow》
- 社区:Stack Overflow(标签
tensorflow
)、GitHub 开源项目
六、关键代码示例
自定义层示例
class CustomDense(layers.Layer):def __init__(self, units=32):super().__init__()self.units = unitsdef build(self, input_shape):# 初始化权重self.w = self.add_weight(shape=(input_shape[-1], self.units),initializer="random_normal",trainable=True,)self.b = self.add_weight(shape=(self.units,), initializer="zeros", trainable=True)def call(self, inputs):# 前向传播计算return tf.matmul(inputs, self.w) + self.b# 使用自定义层
model = models.Sequential([CustomDense(64),layers.ReLU(),CustomDense(10)
])
六、模型部署与生产化
1. 模型保存与加载
# 保存整个模型(架构+权重+优化器状态)
model.save('my_model.keras') # 或使用 SavedModel 格式# 加载模型
loaded_model = tf.keras.models.load_model('my_model.keras')# 仅保存权重
model.save_weights('model_weights.weights.h5')# 仅保存架构
with open('model_architecture.json', 'w') as f:f.write(model.to_json())
2. TensorFlow Serving 部署
# 安装 TensorFlow Serving
echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list
curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get install tensorflow-model-server# 启动服务
tensorflow_model_server \--rest_api_port=8501 \--model_name=my_model \--model_base_path=/path/to/saved_model
七、性能优化技巧
1. 使用 tf.data 构建高效数据管道
# 从内存数据创建 Dataset
dataset = tf.data.Dataset.from_tensor_slices((images, labels))# 优化操作链
dataset = dataset.shuffle(buffer_size=1000)\.batch(32)\.prefetch(tf.data.AUTOTUNE)\.map(lambda x, y: (augment_image(x), y), num_parallel_calls=tf.data.AUTOTUNE)# 使用并行化加速
options = tf.data.Options()
options.threading.private_threadpool_size = 8
dataset = dataset.with_options(options)
2. 图模式加速
# 使用 @tf.function 将 Python 代码转为计算图
@tf.function(jit_compile=True) # 启用 XLA 加速
def fast_train_step(inputs, labels):# ...训练逻辑与之前相同...
八、案例:自然语言处理(文本分类)
使用预训练 BERT 模型
import tensorflow_hub as hub# 加载预训练 BERT
bert_preprocess = hub.KerasLayer("https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3")
bert_encoder = hub.KerasLayer("https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/4",trainable=True)# 构建分类模型
text_input = tf.keras.layers.Input(shape=(), dtype=tf.string)
preprocessed_text = bert_preprocess(text_input)
outputs = bert_encoder(preprocessed_text)
net = outputs['pooled_output']
net = tf.keras.layers.Dense(64, activation='relu')(net)
net = tf.keras.layers.Dense(1, activation='sigmoid')(net)
model = tf.keras.Model(text_input, net)# 训练配置
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])# 示例数据
texts = ["This movie was great!", "Terrible acting..."]
labels = [1, 0]
model.fit(texts, labels, epochs=3)
九、调试与可视化
1. TensorBoard 集成
# 在回调中集成 TensorBoard
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=1,profile_batch='500,520') # 分析特定批次model.fit(train_data, epochs=5, callbacks=[tensorboard_callback])# 命令行启动 TensorBoard
# tensorboard --logdir=./logs
2. 梯度检查技巧
# 检查梯度消失/爆炸
for layer in model.layers:if hasattr(layer, 'kernel'):kernel_values = layer.kernel.numpy()print(f"{layer.name} weight mean: {np.mean(kernel_values):.4f}, std: {np.std(kernel_values):.4f}")# 使用梯度裁剪
optimizer = tf.keras.optimizers.Adam(clipvalue=1.0) # 限制梯度绝对值
十、生态系统工具链
工具名称 | 用途描述 | 典型场景 |
---|---|---|
TensorFlow Lite | 移动端/嵌入式部署 | 手机应用模型推理 |
TFX | 端到端机器学习流水线 | 生产级模型训练与部署 |
TensorFlow.js | 浏览器/Node.js 环境运行模型 | Web 前端智能应用开发 |
TFLite Model Maker | 快速迁移学习工具 | 移动端定制模型训练 |
十一、常见问题解决方案
1. GPU 内存不足问题
# 限制 GPU 内存增长
gpus = tf.config.list_physical_devices('GPU')
if gpus:try:for gpu in gpus:tf.config.experimental.set_memory_growth(gpu, True)except RuntimeError as e:print(e)# 或直接限制显存使用量
tf.config.set_logical_device_configuration(gpus[0],[tf.config.LogicalDeviceConfiguration(memory_limit=4096)]) # 限制 4GB
2. 自定义指标不更新
# 正确实现状态更新
class TruePositives(tf.keras.metrics.Metric):def __init__(self, name='true_positives', **kwargs):super().__init__(name=name, **kwargs)self.true_positives = self.add_weight(name='tp', initializer='zeros')def update_state(self, y_true, y_pred, sample_weight=None):y_pred = tf.reshape(tf.round(y_pred), [-1])y_true = tf.reshape(y_true, [-1])values = tf.logical_and(tf.equal(y_true, 1), tf.equal(y_pred, 1))values = tf.cast(values, self.dtype)self.true_positives.assign_add(tf.reduce_sum(values))def result(self):return self.true_positives
十二、学习路线图
高级主题专项训练
-
模型量化(2周):
- 训练后量化 (Post-training quantization)
- 量化感知训练 (QAT)
-
模型解释性(1周):
- 使用 SHAP 或 LIME
- Grad-CAM 可视化
-
强化学习集成(3周):
- 使用 TF-Agents 库
- 实现 DQN/PPO 算法
十三、高级模型优化技术
1. 模型剪枝与量化
权重剪枝(减少模型冗余参数)
import tensorflow_model_optimization as tfmot# 定义剪枝策略
prune_low_magnitude = tfmot.sparsity.keras.prune_low_magnitude# 应用剪枝到全连接层
model = models.Sequential([layers.Flatten(input_shape=(28, 28)),prune_low_magnitude(layers.Dense(128, activation='relu')),layers.Dropout(0.2),prune_low_magnitude(layers.Dense(10))
])# 配置剪枝回调
pruning_callback = tfmot.sparsity.keras.UpdatePruningStep()# 训练时自动剪枝
model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])
model.fit(train_images, train_labels,epochs=5,callbacks=[pruning_callback])
训练后量化(减小模型体积)
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT] # 启用默认量化
quantized_model = converter.convert()# 保存量化模型
with open('quantized_model.tflite', 'wb') as f:f.write(quantized_model)
十四、TensorFlow Extended (TFX) 生产级流水线
端到端机器学习流水线示例
from tfx.components import CsvExampleGen, Trainer, Pusher
from tfx.orchestration import pipeline# 1. 数据输入组件
example_gen = CsvExampleGen(input_base='data_path')# 2. 数据验证组件
statistics_gen = StatisticsGen(examples=example_gen.outputs['examples'])
schema_gen = SchemaGen(statistics=statistics_gen.outputs['statistics'])# 3. 训练组件
trainer = Trainer(module_file='train_module.py', # 包含训练逻辑的Python模块examples=example_gen.outputs['examples'],schema=schema_gen.outputs['schema'],train_args=tfx.proto.TrainArgs(num_steps=1000),eval_args=tfx.proto.EvalArgs(num_steps=500))# 4. 模型推送组件
pusher = Pusher(model=trainer.outputs['model'],push_destination=tfx.proto.PushDestination(filesystem=tfx.proto.PushDestination.Filesystem(base_directory='serving_model_dir')))# 构建流水线
pipeline = pipeline.Pipeline(pipeline_name='my_pipeline',components=[example_gen, statistics_gen, schema_gen, trainer, pusher],enable_cache=True)
十五、TPU加速训练实战
Colab TPU配置与使用
# 检测并初始化TPU
try:tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()strategy = tf.distribute.TPUStrategy(tpu)
except ValueError:strategy = tf.distribute.MirroredStrategy() # 回退到GPU/CPU# 在TPU策略范围内构建模型
with strategy.scope():model = tf.keras.Sequential([tf.keras.layers.Reshape((28, 28, 1), input_shape=(784,)),tf.keras.layers.Conv2D(32, 3, activation='relu'),tf.keras.layers.Flatten(),tf.keras.layers.Dense(10)])model.compile(optimizer=tf.keras.optimizers.Adam(0.001),loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])# 必须使用tf.data.Dataset且设置固定批次大小
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(60000).batch(2048) # TPU需要较大批次# 开始训练
model.fit(train_dataset, epochs=10)
十六、自定义训练高级技巧
梯度累积(解决显存不足问题)
accumulation_steps = 4 # 累积4个批次的梯度
optimizer = tf.keras.optimizers.Adam()@tf.function
def train_step(inputs, labels):with tf.GradientTape() as tape:predictions = model(inputs, training=True)loss = compute_loss(labels, predictions)gradients = tape.gradient(loss, model.trainable_variables)# 累积梯度if not hasattr(train_step, "accum_grads"):train_step.accum_grads = [tf.zeros_like(g) for g in gradients]for i in range(len(gradients)):train_step.accum_grads[i] += gradients[i] / accumulation_steps# 每 accumulation_steps 步更新一次权重if optimizer.iterations % accumulation_steps == 0:optimizer.apply_gradients(zip(train_step.accum_grads, model.trainable_variables))train_step.accum_grads = [tf.zeros_like(g) for g in gradients] # 重置累积梯度return loss
十七、跨框架集成
TensorFlow与PyTorch模型互转
# 将PyTorch模型转为TensorFlow格式(需使用ONNX中转)
import torch
import onnx
from onnx_tf.backend import prepare# 1. 导出PyTorch模型到ONNX
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(pytorch_model, dummy_input, "model.onnx")# 2. 转换ONNX到TensorFlow
onnx_model = onnx.load("model.onnx")
tf_rep = prepare(onnx_model)
tf_rep.export_graph("tf_model") # 生成TensorFlow SavedModel
十八、前沿应用方向
多模态学习示例(图文匹配)
# 构建双输入模型
text_input = tf.keras.Input(shape=(None,), dtype=tf.string, name='text')
image_input = tf.keras.Input(shape=(224, 224, 3), name='image')# 文本处理分支
text_features = tf.keras.layers.TextVectorization(max_tokens=10000)(text_input)
text_features = tf.keras.layers.Embedding(10000, 128)(text_features)
text_features = tf.keras.layers.GlobalAveragePooling1D()(text_features)# 图像处理分支
image_features = tf.keras.applications.MobileNetV2(weights='imagenet', include_top=False)(image_input)
image_features = tf.keras.layers.GlobalAveragePooling2D()(image_features)# 特征融合
combined = tf.keras.layers.concatenate([text_features, image_features])
output = tf.keras.layers.Dense(1, activation='sigmoid')(combined)model = tf.keras.Model(inputs=[text_input, image_input], outputs=output)# 编译训练
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
十九、关键调试工具
TensorFlow Debugger (tfdbg)
# 在代码中插入调试器
from tensorflow.python import debug as tf_debug# 包装Session(TF2需使用兼容模式)
sess = tf.compat.v1.Session()
sess = tf_debug.TensorBoardDebugWrapperSession(sess, "localhost:6064")# 或通过命令行启动
# tensorboard --debugger_port 6064
二十、性能调优
1. 版本跟踪
- 定期查看 TensorFlow RFCs 了解最新发展方向
- 使用
tf_upgrade_v2
工具迁移旧代码
2. 性能调优黄金法则
- 数据管道优先:确保
tf.data
不成为瓶颈 - 混合精度标配:大部分现代GPU可启用
mixed_float16
- XLA编译尝试:对固定形状输入模型使用
@tf.function(jit_compile=True)
- 分布式策略选择:单机多卡用
MirroredStrategy
,多机用MultiWorkerMirroredStrategy
二十一、生成对抗网络(GAN)实战
1. 基础GAN实现(手写数字生成)
# 生成器模型
def build_generator(latent_dim=128):model = tf.keras.Sequential([layers.Dense(7*7*256, use_bias=False, input_shape=(latent_dim,)),layers.BatchNormalization(),layers.LeakyReLU(),layers.Reshape((7, 7, 256)),layers.Conv2DTranspose(128, (5,5), strides=(1,1), padding='same', use_bias=False),layers.BatchNormalization(),layers.LeakyReLU(),layers.Conv2DTranspose(64, (5,5), strides=(2,2), padding='same', use_bias=False),layers.BatchNormalization(),layers.LeakyReLU(),layers.Conv2DTranspose(1, (5,5), strides=(2,2), padding='same', use_bias=False, activation='tanh')])return model# 判别器模型
def build_discriminator():model = tf.keras.Sequential([layers.Conv2D(64, (5,5), strides=(2,2), padding='same', input_shape=(28,28,1)),layers.LeakyReLU(),layers.Dropout(0.3),layers.Conv2D(128, (5,5), strides=(2,2), padding='same'),layers.LeakyReLU(),layers.Dropout(0.3),layers.Flatten(),layers.Dense(1, activation='sigmoid')])return model# 训练循环
@tf.function
def train_step(real_images):# 生成随机噪声noise = tf.random.normal([BATCH_SIZE, latent_dim])with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:# 生成假图像generated_images = generator(noise, training=True)# 判别器判断结果real_output = discriminator(real_images, training=True)fake_output = discriminator(generated_images, training=True)# 计算损失gen_loss = generator_loss(fake_output)disc_loss = discriminator_loss(real_output, fake_output)# 更新梯度gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))
二十二、强化学习(TF-Agents)
DQN算法实现
import tf_agents
from tf_agents.agents.dqn import dqn_agent
from tf_agents.environments import suite_gym# 创建环境
env = suite_gym.load('CartPole-v1')
train_env = tf_agents.environments.TFPyEnvironment(env)# 构建Q网络
q_net = tf_agents.networks.Sequential([tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(env.action_spec().num_values)
])# 创建DQN Agent
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)
agent = dqn_agent.DqnAgent(train_env.time_step_spec(),train_env.action_spec(),q_network=q_net,optimizer=optimizer,td_errors_loss_fn=tf_agents.losses.huber_loss)# 训练循环
def train_episode(env, agent):time_step = env.reset()episode_return = 0while not time_step.is_last():action_step = agent.collect_policy.action(time_step)next_time_step = env.step(action_step.action)episode_return += next_time_step.reward.numpy()[0]# 保存轨迹到Replay Buffertraj = tf_agents.trajectories.trajectory.from_transition(time_step, action_step, next_time_step)replay_buffer.add_batch(traj)# 采样训练experience, _ = next(replay_buffer.as_dataset(sample_batch_size=BATCH_SIZE,num_steps=2).take(1))agent.train(experience)time_step = next_time_stepreturn episode_return
二十三、图神经网络(GNN)
使用TensorFlow-GNN库
import tensorflow_gnn as tfgnn# 定义图结构
graph_schema = tfgnn.GraphSchema()
graph_schema.node_sets["node"] = tfgnn.NodeSetSchema(features={"feature": tf.float32},sizes=tf.TensorSpec(shape=(None,), dtype=tf.int32))graph_schema.edge_sets["edge"] = tfgnn.EdgeSetSchema(adjacency=tfgnn.AdjacencySpec(source="node", target="node"),features={"weight": tf.float32})# 构建GNN模型
class GNNModel(tf.keras.Model):def __init__(self):super().__init__()self.conv1 = tfgnn.keras.layers.GraphConv(units=64, message_fn=tfgnn.keras.layers.SimpleConv(message_fn=tf.keras.layers.Dense(32),reduce_type="sum")self.conv2 = tfgnn.keras.layers.GraphConv(units=32)self.dense = tf.keras.layers.Dense(1)def call(self, graph):graph = self.conv1(graph)graph = tfgnn.keras.layers.Readout(node_set_name="node")(graph)graph = self.conv2(graph)return self.dense(graph)
二十四、模型解释性工具
Integrated Gradients可视化
import matplotlib.pyplot as plt
from tensorflow.keras import applications# 加载预训练模型
model = applications.ResNet50(weights='imagenet')# 选择解释方法
@tf.function
def integrated_gradients(inputs, baseline, steps=50):inputs = tf.convert_to_tensor(inputs)baseline = tf.convert_to_tensor(baseline)# 生成插值路径interpolated_inputs = [baseline + (float(i)/steps)*(inputs - baseline)for i in range(steps+1)]# 计算梯度with tf.GradientTape() as tape:tape.watch(interpolated_inputs)preds = model(tf.stack(interpolated_inputs))grads = tape.gradient(preds, interpolated_inputs)avg_grads = tf.reduce_mean(grads[:-1], axis=0)integrated_grad = (inputs - baseline) * avg_gradsreturn integrated_grad# 可视化结果
plt.imshow(integrated_grad.numpy().sum(axis=-1)[0], cmap='viridis')
plt.colorbar()
plt.show()
二十五、自动机器学习(AutoML)
使用KerasTuner自动调参
import keras_tuner as ktdef model_builder(hp):model = tf.keras.Sequential()# 调节层数for i in range(hp.Int('num_layers', 2, 5)):model.add(layers.Dense(units=hp.Int(f'units_{i}', min_value=32, max_value=512, step=32),activation='relu'))model.add(layers.Dense(10, activation='softmax'))# 调节学习率hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=hp_learning_rate),loss='sparse_categorical_crossentropy',metrics=['accuracy'])return model# 启动搜索
tuner = kt.BayesianOptimization(model_builder,objective='val_accuracy',max_trials=20,executions_per_trial=2)tuner.search(train_images, train_labels,epochs=10,validation_split=0.2)# 获取最优模型
best_model = tuner.get_best_models(num_models=1)[0]
二十六、移动端部署(TensorFlow Lite)
Android模型集成示例
- 模型转换:
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()with open('model.tflite', 'wb') as f:f.write(tflite_model)
- Android推理代码:
// 加载模型
Interpreter tflite = new Interpreter(loadModelFile(context));// 输入输出张量
float[][] input = new float[1][224][224][3];
float[][] output = new float[1][1000];// 执行推理
tflite.run(input, output);// 后处理
int maxIndex = argmax(output[0]);
二十七、持续学习路径建议
专项突破计划
领域 | 推荐资源 |
---|---|
生成模型 | 《Generative Deep Learning》书籍 + 官方GAN示例 |
强化学习 | TF-Agents官方文档 + OpenAI Gym环境实践 |
移动端部署 | TensorFlow Lite示例仓库 + Android ML Kit文档 |
模型压缩 | TensorFlow Model Optimization Toolkit指南 + ICLR相关论文 |
二十八、前沿技术追踪
重点关注方向
- JAX与TensorFlow融合:Google Brain团队正在整合JAX的自动微分能力
- 分布式训练新范式:Parameter Server架构向AllReduce模式演进
- 量子机器学习:TensorFlow Quantum库的量子-经典混合模型
- 神经架构搜索(NAS):使用AutoML自动发现高效模型结构
Python 图书推荐
书名 | 出版社 | 推荐 |
---|---|---|
Python编程 从入门到实践 第3版(图灵出品) | 人民邮电出版社 | ★★★★★ |
Python数据科学手册(第2版)(图灵出品) | 人民邮电出版社 | ★★★★★ |
图形引擎开发入门:基于Python语言 | 电子工业出版社 | ★★★★★ |
科研论文配图绘制指南 基于Python(异步图书出品) | 人民邮电出版社 | ★★★★★ |
Effective Python:编写好Python的90个有效方法(第2版 英文版) | 人民邮电出版社 | ★★★★★ |
Python人工智能与机器学习(套装全5册) | 清华大学出版社 | ★★★★★ |
JAVA 图书推荐
书名 | 出版社 | 推荐 |
---|---|---|
Java核心技术 第12版:卷Ⅰ+卷Ⅱ | 机械工业出版社 | ★★★★★ |
Java核心技术 第11版 套装共2册 | 机械工业出版社 | ★★★★★ |
Java语言程序设计基础篇+进阶篇 原书第12版 套装共2册 | 机械工业出版社 | ★★★★★ |
Java 11官方参考手册(第11版) | 清华大学出版社 | ★★★★★ |
Offer来了:Java面试核心知识点精讲(第2版)(博文视点出品) | 电子工业出版社 | ★★★★★ |
相关文章:
Python TensorFlow库【深度学习框架】全面讲解与案例
一、TensorFlow 基础知识 1. 核心概念 张量 (Tensor): 多维数组,是 TensorFlow 的基本数据单位(标量、向量、矩阵等)。计算图 (Graph): 早期版本中的静态图机制(TF2.x 默认启用动态图)。会话 (Session): 在 TF1.x 中…...
日志之ClickHouse部署及替换ELK中的Elasticsearch
文章目录 1 ELK替换1.1 Elasticsearch vs ClickHouse1.2 环境部署1.2.1 zookeeper 集群部署1.2.2 Kafka 集群部署1.2.3 FileBeat 部署1.2.4 clickhouse 部署1.2.4.1 准备步骤1.2.4.2 添加官方存储库1.2.4.3 部署&启动&连接1.2.4.5 基本配置服务1.2.4.6 测试创建数据库和…...
Git 基本操作(一)
目录 git add git commit git log git status git diff git 版本回退 git reset git add git add 指令为添加工作区中的文件到暂存区中。 git add file_name; //将工作区名称为file_name的文件添加进暂存区 git add .; //将工作区中的所有文件添加进暂存区 git comm…...
加密解密记录
一、RSA 加密解密 密钥对生成 1.前端加密解密 (1).vue页面引入 npm install jsencrypt(2)工具 jsencrypt.js import JSEncrypt from jsencrypt/bin/jsencrypt.min// 密钥对生成 http://web.chacuo.net/netrsakeypairconst p…...
Playwright MCP 入门实战:自动化测试与 Copilot 集成指南
什么是 MCP? MCP(Model Context Protocol) 是一种为大语言模型(LLM)设计的协议,MCP充当 LLM 与实际应用之间的桥梁或“翻译器”,将自然语言转化为结构化指令,使得模型可以更精确、高…...
存算一体架构下的新型AI加速范式:从Samsung HBM-PIM看近内存计算趋势
引言:突破"内存墙"的物理革命 冯诺依曼架构的"存储-计算分离"设计正面临根本性挑战——在GPT-4等万亿参数模型中,数据搬运能耗已达计算本身的200倍。存算一体(Processing-In-Memory, PIM)技术通过在存储介…...
为 Unity 项目添加自定义 USB HID 设备支持 (适用于 PC 和 Android/VR)-任何手柄、无人机手柄、摇杆、方向盘
这是一份关于如何在 Unity 中为特定 USB HID 设备(如 Phoenix SM600 手柄)添加支持,并确保其在打包成 APK 安装到独立 VR 设备后仍能正常工作的教程。 目标: 使 Unity 能够识别并处理特定 USB HID(Human Interface Device&#x…...
恒流源电路
常见的是上面这几种, 运放恒流电路一般搭配三极管使用 比赛用的模块可以用这种,会准一点...
python2反编译部分
文章目录 1、所需环境2、确认打包工具(没成功)3、 解包.exe文件(以PyInstaller为例) - useful【***总的来说这一步对我有用】4、定位关键文件 - useful5、 修复.pyc文件头(关键步骤!)- maybe-ig…...
Selenium3自动化测试,Python3测试开发教程视频测试用例设计
Selenium3自动化测试,Python3测试开发教程视频测试用例设计25套高级软件测试,性能测试,功能测试,自动化测试,接口测试,移动端测试,手机测试,WEB测试,渗透测试,…...
PyTorch 2.0编译器技术深度解析:如何自动生成高性能CUDA代码
引言:编译革命的范式转移 PyTorch 2.0的torch.compile不仅是简单的即时编译器(JIT),更标志着深度学习框架从解释执行到编译优化的范式跃迁。本文通过逆向工程编译过程,揭示PyTorch如何将动态图转换为高性能CU…...
ctfshow web入门 web44
信息收集 依旧是把所有输出丢弃,这一次多了flag的过滤,没啥好说的,用*或者?代替就可以了 if(isset($_GET[c])){$c$_GET[c];if(!preg_match("/;|cat|flag/i", $c)){system($c." >/dev/null 2>&1");} }else{h…...
三生原理的离散生成逻辑如何与复分析结合?
AI辅助创作: 三生原理离散生成逻辑与复分析结合路径分析 一、生成规则与解析延拓的协同 参数化联动机制向复数域延伸 三生原理的离散素数生成公式(如p=3(2n+1)+2(2n+m+1))通过引入复数参数 n,m∈C,可扩展为复平面上的解析函数,从而建立与黎曼ζ函数的关联通道。…...
数据升降级:医疗数据的“时空穿梭“系统工程(分析与架构篇)
一、核心挑战与量化分析 1. 版本演化困境的深度解析 (1) 格式断层的结构化危机 数据转换黑洞:某医疗信息平台(2021-2023)统计显示: 数据类型CDA R1→R2转换失败率R2→FHIR转换失败率关键失败点诊断记录28.4%19.7%ICD编码版本冲突(18.7%)用药记录15.2%12.3%剂量单位标准化…...
简单句练习--语法基础
文章目录 谓语和非谓语及物与不及物动词及物不及物主语必须由名词性质的成分充当谓语和非谓语 与中文不同,英语中的动词分为谓语形式和非谓语形式。 以“do”为例, 可以充当谓语的形式有:do,does,did, 以及其他各种时态,如:have done,is doing等。不可独立充当谓语的有…...
基于若依RuoYi-Vue3-FastAPI 的 Docker 部署记录
最近在参与导师项目开发过程中,我选择基于若依 FastAPI Vue3 模板作为系统框架,通过 Docker 实现前后端、数据库和缓存环境的容器化部署。 RuoYi-Vue3-FastAPI的github地址:https://github.com/insistence/RuoYi-Vue3-FastAPI 🛠…...
基于开源AI智能名片链动2+1模式S2B2C商城小程序的电商直播流量转化路径研究
摘要:在电商直播单场GMV突破2.28亿元的流量狂欢背后,传统直播模式正面临"流量过载而转化低效"的困境。本文提出以开源AI智能名片链动21模式S2B2C商城小程序重构流量转化路径,通过智能内容引擎、动态激励体系、供应链协同三大技术模…...
【Linux系统】Linux进程信号(产生,保存信号)
1. 信号快速认识 1-1 基本结论 如何识别信号?识别信号是内置的,进程识别信号,是内核程序员写的内置特性。信号产生之后,是知道怎么处理的,同理,如果信号没有产生,也是知道怎么处理信号的。所以…...
llamafactory-cli webui启动报错TypeError: argument of type ‘bool‘ is not iterable
一、问题 在阿里云NoteBook上启动llamafactory-cli webui报错TypeError: argument of type ‘bool’ is not iterable This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run gradio deploy from the terminal in the working directory t…...
工 厂 模 式
冷知识,当我们需要使用平底锅时,我们并不需要知道平底锅是怎么造的,坏了只需要再买就好了。至于造平底锅,全部交给我们的生产工厂就好。 蕴含这种创建对象思路的设计方法,我们称为“工厂模式”。 核心思想 工厂模式&…...
synchronized与Lock深度对比
Java并发编程:synchronized与Lock深度对比 基本概念 1.1 synchronized synchronized是Java内置的关键字,属于JVM层面的锁机制。它通过对象监视器(Monitor)实现同步,具有自动获取和释放锁的特性。 // 同步方法 public synchronized void sy…...
LeetCode —— 94. 二叉树的中序遍历
94. 二叉树的中序遍历 题目:94. 二叉树的中序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) :…...
【无标题】四色拓扑收缩模型中环形套嵌结构的颜色保真确定方法
#### **1. 环形嵌套结构的局部保真机制** - **零点虚边与环形嵌套**:在顶点 \( v \) 处引入环形嵌套结构(如环面 \( T^2 \)),通过虚边连接形成闭合路径。该结构作为“颜色记忆单元”,存储相邻区域的色彩信息࿰…...
Curl 全面使用指南
Curl(Client URL)是一个跨平台命令行工具,支持多种协议(HTTP/HTTPS/FTP/SFTP等),用于数据传输、API调试、文件上传/下载等场景。以下从 核心功能、用户疑问解答、高级技巧 三方面系统总结,并整合…...
vscode 的空格和 tab 设置 与 Rime 自建词库
自动保存(多用于失去焦点时保存) Files: Auto Save 推荐不勾 保存时格式化(Pritter 插件的功能,自动使用 Pritter 的格式) Editor: Format On Save 推荐不勾 tab 的空格数量,2 或 4 Editor: Tab Size 推荐…...
Spark-小练试刀
任务1:HDFS上有三份文件,分别为student.txt(学生信息表)result_bigdata.txt(大数据基础成绩表), result_math.txt(数学成绩表)。 加载student.txt为名称为student的RDD…...
Python爬虫实战:获取jd商城最新5060ti 16g显卡销量排行榜商品数据并做分析,为显卡选购做参考
一、引言 1.1 研究目的 本研究旨在利用 Python 爬虫技术,从京东商城获取 “5060ti 16g” 型号显卡的商品数据,并对这些数据进行深入分析。具体目标包括: 实现京东商城的模拟登录,突破登录验证机制,获取登录后的访问权限。高效稳定地爬取按销量排名前 20 的 “5060ti 16g…...
【Vue bug】:deep()失效
vue 组件中使用了 element-plus 组件 <template><el-dialog:model-value"visible":title"title":width"width px":before-close"onClose"><div class"container" :style"{height:height px}"&g…...
基于数字图像处理的裂缝检测与识别系统(Matlab)
【优化】Matlab裂缝检测与识别系统 基于数字图像处理的裂缝检测与识别系统(Matlab) (基本常在线秒回,有兴趣可以随时联系博主) 系统主要的内容包括: 1.图像加载与初始化 选择图像文件并加载:…...
day12:遗传算法及常见优化算法分享
遗传算法这些常见优化算法简直是 “宝藏素材”!用好了,轻轻松松就能填满论文一整节内容;要是研究透彻,甚至能独立撑起一整个章节。今天不打算深入展开,有个基础认知就行。等之后写论文真要用到这些算法了,咱…...
【计算机视觉】语义分割:MMSegmentation:OpenMMLab开源语义分割框架实战指南
深度解析MMSegmentation:OpenMMLab开源语义分割框架实战指南 技术架构与设计哲学系统架构概览核心技术特性 环境配置与安装指南硬件配置建议详细安装步骤环境验证 实战全流程解析1. 数据集准备2. 配置文件定制3. 模型训练与优化4. 模型评估与推理 核心功能扩展1. 自…...
25_04_30Linux架构篇、第1章_02源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62
Linux_基础篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.01 适用环境: Centos7 文档说明 本文…...
【重走C++学习之路】25、特殊类设计
目录 一、不能被拷贝的类 二、堆上创建对象的类 三、栈上创建对象的类 四、不能被继承的类 五、单例模式 结语 一、不能被拷贝的类 如何实现一个不能被拷贝的类?在看到这个要求的第一反应就是禁掉类的拷贝构造函数和赋值运算符重载函数,再往深了探…...
基于Redis实现-用户签到
基于Redis实现-用户签到 这个功能将使用到Redis中的BitMap来实现。 我们按照月来统计用户签到信息,签到记录为1,未签到则记录为0 把每一个bit位对应当月的每一天,形成了映射关系。用0和1标示业务状态,这种思路称为位图(BitMap)。…...
利用Redisson分布式锁解决多服务器数据刷新问题
利用Redisson分布式锁解决多服务器数据刷新问题 一、业务背景二、代码实现1、引入Redisson依赖2、配置Redisson,实际项目中Redis为集群配置3、自定义拒绝策略4、异步刷新网元服务 三、项目结构及源码 一、业务背景 最近有个需求需要自动刷新网元服务,由…...
25.4.30数据结构|并查集 路径压缩
前言 在QuickUnion快速合并的过程中,每次都要找根ID,而路径压缩让找根ID变得更加迅速直接。 路径压缩 针对的是findRootIndex()【查找根ID】进行的压缩。 需要实现的是: 在找根节点的过程中,记录这条路径上的所有信息,…...
react学习笔记3——基于React脚手架
React路由 相关理解 SPA的理解 单页Web应用(single page web application,SPA)。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面,只会做页面的局部更新。数据都需要通过ajax请求获取, 并在前端异步展现。 路由的理…...
C#中的LINQ:简化数据查询与操作
引言 在现代软件开发中,处理和操作数据是不可避免的任务。无论是从数据库读取信息,还是对内存中的集合进行筛选、排序等操作,开发者都需要一种高效且易于使用的方法。C#中的LINQ(Language Integrated Query)正是为此而…...
OkHttp3.X 工具类封装:链式调用,支持HTTPS、重试、文件上传【内含常用设计模式设计示例】
OkHttp3.X 工具类封装:链式调用,支持HTTPS、重试、文件上传 基于OkHttp3.X封装,提供链式调用API,简化GET/POST请求,支持HTTPS、自动重试、文件上传等功能,提升开发效率。 在 Android 和 Java 开发中&#x…...
Unity SpriteEditor(精灵图片编辑器)
🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎SpriteEditor: 精灵图片编辑器 📌用于编辑2D游戏开发中使用的Sp…...
雅思写作--70个高频表达
文章目录 1. learn new skills学生通过户外活动学到很多新技2. take immediate action to do各国采取有效行动以保护环境政府采取了必要行动以减少失业。你应该立即采取行动来解3. communication skills4. grow significantly5. have many advantages1. learn new skills “lea…...
Anaconda中配置Pyspark的Spark开发环境
Anaconda中配置Pyspark的Spark开发环境 目录 1.在控制台中测试ipython是否启动正常2.安装好Java3.安装Spark并配置环境变量4.PySpark配置5.修改spark\conf下的spark-env文件6.测试Pyspark是否安装成功 1.在控制台中测试ipython是否启动正常 anaconda正常安装 这里先检查ipyt…...
Spring 提供了多种依赖注入的方式
构造器注入(Constructor Injection) 构造器注入是通过类的构造函数来注入依赖项。这是 Spring 推荐的方式,因为它提供了不可变性和更好的可测试性。 import org.springframework.stereotype.Component;Component public class ServiceA {pub…...
面经-计算机网络——OSI七层模型与TCP/IP四层模型的对比详解
OSI七层模型与TCP/IP四层模型的对比详解 一、图示解析:分层封装结构 你提供的图清晰展示了网络通信中从应用层到物理层的封装过程,每一层都会对上层的数据加上自己的头部信息(Header): 应用层: 应用…...
网络安全知识问答微信小程序的设计与实现
网络安全知识问答微信小程序的设计与实现,说白了,就是搭建一款网络安全知识问答微信小程序,类似网络安全百科直通车。三步走。 需求沟通 进行需求沟通,此处省略1000字。 画草图 根据沟通的需求,进行整理,…...
Canvas特效实例:黑客帝国-字母矩阵(字母雨)
黑客帝国-字幕矩阵(字母雨) 效果预览代码实现思路解析遗留问题 效果预览 话不多说,我们直接上效果:当页面加载完成,屏幕上会落下如瀑布般的绿色字母流,不断向下滑动,仿佛进入了黑客帝国的数字世…...
「Mac畅玩AIGC与多模态11」开发篇07 - 使用自定义名言插件开发智能体应用
一、概述 本篇介绍如何在 macOS 环境下,通过编写自定义 OpenAPI Schema,将无需认证的名言服务接入 Dify 平台,并开发基于外部公共数据的智能体应用。本案例继续实践 GET 请求型 API 的实际调用技巧。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已部署并可访问…...
快速上手非关系型数据库-MongoDB
简介 MongoDB 是一个基于文档的 NoSQL 数据库,由 MongoDB Inc. 开发。 NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。 MongoDB 的设计理念是为了应对大数据量、…...
响应式布局,在飞帆平台中如此简单
这些控件都是可以自己动手去实现的。也可以将这些控件复制到自己名下进行修改。 响应式布局https://fvi.cn/782...
UN R79 关于车辆转向装置形式认证的统一规定(正文部分1)
UN R79法规是针对转向装置的型式认证法规,涉及A/B1/C类的横向控制辅助驾驶功能,对各功能的功能边界、性能要求、状态提示、故障警示以及型式认证要提交的信息做了规范,本文结合百度文心一言对法规进行翻译,并结合个人理解对部分内…...