使用Keras 2的ResNet50出现NaN损失值

4

自从升级到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żejko
从一开始 - Chris K
你的输入大小是多少? - Marcin Możejko
尝试将np.zeros也作为x输入。 - Marcin Możejko
你能打印出 model.summary() 吗?是的,它看起来非常奇怪。 - Marcin Możejko
显示剩余3条评论
1个回答

3

当我将后端切换到tensorflow而不是theano时,一切正常。看起来keras 2中的theano实现出了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接