У меня есть 6 * 32 массива, скажем, технологических данных, которые выглядят как «лучи», соединяют локальные максимумы некоторых или всех шести рядов и идут под некоторым углом вверх ногами:
1: 100 (102) 97 98 127 120 121
2: 88 87 (91) 90 88 88 88
3: 101 100 101 100 101 100 100
4: 99 97 97 98 (99) 98 97
5: ...
6: ...
Моя основная идея состояла в том, чтобы использовать сети CNN, потому что в настоящее время операторы обнаруживают эти шаблоны визуально, и проблема не кажется слишком сложной по сравнению с распознаванием текстовых или фотообъектов.Я использую Keras и следующая архитектура дает лучшие результаты.К сожалению, только на тренировке.
model = keras.Sequential([
keras.layers.BatchNormalization(input_shape=( 6, 32, 1)),
keras.layers.Conv2D(filters=32, kernel_size=2, activation='tanh', padding="same"),
keras.layers.Conv2D(filters=32, kernel_size=2, activation='tanh', padding="same"),
keras.layers.MaxPooling2D(2),
keras.layers.Conv2D(filters=16, kernel_size=3, activation='tanh', padding="same"),
keras.layers.Conv2D(filters=16, kernel_size=3, activation='tanh', padding="same"),
keras.layers.MaxPooling2D(2),
keras.layers.Conv2D(filters=8, kernel_size=4, activation='tanh', padding="same"),
keras.layers.Conv2D(filters=8, kernel_size=4, activation='tanh', padding="same"),
keras.layers.GlobalAveragePooling2D(),
keras.layers.Dense(8096, activation=tf.nn.tanh),
keras.layers.Dropout(0.6),
keras.layers.Dense(8096, activation=tf.nn.relu),
keras.layers.Dropout(0.6),
keras.layers.Dense(1, activation=tf.nn.sigmoid)
])
Компиляция:
model.compile(optimizer=keras.optimizers.RMSprop(),
loss='binary_crossentropy',
metrics=['accuracy'])
Тренировка:
model.fit(train_data, train_labels, epochs=200, batch_size=128)
На тренировке он теряет ~ 0.1667 точность ~ 0.9480 При тестовой точноститолько 61%.