#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’ нет ссылки, это то, что вы хотите изменить?