Я работаю над повторным назначением классификатора сигналов.
Мои генераторы поездов и проверки подают в модель пакетные массивы [32, 3000, 1]
(32 сигнала, 3000 временных шагов, сглаживание). basic_model кодирует каждый сигнал в вектор 1D вектора, прежде чем seq_model отобразит этот вектор в класс.
Чтобы получить представление об архитектуре, код для построения модели приведен ниже.
def basic_model():
inp = Input(shape= (3000, 1))
img_1 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(inp)
img_1 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(img_1)
img_1 = MaxPool1D(pool_size=2)(img_1)
img_1 = SpatialDropout1D(rate=0.01)(img_1)
img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
img_1 = MaxPool1D(pool_size=2)(img_1)
img_1 = SpatialDropout1D(rate=0.01)(img_1)
img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
img_1 = MaxPool1D(pool_size=2)(img_1)
img_1 = SpatialDropout1D(rate=0.01)(img_1)
img_1 = Convolution1D(256, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
img_1 = Convolution1D(256, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
img_1 = GlobalMaxPool1D()(img_1)
img_1 = Dropout(rate=0.01)(img_1)
dense_1 = Dropout(0.01)(Dense(64, activation=activations.relu, name="dense_1")(img_1)) # Last layer in basic_model gives Outputshape (None, 64)
base_model = models.Model(inputs=inp, outputs=dense_1)
opt = optimizers.Adam(0.001)
base_model.compile(optimizer=opt, loss=losses.sparse_categorical_crossentropy, metrics=['acc'])
#base_model.summary()
return base_model
def seq_model():
nclass = 6
seq_input = Input(shape=(None, 3000, 1))
base_model = basic_model()
encoded_sequence = TimeDistributed(base_model)(seq_input) #Input shapes (0,64) (None, 3000, 1)
encoded_sequence = SpatialDropout1D(rate=0.01)(Convolution1D(128,
kernel_size=3,
activation="relu",
padding="same")(encoded_sequence))
encoded_sequence = Dropout(rate=0.05)(Convolution1D(128,
kernel_size=3,
activation="relu",
padding="same")(encoded_sequence))
#out = TimeDistributed(Dense(nclass, activation="softmax"))(encoded_sequence)
out = Convolution1D(nclass, kernel_size=3, activation="softmax", padding="same")(encoded_sequence)
model = models.Model(seq_input, out)
model.compile(optimizers.Adam(0.001), losses.sparse_categorical_crossentropy, metrics=['acc'])
model.summary()
return model
model = seq_model()
batch_size = 32
EPOCHS = 25
ch_model = model.fit_generator(generator(X_train, y_train, batch_size), steps_per_epoch= (X_train.shape[0]//batch_size, epochs = EPOCHS,
validation_data= validation_generator(X_val, y_val, batch_size),
validation_steps=(X_val.shape[0] // batch_size), shuffle=True)
Запуск этого кода дает ошибку:
ValueError: Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (32, 3000, 1)
Проверка model.summary () - input_23(InputLayer) Output shape: (None, None, 3000, 1)
. Пытаясь изменить seq_input на Input(shape=(3000,1))
, я получаю ошибку "Input tensor must be of rank 3, 4 or 5 but was 2"
. Таким образом, 1 Ни один не используется для выполнения требования к тензорному рангу, а из документации другой по существу является заполнителем для размера партии.
Узнав об этом, я попытался изменить форму тренировок от генераторов. Я сделал это с помощью X_train = np.expand_dims(X_train, axis=0)
, чтобы получить входной массив [1,32,3000,1].
Это дало мне почти через модель, но я получаю сообщение об ошибке Error when checking target: expected conv1d_161 to have 3 dimensions, but got array with shape (32, 6)
. ( conv1d_161 - это выходной слой seq_model. )
Мой вопрос: как мне отформатировать мои пакетные массивы для работы с этой настройкой? Следуя дальше, какой размер мне не хватает?
Спасибо за ваше время:)