You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow多输入CNN模型报错排查:TypeError与Conv1D输入维度不兼容问题解决

我来帮你拆解这两个问题,它们分别来自指标函数适配和输入维度匹配两个方向,咱们一个个说:

1. 第一个错误:TypeError: __array__() takes 1 positional argument but 2 were given

这个问题和你的Input层定义无关,根源是你直接使用了lifelines.utils.concordance_index作为Keras的评估指标。Keras的metric函数要求仅接收y_true和y_pred两个参数,但concordance_index的参数签名是(event_times, predicted_scores, event_observed=None),而且它内部处理Keras张量时,没有适配TensorFlow的张量类型,直接转换numpy数组时就触发了错误。

解决办法是自己写个包装函数,把它改成Keras兼容的metric:

import tensorflow as tf
import numpy as np
from lifelines.utils import concordance_index

def keras_ci(y_true, y_pred):
    # 用tf.py_function包装,适配TensorFlow的Graph模式
    def compute_ci(true, pred):
        true_np = true.numpy().flatten()
        pred_np = pred.numpy().flatten()
        # 你的任务是回归预测Kd,假设所有样本都有有效观测值,所以event_observed设为全1
        return concordance_index(true_np, pred_np, event_observed=np.ones_like(true_np))
    return tf.py_function(compute_ci, [y_true, y_pred], tf.float64)

然后编译模型时用这个包装后的函数:

interactionModelA.compile(optimizer='adam', loss='mean_squared_error', metrics=[keras_ci])

2. 第二个错误:ValueError: Input 0 of layer conv1d_39 is incompatible with the layer: expected min_ndim=3, found ndim=2

这个确实是输入维度的问题:Keras的Conv1D层要求输入是3D张量,形状为(batch_size, 序列长度, 特征数)——这里每个序列位置的特征数是1(因为你的数据是单特征的整数编码序列)。

你第一次写的Input层定义是对的:

XDinput = Input(shape=(maximum_SMILES_length,1))
XTinput = Input(shape=(maximum_amino_acid_sequence_length,1))

问题出在你的训练数据上——你的padded_train_smile_encode这类数据是2D数组(形状(样本数, 序列长度)),而不是Conv1D需要的3D形状(样本数, 序列长度, 1)。

给数据补个特征维度就行:

# 给SMILES序列补最后一维
padded_train_smile_encode = np.expand_dims(padded_train_smile_encode, axis=-1)
padded_val_smile_encode = np.expand_dims(padded_val_smile_encode, axis=-1)
padded_test_smile_encode = np.expand_dims(padded_test_smile_encode, axis=-1)

# 给蛋白质序列补最后一维
padded_train_protein_encode = np.expand_dims(padded_train_protein_encode, axis=-1)
padded_val_protein_encode = np.expand_dims(padded_val_protein_encode, axis=-1)
padded_test_protein_encode = np.expand_dims(padded_test_protein_encode, axis=-1)

这样数据形状就和Input层完全匹配了,Conv1D就能正常工作。

最后梳理下修复步骤

  1. 用上面的包装函数替换直接使用的concordance_index;
  2. 保留Input层的shape=(序列长度,1)定义;
  3. 给所有输入序列数据添加最后一个特征维度;
  4. 重新编译训练模型即可。

内容的提问来源于stack exchange,提问作者Gabriel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:43:13