繁体   English   中英

Keras 精度和损失在很长一段时间内没有变化

[英]Keras Accuracy and Loss not changing over a large period of epochs

我正在尝试创建一个卷积神经网络来分类某个“单词”来自什么语言。 有两个文件(“english_words.txt”和“spanish_words.txt”),每个文件包含大约 60,000 个单词。 我已将每个单词转换为 29 维向量,其中每个元素都是 0 到 1 之间的数字。我正在使用优化器“adam”对 model 进行 500 个 epoch 的训练。 但是,当我训练 model 时,损失趋于 hover 大约 0.7,准确率大约 0.5,无论我训练多长时间,这些指标都不会改善。 这是代码:

import keras
import numpy as np
from keras.layers import Dense
from keras.models import Sequential
import re

train_labels = []
train_data = []

with open("english_words.txt") as words:
    full_words = words.read()
    full_words = full_words.split("\n")

    # all of the labels are just 1.

    # we now need to encode them into 29 dimensional vectors. 
    vector = []
    i = 0
    for word in full_words:
        train_labels.append([1,0])
        for letter in word:
            vector.append((ord(letter) - 96) * (1.0 / 26.0))
            i += 1
        if (i < 29):
            for x in range(0, 29 - i):
                vector.append(0)
        train_data.append(vector)
        vector = []
        i = 0
with open("spanish_words.txt") as words:
    full_words = words.read()
    full_words = full_words.replace(' ', '')

    full_words = full_words.replace('\n', ',')
    full_words = full_words.split(",")
    vector = []
    for word in full_words:
        train_labels.append([0,1])
        for letter in word:
            vector.append((ord(letter) - 96) * (1.0 / 26.0))
            i += 1
        if (i < 29):
            for x in range(0, 29 - i):
                vector.append(0)
        train_data.append(vector)
        vector = []
        i = 0


def shuffle_in_unison(a, b):
    assert len(a) == len(b)
    shuffled_a = np.empty(a.shape, dtype=a.dtype)
    shuffled_b = np.empty(b.shape, dtype=b.dtype)
    permutation = np.random.permutation(len(a))
    for old_index, new_index in enumerate(permutation):
        shuffled_a[new_index] = a[old_index]
        shuffled_b[new_index] = b[old_index]
    return shuffled_a, shuffled_b



train_data = np.asarray(train_data, dtype=np.float32)
train_labels = np.asarray(train_labels, dtype=np.float32)



train_data, train_labels = shuffle_in_unison(train_data, train_labels)

print(train_data.shape, train_labels.shape)
model = Sequential()
model.add(Dense(29, input_shape=(29,)))
model.add(Dense(60))
model.add(Dense(40))
model.add(Dense(25))
model.add(Dense(2))

model.compile(optimizer="adam",
              loss="categorical_crossentropy",
              metrics=["accuracy"])
model.summary()

model.fit(train_data, train_labels, epochs=500, batch_size=128)

model.save("language_predictor.model")

For some extra info, I am running python 3.x with tensorflow 1.15 and keras 1.15 on windows x64.

我可以看到您的代码存在几个潜在问题。

  1. 您一个接一个地添加了几个Dense层,但您确实还需要包含一个非线性激活 function 参数activation=... 在没有任何非线性激活函数的情况下,所有那些完全连接的Dense层将在数学上崩溃成一个无法学习非线性决策边界的单个线性Dense层。

  2. 一般来说,如果你看到你的损失和准确性没有任何改善甚至变得更糟,那么首先要尝试的是降低你的学习率。

  3. 您不一定需要实现自己的改组 function。 如果使用shuffle=True参数,Keras fit() function 可以做到这一点。

除了stackoverflowuser2010提到的几点:

  1. 我觉得这是一本很好的读物,并强烈建议您检查上述几点: 37 为什么您的神经网络无法正常工作的原因

  2. 将您的输入数据居中:计算一个分量平均向量并从每个输入中减去它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM