2016-08-30 53 views
5

Tôi đã cố gắng triển khai mạng nơron chuyển tiếp.Mạng nơron Keras xuất kết quả tương tự cho mỗi đầu vào

Đây là cấu trúc: Lớp đầu vào: 8 nơron, lớp ẩn: 8 nơron và lớp đầu ra: 8 nơron.

Dữ liệu đầu vào là vectơ 8 bit (1 bit cho mỗi nơron của lớp đầu vào). Các đầu ra của mạng nơron cũng là các vectơ có 8 bit. Vì vậy, trong tổng số liệu có 256 ví dụ.

Ví dụ: nếu cho x = [0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0]

đầu ra phải được y = [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0]

này là việc thực hiện:

from keras.models import Sequential 
from keras.layers import Dense 
import numpy as np 
import random 
from math import ceil 

#Dimension of layers 
dim = 8 

#Generate dataset 
X = [] 
for i in range(0,2**dim): 
    n = [float(x) for x in bin(i)[2:]] 
    X.append([0.]*(dim-len(n))+n) 
y = X[:] 
random.shuffle(y) 
X = np.array(X) 
y = np.array(y) 

# create model 
model = Sequential() 
model.add(Dense(dim, input_dim=dim, init='normal', activation='sigmoid')) 
model.add(Dense(dim, init='normal', activation='sigmoid')) 
model.add(Dense(dim, init='normal', activation='sigmoid')) 

# Compile model 
model.compile(loss='mse', optimizer='SGD', metrics=['accuracy']) 
# Fit the model 
model.fit(X, y, nb_epoch=1000, batch_size=50, verbose=0) 
# evaluate the model 
scores = model.evaluate(X, y) 
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) 
output = model.predict(X) 

#Make the output binary 
for i in range(0, output[:,0].size): 
    for j in range(0, output[0].size): 
     if output[i][j] > 0.5 or output[i][j] == 0.5: 
      output[i][j] = 1 
     else: 
      output[i][j] = 0 
print(output) 

Đây là những gì tôi nhận được ở đầu ra:

acc: 50.39% 
[[ 1. 0. 0. ..., 0. 1. 1.] 
[ 1. 0. 0. ..., 0. 1. 1.] 
[ 1. 0. 0. ..., 0. 1. 1.] 
..., 
[ 1. 0. 0. ..., 0. 1. 1.] 
[ 1. 0. 0. ..., 0. 1. 1.] 
[ 1. 0. 0. ..., 0. 1. 1.]] 

dường như al Các đầu ra l có cùng giá trị. Vì vậy, tôi không biết có gì sai về cấu hình. Tôi đã thử điều này Cannot train a neural network in keras - stackoverflow gợi ý loại bỏ hàm kích hoạt ở lớp đầu ra nhưng khi tôi chạy điều này, tôi nhận được tất cả các vectơ đầu ra với giá trị này:

[0. 1. 1. ..., 1. 1. 1. ]

Mọi thông tin chi tiết về cách làm cho nó hoạt động?

+1

Bạn đã thử chạy lại lần này bao nhiêu lần?Có thể sử dụng trình tối ưu hóa khác nhau hoặc thuật toán ngẫu nhiên hóa/ngẫu nhiên hóa có thể hữu ích. Dường như mạng của bạn có thể bị kẹt trong các siêu thị nhỏ địa phương. –

+0

Tôi đã thử chạy lại 15 lần và nhận được kết quả tương tự. Tôi đã thử sử dụng "Adam" và thử sử dụng "relu" kích hoạt và nó imporved một chút, bây giờ tôi nhận được kết quả đầu ra khác nhau nhưng độ chính xác vẫn còn rất thấp (4 trong số 256 đầu ra chính xác). –

+0

Bạn đã cố gắng sử dụng ví dụ: rơi ra ngoài? Hoặc chuẩn hóa hàng loạt? –

Trả lời

5

Đầu ra là tương đối giống nhau để phân loại đa nhãn vì vậy tôi muốn giới thiệu:

  1. chức năng Change thiệt hại cho binary_crossentropy
  2. Giữ lại lớp kích hoạt cuối cùng như sigmoid và thay đổi những người khác - relu có thể là một tốt lựa chọn.
  3. Thêm xác nhận để bạn "phù hợp" gọi và tăng cấp chi tiết - Điều này sẽ cho phép bạn hiểu làm thế nào thay đổi mạng của bạn thông qua các thời kỳ và đặc biệt là khi nó trên/dưới phù hợp
  4. Thêm chiều sâu vào mạng cho đến khi bạn overfit
  5. Thêm quy tắc vào mạng của bạn cho đến khi bạn không overfit
  6. lặp lại 4 + 5
2

tôi đã có vấn đề rất giống nhau.

Tôi khuyên bạn nên giảm tỷ lệ học tập cho SGD. Trong trường hợp của tôi, tôi đã sử dụng Adam Optimizer với lr = 0,001, nhưng thay đổi thành 0,0001 đã giải quyết được vấn đề.

thông số mặc định cho SGD là:

SGD = SGD (lr = 0,01, sâu = 1e-6, đà = 0,9, Nesterov = True)

1

Nếu bạn đã thử tất cả các bên trên và nó không hoạt động có nghĩa là mà bạn cố gắng để phù hợp với tiếng ồn, không có kết nối/tương quan/sự liên quan giữa đầu vào và đầu ra của bạn.

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