#python #keras #scikit-learn #pipeline #tf.keras
#python #keras #scikit-learn #конвейер #tf.keras
Вопрос:
Я создаю конвейер sklearn, который состоит из 3 шагов:
- Преобразует фрейм данных pandas в 3D-массив
- Преобразует 3D-массив в график повторения (изображение)
- Обучает модель классификации изображений с использованием 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)