2017-10-13 20 views
7

Như một thử nghiệm, tôi đang xây dựng một mô hình keras để ước lượng yếu tố quyết định của một ma trận. Tuy nhiên, khi tôi chạy nó mất đi xuống ở mọi kỷ nguyên và mất xác nhận đi lên! Ví dụ:Làm thế nào để ước lượng yếu tố quyết định với keras

8s - loss: 7573.9168 - val_loss: 21831.5428 
Epoch 21/50 
8s - loss: 7345.0197 - val_loss: 23594.8540 
Epoch 22/50 
13s - loss: 7087.7454 - val_loss: 24718.3967 
Epoch 23/50 
7s - loss: 6851.8714 - val_loss: 25624.8609 
Epoch 24/50 
6s - loss: 6637.8168 - val_loss: 26616.7835 
Epoch 25/50 
7s - loss: 6446.8898 - val_loss: 28856.9654 
Epoch 26/50 
7s - loss: 6255.7414 - val_loss: 30122.7924 
Epoch 27/50 
7s - loss: 6054.5280 - val_loss: 32458.5306 
Epoch 28/50 

Đây là mã hoàn chỉnh:

import numpy as np 
import sys 
from scipy.stats import pearsonr 
from scipy.linalg import det 
from sklearn.model_selection import train_test_split 
from tqdm import tqdm 
from sklearn.preprocessing import StandardScaler 
from sklearn.pipeline import Pipeline 
import math 
import tensorflow as tf 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.wrappers.scikit_learn import KerasRegressor 
from keras import backend as K 

def baseline_model(): 
# create model 
     model = Sequential() 
     model.add(Dense(200, input_dim=n**2, kernel_initializer='normal', activation='relu')) 
     model.add(Dense(1, input_dim=n**2)) 
     #  model.add(Dense(1, kernel_initializer='normal')) 
     # Compile model 
     model.compile(loss='mean_squared_error', optimizer='adam') 
     return model 


n = 15 

print("Making the input data using seed 7", file=sys.stderr) 
np.random.seed(7) 
U = np.random.choice([0, 1], size=(n**2,n)) 
#U is a random orthogonal matrix 
X =[] 
Y =[] 
# print(U) 
for i in tqdm(range(100000)): 
     I = np.random.choice(n**2, size = n) 
     # Pick out the random rows and sort the rows of the matrix lexicographically. 
     A = U[I][np.lexsort(np.rot90(U[I]))] 
     X.append(A.ravel()) 
     Y.append(det(A)) 

X = np.array(X) 
Y = np.array(Y) 

print("Data created") 

estimators = [] 
estimators.append(('standardize', StandardScaler())) 
estimators.append(('mlp', KerasRegressor(build_fn=baseline_model, epochs=50, batch_size=32, verbose=2))) 
pipeline = Pipeline(estimators) 
X_train, X_test, y_train, y_test = train_test_split(X, Y, 
                train_size=0.75, test_size=0.25) 
pipeline.fit(X_train, y_train, mlp__validation_split=0.3) 

Làm thế nào tôi có thể ngăn chặn nó overfitting rất tệ?


Cập nhật 1

tôi đã cố gắng bổ sung thêm các lớp và L_2 quy tắc. Tuy nhiên, nó làm cho ít hoặc không có sự khác biệt.

def baseline_model(): 
# create model 
     model = Sequential() 
     model.add(Dense(n**2, input_dim=n**2, kernel_initializer='glorot_normal', activation='relu')) 
     model.add(Dense(int((n**2)/2.0), kernel_initializer='glorot_normal', activation='relu', kernel_regularizer=regularizers.l2(0.01))) 
     model.add(Dense(int((n**2)/2.0), kernel_initializer='glorot_normal', activation='relu', kernel_regularizer=regularizers.l2(0.01))) 
     model.add(Dense(int((n**2)/2.0), kernel_initializer='glorot_normal', activation='relu', kernel_regularizer=regularizers.l2(0.01))) 
     model.add(Dense(1, kernel_initializer='glorot_normal')) 
     # Compile model 
     model.compile(loss='mean_squared_error', optimizer='adam') 
     return model 

tôi tăng số lượng kỷ nguyên đến 100 và nó kết thúc với:

19s - loss: 788.9504 - val_loss: 18423.2807 
Epoch 97/100 
24s - loss: 760.2046 - val_loss: 18305.9273 
Epoch 98/100 
20s - loss: 806.0941 - val_loss: 18174.8706 
Epoch 99/100 
24s - loss: 780.0487 - val_loss: 18356.7482 
Epoch 100/100 
27s - loss: 749.2595 - val_loss: 18331.5859 

Có thể xấp xỉ yếu tố quyết định của một ma trận sử dụng keras?

+0

Điều này không phù hợp, mô hình của bạn không phù hợp với dữ liệu. Mô hình này quá đơn giản. –

+0

@MatiasValdenegro Lý do tôi gọi nó là overfitting là sự mất mát tiếp tục đi xuống hướng tới 0 và validation_loss tiếp tục xảy ra. Tăng số lượng các nút trong lớp ẩn không giúp gì cả. Bạn sẽ thử gì tiếp theo? – eleanora

+0

Tăng số lượng lớp ẩn. Khởi tạo các lớp ẩn bằng cách sử dụng 'glorot'. Sử dụng 'dropout' hoặc' l2 regularizer' – Nain

Trả lời

3

Tôi đã kiểm tra mã của bạn và nhận được kết quả tương tự. Nhưng chúng ta hãy đi vào sự hiểu biết cơ bản về yếu tố quyết định ma trận (DET). DET bao gồm n! sản phẩm, vì vậy bạn không thể thực sự gần đúng với trọng số n * n trong vài lớp mạng thần kinh. Điều này đòi hỏi số lượng trọng số sẽ không được chia tỷ lệ thành n = 15, kể từ 15! là 1307674368000 thuật ngữ cho phép nhân trong DET.

+0

Điều này không rõ ràng với tôi. DET có thể được tính trong n^3 thời gian của khóa học (không phải n!). Ngoài ra, nếu bạn chỉ chạy mô hình keras cho hàng trăm kỷ nguyên, sự mất mát trên tập huấn luyện sẽ giảm xuống gần 0. – eleanora

+0

Thực tế, đó là một công thức được xác định rõ chỉ mất 1 và -1 làm trọng số, nhưng liên quan đến rất nhiều các phép nhân của các đầu vào. Bạn không chắc chắn đó là một trường hợp tốt để thử các mạng nơron đơn giản. –

+0

@eleanora bạn đang nhầm lẫn số lượng các cụm từ với độ phức tạp tính toán. – denfromufa

Các vấn đề liên quan