Я экспериментирую с керасом и пытаюсь осуществить глубокое обучение, чтобы предсказать оценку упражнений пациентов. Тем не менее, я застрял на долгое время, пытаясь настроить сеть с помощью собственного генератора. Намерение: Допустим, у нас есть пациенты, приезжающие на обследование. Каждый пациент должен сделать 9 упражнений, в то время как он (она) захвачен камерой. Вход для нас представляет собой последовательность из 21 точки (3 димса каждый) во времени. С другим столбцом для метки времени это означает таблицу из 64 (21 * 3 + 1) столбцов. Каждый временной шаг представлен строкой значений в таблице. Таким образом, каждый пациент представлен девятью таблицами. Таким образом, net, который я пытаюсь реализовать, должен взять девять таблиц переменной длины в качестве входных данных и вывести оценку пациента, которая представляет собой одно число. Я следовал нескольким руководствам и в итоге получил следующее:
def get_base_model(input_len, fsize, width):
input_seq = tf.keras.layers.Input(shape=(input_len, width))
nb_filters = 10
convolved = tf.keras.layers.Conv1D(
nb_filters,
fsize,
padding="same",
activation="tanh"
)(input_seq)
processed = tf.keras.layers.GlobalMaxPooling1D()(convolved)
compressed = tf.keras.layers.Dense(50, activation="tanh")(processed)
compressed = tf.keras.layers.Dropout(0.3)(compressed)
model = tf.keras.models.Model(inputs=input_seq, outputs=compressed)
return model
def main_model(inputs_lens, fsizes=[8, 16, 24]):
width = Misc.COUNT_OF_POINTS * 3 + 1
inputs = []
for i in range(Misc.COUNT_OF_EXERCISES):
inputs.append(tf.keras.layers.Input(shape=(inputs_lens[i], width)))
base_nets = []
for i in range(Misc.COUNT_OF_EXERCISES):
# TODO down-sampling?
base_nets.append(get_base_model(inputs_lens[i], fsizes[0], width))
embeddings = []
for i in range(Misc.COUNT_OF_EXERCISES):
embeddings.append(base_nets[i](inputs[i]))
merged = tf.keras.layers.Concatenate()(embeddings)
out = tf.keras.layers.Dense(1, activation='sigmoid')(merged)
model = tf.keras.models.Model(inputs=inputs, outputs=out)
return model
И позже я использую его следующим образом.
n_outputs = 1
n_epochs = 10
batch_size = 1
inputs_lens = []
for i in range(Misc.COUNT_OF_EXERCISES):
inputs_lens.append(patients.get_max_row_count()) // TODO
net = main_model(inputs_lens)
net.compile(optimizer='rmsprop', loss='mse', metrics=['accuracy'])
generator = Generator(patients)
net.fit(
generator,
epochs=n_epochs,
steps_per_epoch=generator.__len__(),
verbose=2)
Проблема: Насколько я знаете, мне нужно заполнить net кортежами (x, y), где y - пакет результатов - массив чисел оценки, а x - пакет входов - массив формы batch_size * упражнение_count * timesteps * ценности. Я также подготовил генератор, предоставив пакеты:
print (generator. getitem (0) [0] .shape) // (32, 9, 678, 64) -> (batch_size, упражнения, шаги, значения) print (генератор. getitem (0) [1] .shape) // (32,) -> (batch_size,).
Однако net, похоже, ожидайте только 3 измерения. Когда я пытаюсь запустить его, возникает следующая ошибка:
ValueError: Вход 0 слоя conv1d несовместим со слоем: ожидаемый ndim = 3, найденный ndim = 4. Получена полная форма: [Нет, Нет, Нет, Нет]
вместе с предупреждениями:
ВНИМАНИЕ: тензор потока: Модель построена с формой (Нет, 678, 64 ) для входного Tensor («input_1: 0», shape = (None, 678, 64), dtype = float32), но он был вызван на входе с несовместимой формой (None, None, None, None). ВНИМАНИЕ: тензор потока: модель была построена с формой (None, 678, 64) для входного Tensor («input_10: 0», shape = (None, 678, 64), dtype = float32), но она была вызвана на входе с несовместимым форма (Нет, Нет, Нет, Нет).
Net Сводка:
Печать (net .summary ())
Model: "model_9"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 678, 64)] 0
__________________________________________________________________________________________________
input_2 (InputLayer) [(None, 678, 64)] 0
__________________________________________________________________________________________________
input_3 (InputLayer) [(None, 678, 64)] 0
__________________________________________________________________________________________________
input_4 (InputLayer) [(None, 678, 64)] 0
__________________________________________________________________________________________________
input_5 (InputLayer) [(None, 678, 64)] 0
__________________________________________________________________________________________________
input_6 (InputLayer) [(None, 678, 64)] 0
__________________________________________________________________________________________________
input_7 (InputLayer) [(None, 678, 64)] 0
__________________________________________________________________________________________________
input_8 (InputLayer) [(None, 678, 64)] 0
__________________________________________________________________________________________________
input_9 (InputLayer) [(None, 678, 64)] 0
__________________________________________________________________________________________________
model (Model) (None, 50) 5680 input_1[0][0]
__________________________________________________________________________________________________
model_1 (Model) (None, 50) 5680 input_2[0][0]
__________________________________________________________________________________________________
model_2 (Model) (None, 50) 5680 input_3[0][0]
__________________________________________________________________________________________________
model_3 (Model) (None, 50) 5680 input_4[0][0]
__________________________________________________________________________________________________
model_4 (Model) (None, 50) 5680 input_5[0][0]
__________________________________________________________________________________________________
model_5 (Model) (None, 50) 5680 input_6[0][0]
__________________________________________________________________________________________________
model_6 (Model) (None, 50) 5680 input_7[0][0]
__________________________________________________________________________________________________
model_7 (Model) (None, 50) 5680 input_8[0][0]
__________________________________________________________________________________________________
model_8 (Model) (None, 50) 5680 input_9[0][0]
__________________________________________________________________________________________________
concatenate (Concatenate) (None, 450) 0 model[1][0]
model_1[1][0]
model_2[1][0]
model_3[1][0]
model_4[1][0]
model_5[1][0]
model_6[1][0]
model_7[1][0]
model_8[1][0]
__________________________________________________________________________________________________
dense_9 (Dense) (None, 1) 451 concatenate[0][0]
==================================================================================================
Total params: 51,571
Trainable params: 51,571
Non-trainable params: 0
__________________________________________________________________________________________________
Любая помощь приветствуется.