обучение полностью сверточной сети с изображениями произвольного размера

#python #tensorflow #variables #keras

#python #тензорный поток #переменные #keras

Вопрос:

Я построил полностью сверточную сеть, которую я передаю подсети A с коэффициентами MFCC Файлы wav, из которых вычисляются MFCC, имеют переменную длительность, поэтому каждый wav заканчивается списком MFCC переменной длины. Я сделал реализацию и попытался передать подсети A с размером пакета = 1.

     X_audio_images = loadFeaturesFromFiles(trainFilenames, params)

from sklearn.model_selection import KFold
n_split=5
f=0
all_acc=[]
for train_index,test_index in KFold(n_split).split(X):
    f=f 1
    print('nnnFold ',f,' of ', n_split)
    for k, l in zip(train_index, test_index):
        xA_train,xA_test=X_audio_images[k],X_audio_images[l]
        xB_train,xB_test=X[k],X[l]
        y_train,y_test=y[k],y[l]
    
    
    xA_test = np.array(xA_test)
    xA_test = np.expand_dims(xA_test, axis=(0, 3))
    xA_train = np.array(xA_train)
    xA_train = np.expand_dims(xA_train, axis=(0, 3))
    xB_test = np.expand_dims(xB_test, axis=(0))
    xB_train = np.expand_dims(xB_train, axis=(0))
    y_train = np.expand_dims(y_train, axis=(0))
    y_test = np.expand_dims(y_test, axis=(0))
     
    inputsA = Input(shape=(None, None, 1))

    xA = Conv2D(filters=32, kernel_size=5, strides=1)(inputsA)
    xA = Dropout(0.5)(xA)
    xA = BatchNormalization()(xA)
    xA = Activation('relu')(xA)

    xA = MaxPooling2D()(xA)

    xA = Conv2D(filters=64, kernel_size=5, strides=1)(xA)
    xA = Dropout(0.5)(xA)
    xA = BatchNormalization()(xA)
    xA = Activation('relu')(xA)

    xA = MaxPooling2D()(xA)

    xA = Conv2D(filters=64, kernel_size=1, strides=1)(xA)
    xA = Dropout(0.3)(xA)
    xA = BatchNormalization()(xA)
    xA = Activation('relu')(xA)

    
    # Fully connected layer 2
    xA = Conv2D(filters=4, kernel_size=1, strides=1)(xA)
    xA = Dropout(0.2)(xA)
    xA = BatchNormalization()(xA)
    xA = GlobalMaxPooling2D()(xA)
   # predictions = tf.keras.layers.Activation('softmax')(x)
    
    inputsB = Input(shape=(input_dim,))
    xB = Dense(128, activation='relu')(inputsB)
    xB = Dropout(0.5)(xB)
    xB = Dense(128, activation='relu')(xB)
    xB = Dropout(0.5)(xB)

    combined =Concatenate()([xA, xB])
    out = Dense(104,  activation='relu')(combined)
    out = Dropout(0.3)(out)
    out = Dense(4,  activation='softmax')(out)


    model = Model(inputs=[inputsA, inputsB], outputs=out)
    model.summary()
    
   
 
    model.compile(loss='categorical_crossentropy', optimizer=Adam(learning_rate=0.01),metrics= ['accuracy'])
    
    # Train the model.
    print(xA_train.shape, xB_train.shape)
    model.fit( [xA_train, xB_train], y_train,  epochs=500,   batch_size=12, validation_data=([xA_test, xB_test], y_test), callbacks=[es] )
    loss,acc = model.evaluate( [xA_test, xB_test],  y_test)
    
    print('nModel evaluation for fold ',f,' accuracy: ',acc,'nn')
    all_acc.append(acc)
#    time.sleep(2)
    

print('nnTest Accuracies for all folds: ', all_acc, 'tAverage: ', np.average(all_acc))
 

но я думаю, что на самом деле он не делает то, что должен делать
Что я пытаюсь понять, так это то, как я каждый раз загружаю сеть с переменной длиной ввода, устанавливаю размер сети, а затем снова меняю его и действительно чему-то учусь.
Каковы шаги для обучения?

Комментарии:

1. Ввод переменной формы не поддерживается в слоях tensorflow. Итак, вы не можете этого сделать. Однако вы можете использовать tf.image.resize_with_crop_or_pad для изменения размера всех изображений до одинаковой формы с некоторыми обнуленными полями. Это приемлемо?

2. @tornikeo это неправда, вы абсолютно можете ввести переменную форму изображения

Ответ №1:

Если вам нужен переменный размер ввода, вот как это сделать, но это не будет работать с плотными соединениями

Если вы хотите, чтобы это работало с плотными соединениями, вам нужно будет указать установленный размер ввода, поскольку это создает взаимосвязь между размером изображения и количеством соединений, исходящих из него

Кроме того, на вашу переменную ‘input_dim’ нет ссылки, это то, что вы хотите изменить?