Ошибка атрибута: объект ‘numpy.ndarray’ не имеет атрибута ‘id’

#python #keras #scikit-learn #pipeline #tf.keras

#python #keras #scikit-learn #конвейер #tf.keras

Вопрос:

Я создаю конвейер sklearn, который состоит из 3 шагов:

  1. Преобразует фрейм данных pandas в 3D-массив
  2. Преобразует 3D-массив в график повторения (изображение)
  3. Обучает модель классификации изображений с использованием Keras

Это мой исходный набор данных:

train_df — фрейм данных pandas

 id   cycle   s1
1    1       0.05
1    2       0.04
1    3       0.05
1    4       0.05
2    1       0.02
2    2       0.03
  

y_train

 array([[1., 0., 0.],
       [1., 0., 0.],
       ...
       [1., 0., 0.]], dtype=float32)
  

Когда я запускаю свой текущий код (см. Ниже), я получаю следующую ошибку:

Ошибка атрибута: объект ‘numpy.ndarray’ не имеет атрибута ‘id’

Код (как вы можете заметить, я преобразую только X в конвейере. В идеале я также хотел бы преобразовать y в конвейере):

 import numpy as np
from keras.wrappers.scikit_learn import KerasClassifier
import tensorflow as tf
from tensorflow.keras.models import *      # I know that this is not a best way to import libraries
from tensorflow.keras.layers import *      # due to possible issues with namespace
from tensorflow.keras.optimizers import *  # But my current problem is not related to this aspect
from tensorflow.keras.utils import *       # Therefore please i&nore it.
from tensorflow.keras.callbacks import *
from sklearn.pipeline import Pipeline

def create_model():
    model = Sequential()

    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(50, 50, 17)))
    model.add(Conv2D(32, (3, 3), activation='relu'))
    model.add(MaxPoolin&2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPoolin&2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(3, activation='softmax'))

    model.compile(loss='cate&orical_crossentropy', optimizer='adam', metrics=['accuracy'])

    print(model.summary())
    
    return model


def _rec_plot(s, eps=0.10, steps=10):
    d = pdist(s[:,None])
    d = np.floor(d/eps)
    d[d&&t;steps] = steps
    Z = squareform(d)
    return Z


def 2Dto3D(X, y=None):
    x = []
    for en&ine_id in X.id.unique():
        for sequence in &en_sequence(X[X.id==en&ine_id], sequence_len&th, sequence_cols):
            x.append(sequence)

    x = np.asarray(x)
    return x


def ArrayToIma&e(x, y=None):
    x = np.apply_alon&_axis(_rec_plot, 1, x).astype('float16')  
    return x

transformer1 = sklearn.preprocessin&.FunctionTransformer(func=2Dto3D)
transformer2 = sklearn.preprocessin&.FunctionTransformer(func=ArrayToIma&e)

clf = KerasClassifier(build_fn=create_model, verbose=0)

blackbox_model = Pipeline([('2Dto3D', transformer1),('3DtoIma&e', transformer2),('clf',clf)])
blackbox_model.fit(train_df, y_train)