【问题标题】:Why is this keras network not "learning"?为什么这个keras网络不“学习”?
【发布时间】:2018-12-13 17:18:14
【问题描述】:

我正在尝试构建一个卷积神经网络来对猫和狗进行分类(这是一个非常基本的问题,因为我想学习)。我正在尝试的一种方法是使用 2 个输出神经元来检查类(而不是仅使用 1 并制作 0 --> 例如猫和 1--> 狗),但由于某种原因,网络没有学习,有人可以帮帮我吗?

这是模型:

from keras.models import Sequential
from keras.layers import Input, Dropout, Flatten, Conv2D, MaxPooling2D, Dense, Activation
from keras.optimizers import RMSprop,Adam
from keras.callbacks import ModelCheckpoint, Callback, EarlyStopping
from keras.utils import np_utils

optimizer = Adam(lr=1e-4)
objective = 'categorical_crossentropy'


def classifier():
    
    model = Sequential()
    
    model.add(Conv2D(64, 3, padding='same',input_shape=train.shape[1:],activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2), data_format="channels_first"))

    model.add(Conv2D(256, 3, padding='same',activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2), data_format="channels_first"))
    
    model.add(Conv2D(256, 3, padding='same',activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2), data_format="channels_first"))
    
    model.add(Conv2D(256, 3, padding='same',activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2), data_format="channels_first"))
    

    model.add(Flatten())
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))

    model.add(Dense(2))
    model.add(Activation('softmax'))
    
    print("Compiling model...")
    model.compile(loss=objective, optimizer=optimizer, metrics=['accuracy'])
    return model

print("Creating model:")
model = classifier()

这是主循环

from keras.models import Sequential
from keras.layers import Input, Dropout, Flatten, Conv2D, MaxPooling2D, Dense, Activation
from keras.optimizers import RMSprop
from keras.callbacks import ModelCheckpoint, Callback, EarlyStopping
from keras.utils import np_utils

epochs = 5000
batch_size = 16

class LossHistory(Callback):
    def on_train_begin(self, logs={}):
        self.losses = []
        self.val_losses = []
        
    def on_epoch_end(self, batch, logs={}):
        self.losses.append(logs.get('loss'))
        self.val_losses.append(logs.get('val_loss'))

early_stopping = EarlyStopping(monitor='val_loss', patience=4, verbose=1, mode='min')        
       

def run():
    
    history = LossHistory()
    print("running model...")
    model.fit(train, labels, batch_size=batch_size, epochs=epochs,
              validation_split=0.10, verbose=2, shuffle=True, callbacks=[history, early_stopping])
    
    print("making predictions on test set...")
    predictions = model.predict(test, verbose=0)
    return predictions, history

predictions, history = run()

loss = history.losses
val_loss = history.val_losses

这是输入标签的一个示例:

array([[1, 0],
       [0, 1],
       [1, 0],
       ..., 
       [0, 1],
       [0, 1],
       [0, 1]])

PS:不要担心输入格式,因为使用相同的输入它适用于二进制分类器。

【问题讨论】:

  • 降低 dropout 层的掉率,例如 0.2。 0.5 是一个很大的数字,因为你正在丢弃一半的神经元。
  • 嘿@Mitiku,谢谢。改掉dropout之后,就开始学习了。谢谢:D
  • 嘿@Mitiku,我忘记了它的标记。谢谢提醒。

标签: python python-3.x tensorflow keras deep-learning


【解决方案1】:

dropout 层的rate 参数太大。 Dropout 层被用作深度学习神经网络的正则化技术,并克服过拟合。您的 rate 参数指定在训练时从前一层的激活下降多少百分比。 0.5 rate 表示放弃前一层激活的 50%。尽管有时rate 的这一大比例参数是可行的,但有时它会阻碍神经网络的学习率。所以你在选择dropout层的rate参数时要小心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 2018-06-10
    • 2019-12-07
    • 2018-12-02
    • 2019-01-19
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    相关资源
    最近更新 更多