سلام.
من یک کدی رو در متلب نوشته بودم و الان سعی میکنم عینا همون کد رو در کراس پیاده سازی کنم ولی عملکردشون خیلی متفاوته. خواستم بدونم دو ستانی که کراس کار کردن مشکل از کجاست. شرح کاملش اینجاس
- مسیله کلاس بندی به سه کلاس
- train و test دیتا دقیقا هم در متلب و هم کراس یکی هستند
- تمام عکسها ترین و تست به سایز 224و224 resize شده اند
- روش حل با فاین تیونینگ VGG16
- در کراس:
model = application.VGG16(weight='imagenet',include top = True, input_shape=(224,224,3)))
model.layers.pop()
top_model = sequential()
top_model.add(Dense(64,activation ='relu',input_shape=model.layers[-1].ouputshape[1:]))
top_model.add(Dense(3,activation = 'softmax',activity_regulizer = keras.regulizers.l2(0.0001)))
model = Model(inputs = model.input, outputs = top_model(model.layers[-1].output))
for layer in model.layers[:22]:#all layers except newly added layers
layer.trainable = False
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.SGD(lr=0.01, momentum=0.9),
metrics=['accuracy'])
train_datagen = ImageDataGenerator(
preprocessing_function = preprocess_input)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(224,224),
batch_size=32,
class_mode='categorical')
model.fit_generator(
train_generator,
steps_per_epoch=nb_train_samples // (batch_size),
epochs=50,
callbacks=[cb_tensorboard],
shuffle=True)
در متلب:
net =vgg16
layers = net.Layers(1:end-3);% removing callsification output layer, softmax layer and last fully connected layer like keras
layers(end+1) = fullyConnectedLayer(64, 'Name', 'special_2');
layers(end+1) = reluLayer('Name', 'selfAddedRelu');
layers(end+1) = fullyConnectedLayer(3, 'Name', 'fc8_2');
layers(end+1) = softmaxLayer;
layers(end+1) = classificationLayer();
layers(end-2).WeightLearnRateFactor = 1000;
layers(end-2).WeightL2Factor = 1;
layers(end-2).BiasLearnRateFactor = 20;
layers(end-2).BiasL2Factor = 0;
layers(end-4).WeightLearnRateFactor = 1000;
layers(end-4).WeightL2Factor = 1;
layers(end-4).BiasLearnRateFactor = 20;
layers(end-4).BiasL2Factor = 0;
options = trainingOptions('sgdm',...
'MiniBatchSize',32,...
'MaxEpochs',50,...
'InitialLearnRate',0.00001,...
'L2Regularization',0.0001,...
'Momentum' ,0.9,...
'ValidationData',ValImages,...
'ValidationFrequency',20,...# number od iterartion not epochs
'ValidationPatience',Inf,...#Inf = no criteria to stop training
'Shuffle','every-epoch')
net = trainNetwork(trainingDS, layers, options);
عملکرد متلب بر اساس AUC برای دو باینری classification
AUC (Class1 versus all) = 91%
AUC (class2 versus all)=80%
عملکرد کراس:
AUC (Class1 versus all) = 81%
AUC (class2 versus all)=70%
- متلب بصورت پیشفرض imageNet subtraction رو انجام میده معادل preprocess_input در کراس برای VGG16
- trainining acc در هر دو حالت تقریبا 100% میشه