Я пытаюсь построить архитектуру CNN на Tensorflow 2.0, которая принимает несколько файлов временных сигналов, извлекает некоторые функции, добавляет все функции и выводит одно значение (предполагаемый оставшийся срок полезного использования).
Одним из примеров формы ввода для классификационной головки является (14976, 128, 5, 5), которая сразу становится (1, 128, 5, 5) с помощью пользовательской функции добавления и будет иметь форму ( 1,1) в самом конце. В этом случае метка будет 3610 (это напрямую связано с размером партии).
Я могу заставить его "работать", используя RUL = np.full(preproc_imgs.shape[0], RUL)
, но я чувствую, что он не выводит то, что предполагалось ...
Мой вопрос: есть ли способ что я могу передать одно значение в качестве метки для модели для обучения?
Это моя модель (глава классификации):
class MyAddLayer(keras.layers.Layer):
def call(self, inputs):
'''
elems = np.array([1, 2, 3, 4, 5, 6])
sum = scan(lambda a, x: a + x, elems)
# sum == [1, 3, 6, 10, 15, 21]
'''
print('inputs[-1]', inputs[-1])
sum = tf.scan(lambda a, x: a + x, inputs)
print('sum', sum[-1])
return tf.expand_dims(sum[-1], 0)
class EstimatedRUL(tf.keras.Model):
def __init__(self, name='EstimatedRUL'):
super(EstimatedRUL, self).__init__(name=name)
self.add = MyAddLayer()
self.conv_5 = keras.layers.Conv2D(5, (3, 3), padding='same', kernel_initializer='glorot_normal',
bias_initializer='glorot_normal')
####### Estimated RUL #######
self.flat = keras.layers.Flatten()
self.dense = keras.layers.Dense(128, kernel_initializer='glorot_normal', bias_initializer='glorot_normal')
self.leaky = keras.layers.LeakyReLU()
self.rul = keras.layers.Dense(1, activation='sigmoid', kernel_initializer='glorot_normal',
bias_initializer='glorot_normal')
####### Estimated RUL #######
def call(self, inputs):
print('shape of the input: ', inputs.shape)
a = self.add(inputs)
print('shape of added input: ', a.shape)
c5 = self.conv_5(a)
flat = self.flat(c5)
dense = self.dense(flat)
leaky = self.leaky(dense)
rul = self.rul(leaky)
print('about to return the rul with shape: ', rul.shape)
return rul
Это тело:
inputs = keras.Input(shape=(160, 160, 3))
base_model = keras.applications.mobilenet.MobileNet(input_shape=(160, 160, 3), include_top=False,
weights='imagenet', classes=2)(inputs)
base_model.trainable = False
После построения моделей
model_1 = keras.Model(inputs=inputs, outputs=base_model, name='first')
model_1.compile(optimizer=adam, loss=los, metrics=['mean_absolute_percentage_error', RMSE])
print(model_1.summary())
model_2 = EstimatedRUL.EstimatedRUL()
model_2.compile(optimizer=adam, loss=los, metrics=['mean_absolute_percentage_error', RMSE])
С этими параметрами
los = 'mean_absolute_error'
lr = 0.0001
####### Custom metrics #######
def RMSE(y_true, y_pred):
return tf.sqrt(tf.reduce_mean(tf.square(tf.subtract(y_true, y_pred))))
####### Custom optimizer #######
adam = keras.optimizers.Adam(learning_rate=lr)
Промежуточные результаты получены через preproc_imgs = model_1.predict(train_images)
и поданы в модель_2 для получения оценочных значений. оставшийся срок полезного использования
Полное сообщение об ошибке (в данном случае): ValueError: Please provide as model targets either a single array or a list of arrays. You passed y=3610