kares代码如下:(哈哈,我的代码有点繁琐(乱),部分函数就不具体展开啦)
- input = Input(shape=(-1,15, 15, 200, 1))
- conv1 = _conv_bn_relu(nb_filter=64, kernel_dim1=3, kernel_dim2=3, kernel_dim3=input._keras_shape[3], subsample=(1, 1, 1))(input)
- spa1_output = _residual_block1(nb_filter=nb_filter, repetitions=1, is_first_layer=True, name = 'spa1')(conv1)
- spa2_output = _residual_block2(nb_filter=nb_filter, repetitions=1, is_first_layer=True, name = 'spa2')(spa1_output)
- spa3_output = _residual_block3(nb_filter=nb_filter, repetitions=1, is_first_layer=True, name = 'spa3')(spa2_output)
- block = _bn_relu(spa3_output)
- block_norm = BatchNormalization(axis=CHANNEL_AXIS)(block)
- block_output = Activation("relu")(block_norm)
- pool = AveragePooling3D(pool_size=(block._keras_shape[CONV_DIM1], block._keras_shape[CONV_DIM2],block._keras_shape[CONV_DIM3],), strides=(1, 1, 1))(block_output)
- flatten1 = Flatten()(pool)
- drop1 = Dropout(0.5)(flatten1)
- dense = Dense(units=num_outputs, activation="softmax", kernel_initializer="he_normal")(drop1)
- model1 = Model(inputs=input, outputs=dense)
- model1.compile(loss='categorical_crossentropy', optimizer=RMSprop(lr=0.0003), metrics=['accuracy'])
- best_weights_RES_path_ss4 = 'models/Indian_best_1.hdf5'
- earlyStopping6 = kcallbacks.EarlyStopping(monitor='val_loss', patience=patience, verbose=1, mode='auto')
- saveBestModel6 = kcallbacks.ModelCheckpoint(best_weights_RES_path_ss4, monitor='val_loss', verbose=1,save_best_only=True, mode='auto')
- model1.fit(x= x_train2.reshape(x_train2.shape[0], x_train2.shape[1], x_train2.shape[2], x_train2.shape[3], 1), y= y_train, validation_data=([x_val1.reshape(x_val1.shape[0], x_val1.shape[1], x_val1.shape[2], x_val1.shape[3], 1), x_val2.reshape(x_val2.shape[0], x_val2.shape[1], x_val2.shape[2], x_val2.shape[3], 1)], y_val), batch_size=batch_size, nb_epoch=nb_epoch, shuffle=True, callbacks=[earlyStopping6, saveBestModel6])
下载模型及提取中间3层的特征:
- model1_out = load_model('models/Indian_best_1.hdf5')
- spa1_model = Model(inputs=model1_out.inputs, outputs=model1_out.get_layer('spa1').output)
- spa2_model = Model(inputs=model1_out.inputs, outputs=model1_out.get_layer('spa2').output)
- spa3_model = Model(inputs=model1_out.inputs, outputs=model1_out.get_layer('spa3').output)
- spa1_output = spa1_model.predict(x_test2[1].reshape(1, x_test2[1].shape[0], x_test2[1].shape[1], x_test2[1].shape[2], 1))
- spa2_output = spa2_model.predict(x_test2[1].reshape(1, x_test2[1].shape[0], x_test2[1].shape[1], x_test2[1].shape[2], 1))
- spa3_output = spa3_model.predict(x_test2[1].reshape(1, x_test2[1].shape[0], x_test2[1].shape[1], x_test2[1].shape[2], 1))
中间3层的可视化,每层展示3个feature map:
- plt.figure(figsize=(3, 3))
- for i in range(3):
- plt.subplot(3, 6, 6 * i + 1)
- spa1_img = spa1_output[0, :, :, 0, i]
- spa1_img = (spa1_img - np.min(spa1_img)) / (np.max(spa1_img) - np.min(spa1_img))
- plt.title("spa1")
- plt.imshow(spa1_img)
- plt.subplot(3, 6, 6 * i + 2)
- spa2_img = spa2_output[0, :, :, 0, i]
- spa2_img = (spa2_img - np.min(spa2_img)) / (np.max(spa2_img) - np.min(spa2_img))
- plt.title("spa2")
- plt.imshow(spa2_img)
- plt.subplot(3, 6, 6 * i + 3)
- spa3_img = spa3_output[0, :, :, 0, i]
- spa3_img = (spa3_img - np.min(spa3_img)) / (np.max(spa3_img) - np.min(spa3_img))
- plt.title("spa3")
- plt.imshow(spa3_img)
- plt.show()