Day 43

Dogs vs. Cats(猫狗大战)项目

数据预处理

import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
 
# 数据集路径(注意 Windows 路径需用双反斜杠或原始字符串)
train_dir = r"D:\python训练营\dogs-vs-cats\train"
 
# 数据增强与归一化
train_datagen = ImageDataGenerator(
    rescale=1./255,
    validation_split=0.2,  # 80% 训练,20% 验证
    rotation_range=20,
    zoom_range=0.2,
    horizontal_flip=True
)
 
# 加载数据
train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=(224, 224),  # 调整图像尺寸(根据数据集选择)
    batch_size=32,
    class_mode='binary',  # 二分类(猫 vs 狗)
    subset='training'
)
 
val_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=(224, 224),
    batch_size=32,
    class_mode='binary',
    subset='validation'
)

 

构建并训练CNN模型

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
 
# 定义 CNN 模型
model = Sequential([
    Conv2D(32, (3,3), activation='relu', input_shape=(224,224,3)),
    MaxPooling2D((2,2)),
    Conv2D(64, (3,3), activation='relu'),
    MaxPooling2D((2,2)),
    Conv2D(128, (3,3), activation='relu'),
    MaxPooling2D((2,2)),
    Flatten(),
    Dense(512, activation='relu'),
    Dense(1, activation='sigmoid')  # 二分类输出
])
 
# 编译模型
model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
)
 
# 训练模型
history = model.fit(
    train_generator,
    epochs=10,
    validation_data=val_generator
)

Grad-CAM 可视化

实现 Grad-CAM

import cv2
import matplotlib.pyplot as plt
from tensorflow.keras.models import Model
 
def grad_cam(model, img_array, layer_name, eps=1e-8):
    # 获取模型和特定卷积层
    grad_model = Model(
        inputs=[model.inputs],
        outputs=[model.get_layer(layer_name).output, model.output]
    )
    
    # 计算梯度
    with tf.GradientTape() as tape:
        conv_outputs, predictions = grad_model(img_array)
        loss = predictions[:, 0]  # 适用于二分类
    
    # 计算梯度
    grads = tape.gradient(loss, conv_outputs)
    pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
    
    # 生成热力图
    conv_outputs = conv_outputs[0]
    heatmap = conv_outputs @ pooled_grads[..., tf.newaxis]
    heatmap = tf.squeeze(heatmap)
    heatmap = tf.maximum(heatmap, 0) / (tf.math.reduce_max(heatmap) + eps)
    return heatmap.numpy()
 
def overlay_heatmap(img, heatmap, alpha=0.5):
    # 调整热力图颜色
    heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))
    heatmap = np.uint8(255 * heatmap)
    heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
    superimposed_img = cv2.addWeighted(img, alpha, heatmap, 1-alpha, 0)
    return superimposed_img

 

加载测试图像并生成热力图

# 加载单张图像
img_path = 'dataset/test/dog.1234.jpg'  # 替换为你的测试图像路径
img = tf.keras.preprocessing.image.load_img(img_path, target_size=(224, 224))
img_array = tf.keras.preprocessing.image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0) / 255.0  # 归一化
 
# 选择最后一个卷积层(根据模型结构)
layer_name = 'conv2d_2'  # 替换为你的模型中最后一个卷积层名称
 
# 生成热力图
heatmap = grad_cam(model, img_array, layer_name)
 
# 可视化
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.imshow(img_array[0])
plt.title('Original Image')
 
plt.subplot(1, 2, 2)
plt.imshow(heatmap, cmap='jet')
plt.title('Grad-CAM Heatmap')
plt.show()
 
# 叠加热力图到原图
img = cv2.imread(img_path)
img = cv2.resize(img, (224, 224))
superimposed_img = overlay_heatmap(img, heatmap)
 
plt.imshow(cv2.cvtColor(superimposed_img, cv2.COLOR_BGR2RGB))
plt.title('Grad-CAM Overlay')
plt.axis('off')
plt.show()

 需要注意的主要有两点:
(1)确保路径与代码中一致
(2)注意内存,可采取减小 batch_size 或使用更小的输入尺寸(如 (128, 128))。

    ### DHCP Option 43 的配置说明和用途 #### 配置说明 为了使接入点(AP)能够通过动态主机配置协议(DHCP)获取无线控制器(AC)的 IP 地址,在路由器上作为 DHCP 服务器时需正确设置 Option 43 参数。具体操作是在 DHCP 请求响应过程中加入特定格式的信息给 AP,让其知道 AC 所在位置以便于后续通信建立。 对于华为设备而言,可以按照如下方式来进行配置: ```shell dhcp enable ip pool ap-pool gateway-list 192.168.1.1 network 192.168.1.0 mask 255.255.255.0 dns-list 8.8.8.8 expired day 7 option 43 ascii "hex-string-of-ac-ip" ``` 其中 `option 43 ascii` 后面跟的是由 ASCII 字符串表示的十六进制形式的 AC IP 地址字符串[^1]。 #### 用途解释 当启用 DHCP Option 43 功能之后,它允许网络管理员向客户端提供额外的服务信息——特别是针对那些依赖集中管理架构下的终端节点如 Wi-Fi 接入点 (AP),这些设备通常需要连接到一个中心化的控制单元即无线控制器(AC) 来实现统一管理和优化服务交付过程。因此,Option 43 主要用于传递 AC 的 IP 地址给新上线或重启后的 AP 设备,使得它们能自动找到并注册至对应的 AC 上去工作[^2]。 值得注意的是,在实际部署环境中如果启用了 Option 43,则往往也会关联使用 Vendor Class Identifier(VCI), 即 DHCP Option 60, 这样可以帮助区分不同类型的请求者以确保只对指定类别的设备发送相应的选项数据[^3]。
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值