не увеличивается точность нейросети на тестовом наборе
точность на тренировочном наборе нормально увеличивается, а вот на тестовом никак, использовал dropout и l2 регуляризацию - не помогло. Также менял количество слоев и нейронов в каждом, не помогает. даных для обучения больше достать не получается.
набор даных можно скачать по ссылке: https://drive.google.com/file/d/1WrfFHJ7SfS-d9eRuiVvq_gSDSVNgcO1p/view?usp=sharing
ниже одна из многих вариаций которую я пробовал(максимально сократил, но она рабочая, и воспроизводит проблему)
import numpy as np
import h5py
import keras
import matplotlib.pyplot as plt
import random
import os
import tensorflow as tf
def load_data(name):
train_dataset = h5py.File('datasets/' + name + '.h5', "r")
train_x = np.array(train_dataset["train_x"][:])
train_y = np.array(train_dataset["train_y"][:])
train_y = train_y.reshape((1, train_y.shape[0]))
return train_x,train_y
def Normalize(train_x):
max = 0
for i in train_x:
for j in i:
if j > max:
max = j
train_x = train_x / max
return train_x
train_x,train_y = load_data('train_data')
train_x = Normalize(train_x)
train_x = train_x.reshape(train_x.shape[0],-1)
train_y = train_y.T
seed = 13
l2_k = 0.1
dropout_k = 0.3
np.random.seed(seed)
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
tf.random.set_seed(seed)
input = keras.layers.Input(shape = train_x.shape[1])
layer1 = keras.layers.Dropout(dropout_k,seed=seed)(keras.layers.Dense(1300,activation=keras.layers.LeakyReLU(0.1), kernel_initializer=keras.initializers.TruncatedNormal(seed=seed))(input))
layer2 = keras.layers.Dropout(dropout_k,seed=seed)(keras.layers.Dense(700,activation=keras.layers.LeakyReLU(0.1), kernel_initializer=keras.initializers.TruncatedNormal(seed=seed))(layer1))
layer3 = keras.layers.Dropout(dropout_k,seed=seed)(keras.layers.Dense(300,activation=keras.layers.LeakyReLU(0.1), kernel_initializer=keras.initializers.TruncatedNormal(seed=seed))(layer2))
layer4 = keras.layers.Dropout(dropout_k,seed=seed)(keras.layers.Dense(70,activation=keras.layers.LeakyReLU(0.1), kernel_initializer=keras.initializers.TruncatedNormal(seed=seed))(layer3))
output = keras.layers.Dropout(0,seed=seed)(keras.layers.Dense(1, activation='sigmoid', kernel_initializer=keras.initializers.TruncatedNormal(seed=seed))(layer4))
model = keras.Model(inputs=input, outputs=output)
model.compile(loss=keras.losses.BinaryCrossentropy(), optimizer=keras.optimizers.Adam(0.01), metrics=[keras.metrics.BinaryAccuracy()])
hist = model.fit(train_x, train_y, epochs=30,validation_split = 0.2, batch_size=256)
plt.plot(hist.history['binary_accuracy'], label = 'train accuracy')
plt.plot(hist.history['val_binary_accuracy'], label = 'test accuracy')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.legend()
plt.show()