python - GoogleNet 神经网络中所有 epoch 的精度相同
问题描述
输出我在 GoogleNet 的所有 epoch 中都获得了相同的精度,但情况并非如此,网络应该在每个 epoch 中学习,因此每个 epoch 的精度应该不同。请查看我的代码并帮助找出如何纠正它。将学习率降低 1/10 没有帮助,这可能是我使用图像数据的方式有问题吗?我正在逐个导入图像,在每个图像导入期间,我首先导入一个图像然后调整它的大小,然后将其转换为浮点数并将其除以 255 并添加到图像列表中。
import keras
from keras.layers.core import Layer
import keras.backend as K
import tensorflow as tf
from keras.datasets import cifar10
from keras.models import Model
from keras.layers import Conv2D, MaxPool2D, \
Dropout, Dense, Input, concatenate, \
GlobalAveragePooling2D, AveragePooling2D,\
Flatten
import cv2
import os
import numpy as np
import pandas as pd
from keras.datasets import cifar10
from keras import backend as K
from keras.utils import np_utils
import math
from keras.optimizers import SGD
from keras import optimizers
keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
from keras.callbacks import LearningRateScheduler
folder_train = 'D:/ResearchProject/data/siim-acr-pneumothorax/train'
folder_test = 'D:/ResearchProject/data/siim-acr-pneumothorax/test'
def load_images_from_folder(folder):
images = []
for filename in os.listdir(folder):
img = cv2.imread(os.path.join(folder,filename))
if img is not None:
img = np.array(cv2.resize(img, (224,224)))
img = img.astype('float32')
img = img / 255.0
images.append(img)
return images
images_test = load_images_from_folder(folder_test)
images_train = load_images_from_folder(folder_train)
images_test = np.array(images_test)
print(type(images_test),images_test.shape)
images_train = np.array(images_train)
print(type(images_train),images_train.shape)
# read the labels of the images
path_test = 'D:/ResearchProject/data/siim-acr-pneumothorax/stage_1_test_images.csv'
label_test = pd.read_csv(path_test, usecols=[2], skiprows = 1,header = None)
path_train = 'D:/ResearchProject/data/siim-acr-pneumothorax/stage_1_train_images.csv'
label_train = pd.read_csv(path_train, usecols=[2], skiprows = 1,header = None)
Y_train, Y_valid = label_train, label_test
Y_train, Y_valid = np.array(Y_train), np.array(Y_valid)
print(Y_train.shape,type(Y_train), Y_valid.shape, type(Y_valid))
num_classes = 2
Y_train = np_utils.to_categorical(Y_train, num_classes)
Y_valid = np_utils.to_categorical(Y_valid, num_classes)
print(images_train.shape, Y_train.shape, images_test.shape, Y_valid.shape)
# Inception module function
def inception_module(x,
filters_1x1,
filters_3x3_reduce,
filters_3x3,
filters_5x5_reduce,
filters_5x5,
filters_pool_proj,
name=None):
conv_1x1 = Conv2D(filters_1x1, (1, 1), padding='same', activation='relu', kernel_initializer=kernel_init, bias_initializer=bias_init)(x)
conv_3x3 = Conv2D(filters_3x3_reduce, (1, 1), padding='same', activation='relu', kernel_initializer=kernel_init, bias_initializer=bias_init)(x)
conv_3x3 = Conv2D(filters_3x3, (3, 3), padding='same', activation='relu', kernel_initializer=kernel_init, bias_initializer=bias_init)(conv_3x3)
conv_5x5 = Conv2D(filters_5x5_reduce, (1, 1), padding='same', activation='relu', kernel_initializer=kernel_init, bias_initializer=bias_init)(x)
conv_5x5 = Conv2D(filters_5x5, (5, 5), padding='same', activation='relu', kernel_initializer=kernel_init, bias_initializer=bias_init)(conv_5x5)
pool_proj = MaxPool2D((3, 3), strides=(1, 1), padding='same')(x)
pool_proj = Conv2D(filters_pool_proj, (1, 1), padding='same', activation='relu', kernel_initializer=kernel_init, bias_initializer=bias_init)(pool_proj)
output = concatenate([conv_1x1, conv_3x3, conv_5x5, pool_proj], axis=3, name=name)
return output
kernel_init = keras.initializers.glorot_uniform()
bias_init = keras.initializers.Constant(value=0.2)
# defining layers of CNN
input_layer = Input(shape=(224, 224, 3))
x = Conv2D(64, (7, 7), padding='same', strides=(2, 2), activation='relu', name='conv_1_7x7/2', kernel_initializer=kernel_init, bias_initializer=bias_init)(input_layer)
x = MaxPool2D((3, 3), padding='same', strides=(2, 2), name='max_pool_1_3x3/2')(x)
x = Conv2D(64, (1, 1), padding='same', strides=(1, 1), activation='relu', name='conv_2a_3x3/1')(x)
x = Conv2D(192, (3, 3), padding='same', strides=(1, 1), activation='relu', name='conv_2b_3x3/1')(x)
x = MaxPool2D((3, 3), padding='same', strides=(2, 2), name='max_pool_2_3x3/2')(x)
x = inception_module(x,
filters_1x1=64,
filters_3x3_reduce=96,
filters_3x3=128,
filters_5x5_reduce=16,
filters_5x5=32,
filters_pool_proj=32,
name='inception_3a')
x = inception_module(x,
filters_1x1=128,
filters_3x3_reduce=128,
filters_3x3=192,
filters_5x5_reduce=32,
filters_5x5=96,
filters_pool_proj=64,
name='inception_3b')
x = MaxPool2D((3, 3), padding='same', strides=(2, 2), name='max_pool_3_3x3/2')(x)
x = inception_module(x,
filters_1x1=192,
filters_3x3_reduce=96,
filters_3x3=208,
filters_5x5_reduce=16,
filters_5x5=48,
filters_pool_proj=64,
name='inception_4a')
x1 = AveragePooling2D((5, 5), strides=3)(x)
x1 = Conv2D(128, (1, 1), padding='same', activation='relu')(x1)
x1 = Flatten()(x1)
x1 = Dense(1024, activation='relu')(x1)
x1 = Dropout(0.7)(x1)
x1 = Dense(2, activation='softmax', name='auxilliary_output_1')(x1)
x = inception_module(x,
filters_1x1=160,
filters_3x3_reduce=112,
filters_3x3=224,
filters_5x5_reduce=24,
filters_5x5=64,
filters_pool_proj=64,
name='inception_4b')
x = inception_module(x,
filters_1x1=128,
filters_3x3_reduce=128,
filters_3x3=256,
filters_5x5_reduce=24,
filters_5x5=64,
filters_pool_proj=64,
name='inception_4c')
x = inception_module(x,
filters_1x1=112,
filters_3x3_reduce=144,
filters_3x3=288,
filters_5x5_reduce=32,
filters_5x5=64,
filters_pool_proj=64,
name='inception_4d')
x2 = AveragePooling2D((5, 5), strides=3)(x)
x2 = Conv2D(128, (1, 1), padding='same', activation='relu')(x2)
x2 = Flatten()(x2)
x2 = Dense(1024, activation='relu')(x2)
x2 = Dropout(0.7)(x2)
x2 = Dense(2, activation='softmax', name='auxilliary_output_2')(x2)
x = inception_module(x,
filters_1x1=256,
filters_3x3_reduce=160,
filters_3x3=320,
filters_5x5_reduce=32,
filters_5x5=128,
filters_pool_proj=128,
name='inception_4e')
x = MaxPool2D((3, 3), padding='same', strides=(2, 2), name='max_pool_4_3x3/2')(x)
x = inception_module(x,
filters_1x1=256,
filters_3x3_reduce=160,
filters_3x3=320,
filters_5x5_reduce=32,
filters_5x5=128,
filters_pool_proj=128,
name='inception_5a')
x = inception_module(x,
filters_1x1=384,
filters_3x3_reduce=192,
filters_3x3=384,
filters_5x5_reduce=48,
filters_5x5=128,
filters_pool_proj=128,
name='inception_5b')
x = GlobalAveragePooling2D(name='avg_pool_5_3x3/1')(x)
x = Dropout(0.4)(x)
x = Dense(2, activation='softmax', name='output')(x)
model = Model(input_layer, [x, x1, x2], name='GoogleNet_Inception_v1')
model.summary()
epochs = 15
#initial_lrate = 0.01
initial_lrate = 0.001
def decay(epoch, steps=100):
#initial_lrate = 0.01
initial_lrate = 0.001
drop = 0.96
epochs_drop = 8
lrate = initial_lrate * math.pow(drop, math.floor((1+epoch)/epochs_drop))
return lrate
sgd = SGD(lr=initial_lrate, momentum=0.9, nesterov=False)
lr_sc = LearningRateScheduler(decay, verbose=1)
# print(images_train.shape, Y_train.shape, images_test.shape, Y_valid.shape)
model.compile(loss=['categorical_crossentropy', 'categorical_crossentropy', 'categorical_crossentropy'], loss_weights=[1, 0.3, 0.3], optimizer=sgd, metrics=['accuracy'])
#model.compile(loss=['categorical_crossentropy', 'categorical_crossentropy', 'categorical_crossentropy'], loss_weights=[1, 0.3, 0.3], optimizer=adam, metrics=['mae', 'acc','accuracy',metrics.mae, metrics.categorical_accuracy])
history = model.fit(images_train, [Y_train, Y_train, Y_train], validation_data=(images_test, [Y_valid, Y_valid, Y_valid]), epochs=epochs, batch_size=256, callbacks=[lr_sc])
解决方案
推荐阅读
- class - 在 Fortran 中访问子声明类型的问题
- javascript - 防止 addEventListner 不在 DOM 中时的控制台错误
- python - 如何在 Python 中用图片其余部分的前景剪切绿色背景?
- database - 如何恢复卸载的wordpress
- python - 更改某些变量的值后更改条件
- apache-spark - Spark groupBy vs repartition plus mapPartitions
- java - 在 Grizzly 上运行的 Java Web 应用程序出现零星的 502 错误
- sql - 你喜欢哪种数据库设计;一种具有实际的物理关系还是一种模仿它?
- logstash - 如何在logstash的grok模式中使用IF ELSE条件
- sql - 列出总和相同的数字组合