модель keras не способна обобщать

Можете ли вы помочь мне найти, что не так с моей моделью keras, потому что она переоснащается со второй эпохи. следующий код:

import random
import pandas as pd
import tensorflow as tf
import numpy
from sklearn.preprocessing import LabelEncoder
from tensorflow.keras import backend as K
import glob, os
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import Normalizer


class CustomSaver(tf.keras.callbacks.Callback):
   def on_epoch_end(self, epoch, logs={}):
          if((epoch % 50)== 0 ):
            model_json = self.model.to_json()
            with open("model_{}.json".format(epoch), "w") as json_file:
                json_file.write(model_json)
            self.model.save_weights("model_weights_{}.h5".format(epoch))
            self.model.save("model_{}.h5".format(epoch))
            print("Saved model to disk")


model= tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=806, activation='relu',input_shape= (100,),activity_regularizer=tf.keras.regularizers.l1(0.01))) #50
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Dense(units=806, activation='relu',activity_regularizer=tf.keras.regularizers.l1(0.01))) #50
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Dense(units=806, activation='relu',activity_regularizer=tf.keras.regularizers.l1(0.01))) #50
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Dense(units=14879, activation='softmax')) 


optm = tf.keras.optimizers.Adam(learning_rate=0.0001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(optimizer=optm,loss='categorical_crossentropy', metrics=['accuracy',tf.keras.metrics.Precision(),tf.keras.metrics.Recall()])
saver = CustomSaver()


encoder = LabelEncoder()
ds = pd.read_csv("all_labels.csv")
y = ds.iloc[:,0].values
encoder.fit(y)

dataset_val = pd.read_csv('validation_dataset.csv')
X_val = dataset_val.iloc[:,1:101].values
y_val = dataset_val.iloc[:,0].values
order = list(range(0,len(y_val)))
random.shuffle(order)
X_val = X_val[order,:]
y_val = y_val[order]

encoded_Y=encoder.transform(y_val)
y_val = tf.keras.utils.to_categorical(encoded_Y,14879)
X_val = X_val.astype('float32')


chunksize = 401999



co = 1
for dataset in pd.read_csv("training_dataset.csv", chunksize=chunksize):
  if(co<38):
    epoc = 100 #10
  else: 
    epoc = 1000 #1000
  print(co)
  X = dataset.iloc[:,1:101].values
  y = dataset.iloc[:,0].values
  order =list(range(0,len(y)))
  random.shuffle(order)
  X = X[order,:]
  y = y[order]


  encoded_Y=encoder.transform(y)
  y = tf.keras.utils.to_categorical(encoded_Y,14879)
  X = X.astype('float32')

  model.fit(X,y,validation_data=(X_val,y_val),callbacks=[saver],batch_size=10000,epochs=epoc,verbose=1)  #epochs=20
  co += 1

Я зациклился на обучающем наборе данных, используя фрагменты из-за огромного количества меток (401999, 14897), to_categorical возвращает нехватку памяти.

Файл, содержащий все ярлыки: all_labels.csv (https://drive.google.com/file/d/1UZvBTT9ZTM40fA5qJ8gdhmj-k6-SkpwS/view?usp=sharing).
Файл, содержащий все наборы обучающих данных: training_dataset.csv (https://drive.google.com/file/d/1LwRBytg44_x62lfLkx9iKTbEhA5IsJM1/view?usp=sharing).
Этот файл содержит набор данных проверки: validation_dataset.csv (https://drive.google.com/open?id=1LZI2f-VGU3werjPIHUmdw0X_Q9nBAgXN)

Форма обучающего набора данных перед передачей в цикл фрагментов:
X.shape = (14878999, 100)
Y.shape = (14878999,)


person midou    schedule 25.02.2020    source источник
comment
Это кажется довольно чрезмерным размером партии. Каковы ваши данные? Сколько образцов у вас есть? Какую проблему ты пытаешься решить? Пожалуйста, предоставьте больше информации, просто по этому коду никто не может сказать, в чем может быть проблема.   -  person Nopileos    schedule 25.02.2020
comment
@Nopileos Извините, мне потребовалось некоторое время, чтобы загрузить тренировочный CSV-файл (30 ГБ). Я добавил больше деталей.   -  person midou    schedule 25.02.2020


Ответы (2)


Ваша проблема связана с вашими данными:

  • Вы пытаетесь вывести 14 879 значений из ввода формы (batch_size, 100), ваша сеть не может что-то узнать из ваших данных.
  • Как сказал @Nopileos, размер партии в 10 000 слишком велик, я не думаю, что у вас есть сотни миллионов входных данных, поэтому рассмотрите возможность использования размера партии более разумно!

Добавьте форму входов/меток и то, что ей соответствует, если вы хотите, чтобы мы помогли вам дать некоторую интуицию!

person Thibault Bacqueyrisses    schedule 25.02.2020
comment
Извините, мне потребовалось некоторое время, чтобы загрузить тренировочный CSV-файл (30 ГБ). Я добавил более подробную информацию о проблеме - person midou; 25.02.2020

Если вам не хватает памяти, уменьшите размер фрагмента. Снизьте его до 10 и посмотрите, сработает ли это. Больший размер фрагмента означает, что ваш компьютер должен одновременно хранить больше информации в оперативной памяти.

person Tdoggo    schedule 28.02.2020
comment
Спасибо @Tdoggo за ваш ответ. Я решил проблему нехватки памяти, используя куски. Моя проблема сейчас в том, что моя модель переоснащается. - person midou; 28.02.2020
comment
Попробуйте поиграть с вашим параметром регуляризации: .regularizers.l1(0.01) Измените .01 на .1, а затем на 1, посмотрите, улучшит ли это результат. - person Tdoggo; 29.02.2020