Модель Керас не может обобщать - PullRequest
0 голосов
/ 25 февраля 2020

Можете ли вы помочь мне найти, что не так с моей моделью 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)

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

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

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

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

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

0 голосов
/ 28 февраля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...