``` if __name__ == '__main__': # 载入训练集和验证集的数据 x_train, y_train = load_dataset('./划分后的数据/训练集') x_val, _ = load_dataset('./划分后的数据/验证集') input_dim = x_train.shape[1] # 创建共享特征提取器 feature_extractor = Sequential([ Dense(128, activation='relu', input_shape=(input_dim,)), Dropout(0.5), Dense(64, activation='relu') ]) # 创建分类器 classifier_inputs = Input(shape=(64,)) classification_output = Dense(1, activation='sigmoid')(classifier_inputs) classifier_model = Model(inputs=classifier_inputs, outputs=classification_output) classifier_model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy']) # 创建域判别器 discriminator_inputs = Input(shape=(64,)) domain_output = Dense(1, activation='sigmoid')(discriminator_inputs) discriminator_model = Model(inputs=discriminator_inputs, outputs=domain_output) discriminator_model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy']) # 封装整体网络结构用于反向传播 combined_input = feature_extractor.output classification_output_combined = classifier_model(combined_input) domain_output_combined = discriminator_model(combined_input) combined_model = Model(feature_extractor.input, [classification_output_combined, domain_output_combined]) # 冻结判别器权重以仅更新分类器权重 discriminator_model.trainable = False combined_model.compile( optimizer=Adam(), loss=['binary_crossentropy', 'binary_crossentropy'], metrics=['accuracy'] ) # 准备域标签 (源域 vs 目标域) batch_size = 32 num_batches = len(x_train) // batch_size for epoch in range(10): # 设置迭代次数 indices = np.arange(len(x_train)) np.random.shuffle(indices) for i in range(num_batches): idx = indices[i * batch_size:(i + 1) * batch_size] source_batch = x_train[idx] # 源域样本 target_batch = x_val[np.random.choice(len(x_val), size=batch_size)] # 随机采样目标域样本 X_combined = np.vstack([source_batch, target_batch]) Y_domain_labels = np.array([1] * batch_size + [0] * batch_size) # 源域标记为1,目标域标记为0 Y_class_labels = y_train[idx].astype(float) # 只有源域才有类别标签 # 更新特征提取器+分类器 combined_loss = combined_model.train_on_batch(X_combined, [Y_class_labels, Y_domain_labels]) # 解冻判别器并单独训练它 discriminator_model.trainable = True disc_loss = discriminator_model.train_on_batch(feature_extractor.predict(source_batch), np.ones(batch_size)) # 判别器区分真实分布 disc_loss += discriminator_model.train_on_batch(feature_extractor.predict(target_batch), np.zeros(batch_size)) discriminator_model.trainable = False print(f"Epoch {epoch + 1}: Combined Loss={combined_loss}, Discriminator Loss={disc_loss}") print("Domain adaptation training completed.") # 测试阶段 - 使用验证集评估分类精度 extracted_features = feature_extractor.predict(x_val) predictions = classifier_model.predict(extracted_features) accuracy = np.mean((predictions > 0.5).flatten() == _) # 替换_为目标验证集的真实标签 print(f"Validation Accuracy: {accuracy:.4f}") validation_accuracy = combined_model.evaluate(x_val, [y_val, ...], verbose=0)[1] # 获取第二个输出的acc指标 print(f"Final Validation Classification Accuracy: {validation_accuracy:.4f}")```运行结果:2025-03-29 15:32:12.506410: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX AVX2 To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags. Traceback (most recent call last): File "C:/Users/Lenovo/AppData/Roaming/JetBrains/PyCharmCE2020.2/scratches/scratch_19.py", line 104, in <module> Y_class_labels = y_train[idx].astype(float) # 只有源域才有类别标签 IndexError: index 121655 is out of bounds for axis 0 with size 288
时间: 2025-03-29 12:08:56 浏览: 34
从代码来看,您正在尝试构建一个基于深度学习的领域自适应模型(Domain Adaptation)。然而,在运行过程中出现了`IndexError`错误。以下是对此问题的具体分析以及解决方案。
---
### **问题原因**
错误提示为 `IndexError: index 121655 is out of bounds for axis 0 with size 288`,这表明索引超出了数组的有效范围。具体来说:
- 您通过 `np.random.shuffle(indices)` 对训练集索引进行了打乱,并将它们划分为若干批次。
- 然而,`indices` 的长度是由 `len(x_train)` 决定的,但您的代码试图访问超出该范围的索引值 (`idx`)。
这意味着,`num_batches = len(x_train) // batch_size` 计算出的结果导致了某些批次中使用的索引超出了实际数据的数量限制。
---
### **解决办法**
#### 修改批量处理部分
我们需要确保每次循环只取有效的索引范围内数据。可以调整如下:
```python
for epoch in range(10): # 设置迭代次数
indices = np.arange(len(x_train))
np.random.shuffle(indices)
num_batches = (len(x_train) + batch_size - 1) // batch_size # 向上取整计算batch数
for i in range(num_batches):
start_idx = i * batch_size
end_idx = min((i + 1) * batch_size, len(x_train)) # 防止越界
if start_idx >= end_idx:
continue # 如果当前批次为空,则跳过
idx = indices[start_idx:end_idx]
source_batch = x_train[idx] # 源域样本
target_batch = x_val[np.random.choice(len(x_val), size=len(idx))] # 根据source_batch大小随机采样目标域样本
X_combined = np.vstack([source_batch, target_batch])
Y_domain_labels = np.array([1] * len(idx) + [0] * len(target_batch)) # 源域标记为1,目标域标记为0
Y_class_labels = y_train[idx].astype(float) # 只有源域才有类别标签
# 接下来继续原有逻辑...
```
**关键点:**
- `end_idx = min((i + 1) * batch_size, len(x_train))`: 确保不会超过有效索引范围。
- 动态生成的目标域批尺寸也应匹配原始批尺寸(`size=len(idx)`)。
#### 其他注意事项
此外,请确认以下几个方面是否正确设置:
1. 数据集中是否有足够的样本覆盖所有操作;
2. 是否对输入维度、标签等信息做了适当的预处理和校验;
3. TensorFlow版本兼容性检查——例如TF优化库指令警告虽不影响核心功能但仍需留意升级建议。
完成上述修改后再次运行脚本应该能够正常工作而不报错!
---
### **总结与延伸思考**
通过对该段程序的学习我们了解到如何结合特征提取层、分类任务及对抗式领域适配机制共同提升跨环境泛化能力的一个完整流程;同时掌握了排查常见张量切片异常技巧如索引溢出等问题的方法论。
阅读全文
相关推荐


















