打算用Keras做迁移学习,书上和资料上说用keras做迁移学习比较方便(毕竟大部分迁移学习都是用的那些比较常用的数据集,keras比较适合和方便做)
- Keras有两种构建模型的方式:sequential(适用于简单模型)和 function API(适用于复杂的模型)
sequential Model
- sequential 有如下常用方法:
- compile(optimizer, loss=None, metrics=None, loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None) #模型训练时的相关配置
- fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None, validation_freq=1, max_queue_size=10, workers=1, use_multiprocessing=False) #在epoch下训练模型
- evaluate(x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False) #在测试集下返回loss和评估函数结果
- predict(x, batch_size=None, verbose=0, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False) #对输入样本进行预测结果
- train_on_batch(x, y, sample_weight=None, class_weight=None, reset_metrics=True) #对一个batch进行更新梯度
- test_on_batch(x, y, sample_weight=None, reset_metrics=True) #对一个batch的数据进行测试
Layer
模型里的层“输入层”“隐藏层”“输出层”,
- 核心Layer
- keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None) #相当于操作了output = activation(dot(input, kernel) + bias)
- keras.layers.Activation(activation)
- keras.layers.Dropout(rate, noise_shape=None, seed=None)
- keras.layers.Flatten(data_format=None)
- keras.engine.input_layer.Input()
- keras.layers.Reshape(target_shape)
- keras.layers.Masking(mask_value=0.0)
- 卷积Layer
- keras.layers.Conv1D(filters, kernel_size, strides=1, padding='valid', data_format='channels_last', dilation_rate=1, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
- keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
- 池化Layer
- keras.layers.MaxPooling1D(pool_size=2, strides=None, padding='valid', data_format='channels_last')
- keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
- keras.layers.AveragePooling1D(pool_size=2, strides=None, padding='valid', data_format='channels_last')
- keras.layers.AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
Optimizers
- keras.optimizers.SGD(learning_rate=0.01, momentum=0.0, nesterov=False)
- keras.optimizers.RMSprop(learning_rate=0.001, rho=0.9)
- keras.optimizers.Adagrad(learning_rate=0.01)
- keras.optimizers.Adadelta(learning_rate=1.0, rho=0.95)
- keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
激活函数
- keras.activations.elu(x, alpha=1.0)
- keras.activations.softmax(x, axis=-1)
- keras.activations.relu(x, alpha=0.0, max_value=None, threshold=0.0)
- keras.activations.tanh(x)
- keras.activations.sigmoid(x)
- keras.activations.linear(x)
损失函数Loss
- keras.losses.mean_squared_error(y_true, y_pred)
- keras.losses.mean_absolute_error(y_true, y_pred)
- keras.losses.categorical_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0)
- keras.losses.binary_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0)
评价函数Metrics
- keras.metrics.accuracy(y_true, y_pred)
- keras.metrics.binary_accuracy(y_true, y_pred, threshold=0.5)
- keras.metrics.categorical_accuracy(y_true, y_pred)
已有模型
- Xception
- VGG16
- VGG19
- ResNet, ResNetV2
- InceptionV3
- InceptionResNetV2
- MobileNet
- MobileNetV2
- DenseNet
- NASNet
from keras.applications.vgg16 import VGG16 from keras.preprocessing import image from keras.applications.vgg16 import preprocess_input import numpy as np model = VGG16(weights='imagenet', include_top=False) img_path = 'elephant.jpg' img = image.load_img(img_path, target_size=(224, 224)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) x = preprocess_input(x) features = model.predict(x)