自从升级到Keras 2后,我在尝试微调ResNet50时发现出现了nan损失。如果我使用单个卷积层(如下所示的注释)而不是ResNet,损失和准确率看起来都没问题。我是否错过了Keras 2中的一些变化?
from keras.applications.resnet50 import ResNet50
from keras.layers import Flatten, Dense, Input, Conv2D, Activation, Flatten
from keras.layers.pooling import MaxPooling2D
from keras.models import Model
from keras.optimizers import SGD
import numpy as np
inp = Input(batch_shape=(32, 224, 224, 3), name='input_image')
### resnet
modelres = ResNet50(weights="imagenet", include_top=False, input_tensor=inp)
x = modelres.output
x = Flatten()(x)
### single convolutional layer
#x = Conv2D(32, (3,3))(inp)
#x = Activation('relu')(x)
#x = MaxPooling2D(pool_size=(3,3))(x)
#x = Flatten()(x)
#x = Dense(units=32)(x)
predictions = Dense(units=2, kernel_initializer="he_normal", activation="softmax")(x)
model = Model(inputs=inp, outputs=predictions)
model.compile(SGD(lr=.001, momentum=0.9), "categorical_crossentropy", metrics=["accuracy"])
# generate images of all ones with the same label
def gen():
while True:
x_data = np.ones((32,224,224,3)).astype('float32')
y_data = np.zeros((32,2)).astype('float32')
y_data[:,1]=1.0
yield x_data, y_data
model.fit_generator(gen(), 10, validation_data=gen(), validation_steps=1)
model.summary()
的开头和结尾如下所示:
____________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
====================================================================================================
input_image (InputLayer) (32, 224, 224, 3) 0
____________________________________________________________________________________________________
zero_padding2d_1 (ZeroPadding2D) (32, 230, 230, 3) 0
____________________________________________________________________________________________________
conv1 (Conv2D) (32, 112, 112, 64) 9472
...
avg_pool (AveragePooling2D) (32, 1, 1, 2048) 0
____________________________________________________________________________________________________
flatten_1 (Flatten) (32, 2048) 0
____________________________________________________________________________________________________
dense_1 (Dense) (32, 2) 4098
====================================================================================================
训练输出为:
Epoch 1/1
10/10 [==============================] - 30s - loss: nan - acc: 0.0000e+00 - val_loss: nan - val_acc: 0.0000e+00
nan
是从一开始就出现还是在某些批次/时期之后出现的? - Marcin Możejkonp.zeros
也作为x
输入。 - Marcin Możejkomodel.summary()
吗?是的,它看起来非常奇怪。 - Marcin Możejko