繁体   English   中英

在keras训练中准确性不会改变,损失几乎不会减少

[英]Accuracy doesn't change over keras training, loss barely decreases

我正在尝试训练神经网络以使用keras在5 * 5网格上解决picross(aka nonogram)难题。 这意味着理想情况下,网络将针对每个训练案例进行多次正确激活。

我已经找到了一种随机生成训练数据并初始化神经网络的方法,但是在运行它时,网络的准确性永远不会改变,并且损失只会略有减少:

时代1/100 100000/100000 [=============================]-13s 133us / sample-损失:1.6282-acc :0.5001

时代2/100 100000/100000 [=============================]-13s 131us / sample-损失:1.6233-acc :0.5001

时代3/100 100000/100000 [=============================]-13秒132us / sample-损耗:1.6175-acc :0.5001

...

时代99/100 100000/100000 [=============================]-14s 136us / sample-损耗:1.4704-acc :0.5001

时代100/100 100000/100000 [=============================]-14s 136us / sample-损失:1.4696-acc :0.5001

我正在使用Jupyter笔记本运行它。

有人告诉我,使用“ binary_crossentropy”作为损失函数是解决该问题的理想选择,但是我不知道如何格式化此训练数据标签。 它应该是一和零的列表,还是数字的列表,还是数组...?

输出层是25个神经元,每个神经元对应5 * 5网格上的一个块。 它们将正确激活为1或0,具体取决于该块是否为空。

import random
import numpy as np
import tensorflow as tf
from keras.optimizers import SGD

network = tf.keras.models.Sequential()
network.add(tf.keras.layers.Flatten())
network.add(tf.keras.layers.Dense(750, activation=tf.nn.relu))
network.add(tf.keras.layers.Dense(500, activation=tf.nn.relu))
network.add(tf.keras.layers.Dense(100, activation=tf.nn.relu))
network.add(tf.keras.layers.Dense(25, activation=tf.nn.softmax))
network.compile(optimizer='SGD',
             loss='binary_crossentropy',
             metrics=['accuracy'])
network.fit(scaled_x_train, y_train, epochs=100, batch_size=50)

我预计精度会随着训练的进行而增加,即使只是一点点,但精度会停留在开始时的任何值,并且损失函数只会稍微减少一点。

编辑:提供给神经网络输入的数据是“提示”,按比例缩小为0到1之间的值。这是创建数据的代码:

import random
import numpy as np
from sklearn.preprocessing import MinMaxScaler

x_train = []
y_train = []

for m in range(100000):  #creating a data set with m items in it
    grid = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]
    hints = [[[],[],[],[],[]],[[],[],[],[],[]]]

    for i in range(5):
        for j in range(5):
            grid[i][j] = random.randint(0,1)   #All items in the grid are random, either 0s or 1s


    sub_y_train = []
    for z in range(5):
        for x in range(5):
            sub_y_train.append(grid[z][x])

    sub_y_train = np.array(sub_y_train)
    y_train.append(sub_y_train)         #the grids are added to the data set first



    ##figuring out the hints along the vertical axis
    for i in range(5):
        counter = 0
        for j in range(4):
            if grid[i][j] == 1:
                counter += 1
                if grid[i][j+1] == 0:
                    hints[0][i].append(counter)
                    counter = 0
        if grid[i][4] == 1:
            hints[0][i].append(counter+1)
            counter = 0


    ##figuring out the hints along the horizontal axis
    for i in range(5):
        counter = 0
        for j in range(4):
            if grid[j][i] == 1:
                counter += 1
                if grid[j+1][i] == 0:
                    hints[1][i].append(counter)
                    counter = 0
        if grid[4][i] == 1:
            hints[1][i].append(counter+1)
            counter = 0

    for i in range(2):
        for j in range(5):
            while len(hints[i][j]) != 3:
                hints[i][j].append(0)

    new_hints = []
    for i in range(2):
        for j in range(5):
            for k in range(3):
                new_hints.append(hints[i][j][k])

    new_hints.append(5)

    x_train.append(new_hints)    #Once the hints are created and formalized, they are added to x_train


x_train = np.array(x_train)      #Both x_train and y_train are converted into numpy arrays
y_train = np.array(y_train)



scaler = MinMaxScaler(feature_range=(0,1))
scaled_x_train = scaler.fit_transform((x_train))

for i in range(5):
    print(scaled_x_train[i])
    print(y_train[i])

Peteris是正确的,似乎在网络输出层上用“ Sigmoid”代替了“ softmax”激活功能,现在已经帮助精度稳步提高。 目前,该网络几乎达到了95%的稳定精度。 (非常感谢,我已经尝试了好几个星期了)

暂无
暂无

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

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