Python 3.x 如何将numpy.ndarray或keras metrix作为keras输入传递

Python 3.x 如何将numpy.ndarray或keras metrix作为keras输入传递,python-3.x,tensorflow,keras,numpy-ndarray,tf.keras,Python 3.x,Tensorflow,Keras,Numpy Ndarray,Tf.keras,我有一个形状为(230000)的矩阵列表,我需要通过conv层将此信息作为tensorflow深度学习模型的输入来传递,但当我一直试图通过此信息进行训练时,我得到了 return ops.EagerTensor(value, ctx.device_name, dtype) ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray). 我将numpy阵列列表

我有一个形状为(230000)的矩阵列表,我需要通过conv层将此信息作为tensorflow深度学习模型的输入来传递,但当我一直试图通过此信息进行训练时,我得到了

    return ops.EagerTensor(value, ctx.device_name, dtype)
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).
我将numpy阵列列表作为熊猫系列

0      [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...
1      [[0.036600337822677166, 0.018300168911338583, ...
2      [[0.8671148170073495, 0.47065322955211747, 0.0...
3      [[0.024680190751413082, 0.007051483071832309, ...
4      [[0.0688791198957804, 0.0, 0.0, 0.0, 0.0229597...
                             ...                        
549    [[0.024182541670333724, 0.0, 0.0, 0.0, 0.0, 0....
550    [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...

Name: tfidf, Length: 554, dtype: object
这是我的模型

def getmodel(num_words = 20000):
    x_input = keras.Input( shape=(2,30000),name="article1")  # Variable-length sequence of ints
    conv1d_1= layers.Conv1D(64, 2, input_shape=(2,30000), activation='relu')(x_input)
    global_1 = layers.GlobalMaxPooling1D()(conv1d_1)
    dense1 = layers.Dense(1024, name="dense1", activation="relu", )(global_1)
    encoder_conv_dense2 = layers.Dense(256, name="40_dense", activation="relu", )(dense1)
    encoder_conv_dense3 = layers.Dense(1, name="similar_result", activation="relu", )(encoder_conv_dense2)

    model = keras.Model(
        inputs=x_input,
        outputs=[encoder_conv_dense3],
    )
    keras.utils.plot_model(model, "my_paper_model.png", show_shapes=True)

    return model
这里是我如何传递信息的

def compile_model(model, optimizer, loss, loss_weight):
    model.compile(
        optimizer=optimizer,
        loss=loss,
        loss_weights=loss_weight,
        metrics=[tf.keras.metrics.Accuracy()]
    )
    return model

def train(df):
callback = tf.keras.callbacks.EarlyStopping(monitor='accuracy', patience=40)
    callback2 = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=20)
    model = getmodel()
    model = compile_model(model, keras.optimizers.Adam(), keras.losses.BinaryCrossentropy(), 0.05)
    history = model.fit(
        {"article1":df['tfidf']},
        {"similar_result": df['is_similar']},
        validation_split=0.3,
        epochs=400,
        batch_size=32,
        verbose=1,
        callbacks=[callback, callback2, ],
    )
我不知道如何将2行30000列的numpy矩阵作为keras的输入传递给conv层


希望有人能帮助我

您提供的输入格式不正确。在这种情况下,对于3D输入,您需要提供一组形状(n_示例、时间步长、n_特征)。您可以使用
np.stack(df['tfidf'],0)
简单地实现这一点,这将产生一个shape
数组(n_sample,13000)

我尝试在下面重现一个虚拟示例:

# create fake data
df = pd.DataFrame()
df['tfidf'] = [[np.random.uniform(0,1, 30)],
              [np.random.uniform(0,1, 30)],
              [np.random.uniform(0,1, 30)],
              [np.random.uniform(0,1, 30)]]
df['is_similar'] = np.random.randint(0,2, 4)
df['tfidf']
的格式如下:

0    [[0.09865182564241004, 0.5282608042987893, 0.5...
1    [[0.1361578046476558, 0.9866056058771036, 0.44...
2    [[0.38811373040427766, 0.5686225139326878, 0.8...
3    [[0.8254123154336716, 0.3542711784901068, 0.28...
Name: tfidf, dtype: object
定义模型和配合:

def getmodel():
    
    x_input = keras.Input(shape=(1,30),name="article1")  # Variable-length sequence of ints
    conv1d_1= layers.Conv1D(64, 1, activation='relu')(x_input)
    flat = layers.Flatten()(conv1d_1)
    dense1 = layers.Dense(1024, name="dense1", activation="relu")(flat)
    encoder_conv_dense2 = layers.Dense(256, name="40_dense", activation="relu")(dense1)
    encoder_conv_dense3 = layers.Dense(1, name="similar_result", activation="sigmoid")(encoder_conv_dense2)

    model = keras.Model(
        inputs=x_input,
        outputs=encoder_conv_dense3,
    )
    
    return model

model = getmodel()
model.compile('adam', 'binary_crossentropy')
history = model.fit(
    {"article1": np.stack(df['tfidf'],0)},
    {"similar_result": df['is_similar']},
    epochs=3,
)