[英]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.