Keras mod的输出相同

2024-04-26 13:15:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Keras模型来预测比赛中的移动。我有一个输入形状(160,120 ,1)。我有一个输出为9个节点的以下模型:

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D, ZeroPadding2D
from keras.layers.normalization import BatchNormalization
from keras.optimizers import Adam
from keras.regularizers import l2
from keras import optimizers
def alexnet_model(n_classes=9, l2_reg=0.,
    weights=None):

    # Initialize model
    alexnet = Sequential()
    alexnet.add(Conv2D(24, (11, 11), input_shape=(160,120,1), activation ='relu'))
    alexnet.add(MaxPooling2D(pool_size=(2, 2)))
    alexnet.add(BatchNormalization())
    alexnet.add(Conv2D(36, (5, 5), activation ='relu'))
    alexnet.add(MaxPooling2D(pool_size=(2, 2)))
    alexnet.add(Conv2D(48, (3, 3),  activation ='relu'))
    alexnet.add(Conv2D(54, (3, 3),  activation ='relu'))
    alexnet.add(MaxPooling2D(pool_size=(2, 2)))
    alexnet.add(Flatten())
    alexnet.add(Dense(300,   activation ='tanh'))
    alexnet.add(Dropout(0.5))
    alexnet.add(Dense(200,   activation ='tanh'))
    alexnet.add(Dropout(0.5))
    alexnet.add(Dense(100,   activation ='tanh'))
    alexnet.add(Dropout(0.5))


    alexnet.add(Dense(n_classes , activation = 'softmax'))

    optimizer = Adam(lr=1e-3)

    alexnet.compile(loss='categorical_crossentropy', optimizer=optimizer)


    alexnet.summary()


    return alexnet

然后,我运行一个训练脚本。我的X的形状是(12862, 160, 120, 1),而{}是{}。在

^{pr2}$

测试模型后,我得到一个输出:

array([[2.8518048e-01, 5.5075828e-03, 7.3730588e-02, 5.3255934e-02,
        1.0635615e-01, 6.4690344e-02, 9.1519929e-08, 7.0413840e-08,
        4.1127869e-01]], dtype=float32)

有了这行代码:

model.predict(X[100].reshape(-1,160,120,1)) 

我知道在X上测试模型是不好的,但不管我使用哪个图片,我都得到了相同的输出。仅供参考(我的Y值):

w = [1,0,0,0,0,0,0,0,0]
s = [0,1,0,0,0,0,0,0,0]
a = [0,0,1,0,0,0,0,0,0]
d = [0,0,0,1,0,0,0,0,0]
wa = [0,0,0,0,1,0,0,0,0]
wd = [0,0,0,0,0,1,0,0,0]
sa = [0,0,0,0,0,0,1,0,0]
sd = [0,0,0,0,0,0,0,1,0]
nk = [0,0,0,0,0,0,0,0,1]

我试过另一种型号,但还是不行。以下是每个课程的培训数据量:

Counter({'[1, 0, 0, 0, 0, 0, 0, 0, 0]': 5000,
         '[0, 0, 0, 0, 0, 0, 0, 0, 1]': 5000,
         '[0, 0, 0, 0, 1, 0, 0, 0, 0]': 1183,
         '[0, 0, 0, 0, 0, 1, 0, 0, 0]': 982,
         '[0, 0, 1, 0, 0, 0, 0, 0, 0]': 832,
         '[0, 0, 0, 1, 0, 0, 0, 0, 0]': 764,
         '[0, 1, 0, 0, 0, 0, 0, 0, 0]': 101})

我认为问题出在模型上,但我不知道如何改变它。可能是培训数据少的问题吗?{cd8>也不会下跌。它只会减少几位小数,有时甚至会回升。在


Tags: from模型importaddmodellayersactivationdropout
2条回答

解决了! 仅仅规范化培训数据是行不通的。我减少了节点和层的数量,一切都很好。我想这是个过度适应的问题。在

从代码中显示的情况来看,并且由于您提到损耗下降非常缓慢,所以最好的猜测是输入数据(我认为是图像)没有标准化,因此这会阻止平滑的渐变流。试着使它们正常化。一种简单的方法是:

X = X.astype('float32') / 255.0
test_x = test_x.astype('float32') / 255.0

此外,您可能需要考虑训练数据中的类不平衡,并通过在^{}方法中使用class_weights参数来抵消它(查看文档以了解如何使用它)。在

相关问题 更多 >