Huấn luyện một mạng nơ-ron để phân biệt số chẵn và số lẻ


14

Câu hỏi: có thể đào tạo một NN để phân biệt giữa các số lẻ và số chẵn chỉ sử dụng làm đầu vào cho các số đó không?

Tôi có bộ dữ liệu sau:

Number Target
1      0
2      1
3      0
4      1
5      0
6      1
...   ...
99     0
100    1

Tôi đã đào tạo một NN với hai nơ-ron đầu vào (một là Số biến, một là nơ-ron thiên vị), chín nơ-ron ở lớp ẩn và một nơ-ron đầu ra sử dụng thuật toán di truyền rất đơn giản: ở mỗi epoch, hai bộ trọng số "chiến đấu " chống lại nhau; phiên bản có lỗi cao nhất sẽ thua và được thay thế bằng phiên bản sửa đổi của người chiến thắng.

Kịch bản dễ dàng giải quyết các vấn đề đơn giản như toán tử AND, OR và XOR nhưng bị kẹt trong khi cố gắng phân loại các số lẻ và chẵn. Ngay bây giờ, cách tốt nhất mà nó quản lý để làm là xác định 53 số trong số 100 và mất vài giờ. Cho dù tôi bình thường hóa hay không các đầu vào dường như không có sự khác biệt.

Nếu tôi muốn gian lận, tôi chỉ có thể xử lý trước dữ liệu và cung cấp% 2 cho NN làm đầu vào nhưng tôi không muốn làm điều đó; NN có thể tính gần đúng mọi hàm, kể cả toán tử modulo (tôi tin ). Tôi đang làm gì sai?


1
Có vẻ như bạn đang cố gắng xấp xỉ chức năng "mod" với mạng thần kinh. Đây là một trong những lớp vấn đề yêu thích của tôi - "khi nào thì đúng là gần đúng một con gà như một quả cầu". Mô hình phần tử hữu hạn là một nơi tuyệt vời cho nó. Khi hỏi điều này về mạng lưới thần kinh, tôi thích nghĩ về "cơ sở". Chúng ta biết câu trả lời chính xác chứa phép chia cho 2 và cắt ngắn trong khi mạng cổ điển là phép nhân vectơ và hàm sigmoid. NN được sử dụng tốt nhất để nội suy, không ngoại suy - vậy miền của bạn có bị giới hạn không?
EngrStudent - Phục hồi Monica

4
Tôi nghĩ rằng câu hỏi của bạn đi sâu hơn câu trả lời hiện đang được chấp nhận. Hãy xem xét khái quát sau: xây dựng một mạng lưới thần kinh (chỉ sử dụng các hoạt động có thể xảy ra trong não) để tính toán n mod k, trong đó n và k là đầu vào của nó. Tôi tự hỏi nếu điều này là có thể với một mạng lưới feedforward có kích thước cố định.
dùng66081

Câu trả lời:


7

Như với bất kỳ nhiệm vụ học máy nào, việc thể hiện đầu vào của bạn đóng một vai trò quan trọng trong việc bạn học và khái quát hóa tốt như thế nào.

Tôi nghĩ, vấn đề với biểu diễn là hàm (modulo) rất phi tuyến tính và không mượt mà trong biểu diễn đầu vào mà bạn đã chọn cho vấn đề này.

Tôi sẽ thử như sau:

  1. Hãy thử một thuật toán học tập tốt hơn (lan truyền ngược / giảm độ dốc và các biến thể của nó).

  2. Hãy thử biểu diễn các số trong nhị phân bằng độ chính xác độ dài cố định.

  3. Nếu đại diện đầu vào của bạn là số b-bit, tôi sẽ đảm bảo tập huấn luyện của bạn không thiên về số nhỏ hay lớn. Có các số đồng nhất và được chọn độc lập ngẫu nhiên trong phạm vi .[0,2b-1]

  4. Như bạn đã hoàn thành, sử dụng mạng nhiều lớp (trước tiên hãy thử 2 lớp: nghĩa là ẩn + đầu ra, trước khi sử dụng nhiều lớp hơn).

  5. Sử dụng một tập huấn luyện + kiểm tra riêng. Đừng đánh giá hiệu suất của bạn trên tập huấn luyện.


Tôi đã nghĩ rằng việc thực hiện một phép biến đổi trên các đầu vào như tính toán logarit tự nhiên có thể có giá trị.
EngrStudent - Phục hồi Monica

Nó có thể. Trong thực tế, biết câu trả lời ở đây (modulo 2 chỉ là bit cuối cùng), biểu diễn nhị phân của số nguyên sẽ hoạt động rất tốt. Chỉ cần kết nối bit cuối cùng của đầu vào với đầu ra. :) Sẽ rất thú vị khi xem liệu modulo (không phải là sức mạnh của 2) có hoạt động tốt với mạng lưới thần kinh hay không. Nó có thể không hoạt động tốt.
Tối đa

Xin chào @Vimal, cảm ơn bạn đã trả lời. Bạn có biết liệu đại diện cho các đầu vào trong nhị phân luôn luôn là một ý tưởng tốt hay nó chỉ là hữu ích trong trường hợp cụ thể này?
Edgar Derby

@AnnoysParrot - không có "đạn bạc". Không có đại diện tốt nhất phổ quát duy nhất bởi vì tốt nhất có thể có nghĩa là những thứ khác nhau và loại trừ lẫn nhau. Đại diện nhị phân là hữu ích trong trường hợp này, nhưng có rất nhiều nơi nó không. Xem xét học sâu về dữ liệu trực quan. Nếu bạn có một nơ ron đầu vào riêng cho mỗi bit đầu vào duy nhất, bạn sẽ cần khoảng 256 * 5,2 triệu đầu vào cho hình ảnh 5 Megapixel.
EngrStudent - Phục hồi Monica

2
Đồng ý với @EngrStudent tại đây. Rất nhiều kiến ​​thức trước đây đi vào việc thiết kế một đại diện đầu vào phù hợp và cả cấu trúc liên kết mạng thần kinh. Do mạng nơ-ron gần như liên tục, tương đương với mạch kỹ thuật số, bạn có thể điều chỉnh cấu trúc liên kết của mạng bằng cách lấy cảm hứng từ các mạch kỹ thuật số để cộng / nhân / chia / modulo / v.v. Điều này trước khi cấu trúc liên kết (thay vì một lớp được kết nối đầy đủ) có thể dẫn đến đào tạo nhanh hơn, khái quát hóa tốt hơn, v.v., giống như cách convnets hoạt động tốt cho hình ảnh tự nhiên.
Tối đa

6

Học cách phân loại số lẻ và số chẵn là một vấn đề khó khăn. Một mô hình đơn giản cứ lặp đi lặp lại vô tận. 2,4,6,8 ..... 1,3,5,7 .....

Các hàm kích hoạt phi tuyến như sin (x) và cos (x) hoạt động tương tự nhau. Do đó, nếu bạn thay đổi nơ-ron để thực hiện sin và cos thay vì các chức năng kích hoạt phổ biến như tanh hoặc relu, tôi đoán bạn có thể giải quyết vấn đề này khá dễ dàng bằng cách sử dụng một nơ-ron.

Các phép biến đổi tuyến tính luôn đi trước các phép biến đổi phi tuyến. Do đó, một nơron duy nhất sẽ kết thúc việc học sin (ax + b), với sự kết hợp đúng của a & b sẽ tạo ra 0 và 1 thay thế theo tần số mong muốn mà chúng ta muốn trong trường hợp này là 1.

Tôi chưa bao giờ thử sin hoặc cos trong các mạng lưới thần kinh của tôi trước đây. Vì vậy, xin lỗi nếu nó kết thúc là một ý tưởng rất xấu.


5

Vì vậy, tôi đang làm việc với mạng lưới thần kinh ngay bây giờ và tôi gặp vấn đề tương tự như bạn. Điều cuối cùng tôi làm là biểu diễn số đầu vào dưới dạng một mảng với các giá trị bằng với biểu diễn nhị phân của số đó. Vì những gì chúng tôi đang làm là phân loại nên tôi biểu thị đầu ra của mình dưới dạng một mảng, không phải là một giá trị. Ví dụ:

input = [
  [0, 0, 0, 1], // 1
  [0, 0, 1, 0], // 2
  [0, 0, 1, 1], // 3
  [0, 1, 0, 0]  // 4
]
output = [
  [1, 0], // odd
  [0, 1], // even
  [1, 0], // odd
  [0, 1]  // even
]

Hi vọng điêu nay co ich!


1
Chính xác dựa trên câu trả lời của bạn tôi đã tạo ra mô hình ở đây stackoverflow.com/questions/53671491/...
prosti

Tuyệt vời! Điều này cho thấy cách biểu diễn dữ liệu là quan trọng đối với bất kỳ thuật toán ML nào. Khi tôi sử dụng biểu diễn thập phân, tôi có độ chính xác 50%, nhưng theo ý tưởng này, tôi có độ chính xác 100% ngay cả trên dữ liệu chưa xem. Cảm ơn. Đây là cách triển khai: colab.research.google.com/drive/ Lần
Kaushal28

2
Trong hệ nhị phân, số chẵn luôn kết thúc bằng 0 và số lẻ luôn kết thúc bằng 1. Không có gì đáng ngạc nhiên khi mô hình hoạt động, vì có khả năng nó chỉ học được cách nhổ giá trị của chữ số cuối cùng.
Syncrossus

2

Tôi đến đây, nơi đã đấu tranh với vấn đề tương tự. Vì vậy, tôi viết những gì tôi quản lý.

Theo như tôi biết thì một lớp tri giác có thể giải quyết mọi vấn đề, cuối cùng có thể đơn giản hóa để phân chia các đối tượng trong bất kỳ hình học nào bằng cách sử dụng đường thẳng. Và đây là loại vấn đề. Nếu bạn vẽ bit cuối cùng của biểu diễn nhị phân trên giấy, bạn cũng có thể vẽ đường thẳng và tất cả các số lẻ nằm ở một bên và thậm chí ở mặt khác. Vì lý do tương tự, không thể giải quyết vấn đề xor với mạng một lớp.

Đồng ý. Vấn đề này có vẻ rất đơn giản, vì vậy hãy thực hiện bước Heaviside làm chức năng kích hoạt. Sau khi tôi chơi một chút với số của mình, tôi nhận ra rằng vấn đề ở đây là sự thiên vị. Tôi google một chút, và những gì tôi tìm thấy là nếu bạn ở lại với biểu diễn hình học, xu hướng cho phép bạn thay đổi vị trí kích hoạt trong hệ tọa độ.

Vấn đề rất giáo dục


1

Người ta biết rằng các cổng logic KHÔNG, VÀ, HOẶC đều có thể được thực hiện với các mạng thần kinh rất đơn giản (NN) và bạn có thể xây dựng một máy tính số học hoàn chỉnh với các cổng logic sử dụng số nhị phân làm đầu vào. Do đó, bạn có thể tạo NN để tính n modulo k, với mọi số n và k được biểu thị trong cơ sở 2.

Nếu bạn muốn tính n modulo k cho một số k cố định (ví dụ k = 4), bạn thực sự có thể tạo một NN cực kỳ đơn giản thực hiện điều đó: thể hiện số đầu vào n trong cơ sở k và bỏ qua tất cả các chữ số khác với thứ hạng thấp nhất chữ số, và bạn có câu trả lời!


0

Một ý tưởng trốn tránh việc sử dụng "mod 2" rõ ràng trong đầu vào có thể là mã hóa số đó dưới dạng một chuỗi pixel, sau đó vấn đề sẽ nhận ra nếu phân đoạn có thể được chia thành hai phân đoạn bằng nhau. Đây là một vấn đề về thị giác máy và có thể được học bởi các mạng thông thường.

Ở một thái cực khác, nếu số được lưu dưới dạng float, câu hỏi sẽ giảm (hoặc khái quát hóa) để nhận biết khi nào số float xấp xỉ một số nguyên.


Suy nghĩ thú vị. Bạn có thể giải thích làm thế nào bạn muốn mã hóa số thành pixel?
Jan Kukacka

tốt, hãy nghĩ "cơ sở 1". Để mã hóa n, vẽ một thanh màu đen có n pixel. Tôi đoán là các hạt tích chập sẽ nhận thấy sự khác biệt giữa số pixel lẻ và số chẵn.
arivero

0

Tôi đã tạo ra một mạng lưới như vậy ở đây .

Đại diện @William Gottschalk đã đưa ra là nền tảng.

Nó chỉ sử dụng 1 nơ ron trong lớp ẩn đầu tiên với 32 đầu vào. Lớp đầu ra chỉ có 2 nơ-ron cho mã hóa một nóng là 0 và 1.


0

Giải pháp của tôi

import numpy as np


def layer_1_z(x, w1, b1):
    return 1 / w1 * x + b1


def layer_2(x, w1, b1, w2, b2):
    y1 = layer_1_z(x, w1, b1)
    y2 = y1 - np.floor(y1)
    return w2 * y2 + b2


def layer_2_activation(x, w1, b1, w2, b2):
    y2 = layer_2(x, w1, b1, w2, b2)
    # return 1 / (1 + np.exp(-y2))
    return (y2 > 0) * 1


def loss(param):
    w1, b1, w2, b2 = param
    x = np.arange(0, 1000, 1)
    y_hat = layer_2_activation(x, w1, b1, w2, b2)
    y_true = (x % 2 > 0) * 1
    return sum(np.square(y_hat - y_true))


# %%

from sko.GA import GA

ga = GA(func=loss, n_dim=4, size_pop=50, max_iter=100, lb=[1, 0, 1, 0], ub=[32, 1, 2, 1], precision=1)
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

for x in range(1001, 1200):
    y_hat = layer_2_activation(x, *best_x)
    print('input:{},divide by 2:{}'.format(x, y_hat == 0))

đầu vào: 1001, chia cho 2: Nhập sai: 1002, chia cho 2: Nhập đúng: 1003, chia cho 2: Nhập sai: 1004, chia cho 2: Nhập đúng: 1005, chia cho 2: Nhập sai: 1006, chia cho 2: Nhập đúng: 1007, chia cho 2: Nhập sai: 1008, chia cho 2: Nhập đúng: 1009, chia cho 2: Nhập sai: 1010, chia cho 2: Nhập đúng: 1011, chia cho 2: Nhập sai : 1012, chia cho 2: Nhập đúng: 1013, chia cho 2: Nhập sai: 1014, chia cho 2: Nhập đúng: 1015, chia cho 2: Nhập sai: 1016, chia cho 2: Nhập đúng: 1017, chia cho 2: Nhập sai: 1018, chia cho 2: Nhập đúng: 1019, chia cho 2: Nhập sai: 1020, chia cho 2: Nhập đúng: 1021, chia cho 2: Nhập sai: 1022, chia cho 2: Nhập đúng: 1023, chia cho 2: Nhập sai: 1024, chia cho 2: Nhập đúng: 1025, chia cho 2: Nhập sai: 1026, chia cho 2: Nhập đúng: 1027, chia cho 2: Nhập sai: 1028, chia cho 2 : Nhập đúng: 1029, chia cho 2:Đầu vào sai: 1030, chia cho 2: Đầu vào đúng: 1031, chia cho 2: Đầu vào sai: 1032, chia cho 2: Đầu vào đúng: 1033, chia cho 2: Đầu vào sai: 1034, chia cho 2: Đầu vào đúng: 1035, chia cho 2: Nhập sai: 1036, chia cho 2: Nhập đúng: 1037, chia cho 2: Nhập sai: 1038, chia cho 2: Nhập đúng: 1039, chia cho 2: Nhập sai: 1040, chia cho 2: Đúng đầu vào: 1041, chia cho 2: Nhập sai: 1042, chia cho 2: Nhập đúng: 1043, chia cho 2: Nhập sai: 1044, chia cho 2: Nhập đúng: 1045, chia cho 2: Nhập sai: 1046, chia cho 2: Nhập đúng: 1047, chia cho 2: Nhập sai: 1048, chia cho 2: Nhập đúng: 1049, chia cho 2: Nhập sai: 1050, chia cho 2: Nhập đúng: 1051, chia cho 2: Nhập sai : 1052, chia cho 2: Nhập đúng: 1053, chia cho 2: Nhập sai: 1054, chia cho 2: Nhập đúng: 1055, chia cho 2: Nhập sai: 1056, chia cho 2: Nhập đúng: 1057, chia cho 2: Nhập sai: 1058, chia cho 2:Đầu vào đúng: 1059, chia cho 2: Đầu vào sai: 1060, chia cho 2: Đầu vào đúng: 1061, chia cho 2: Đầu vào sai: 1062, chia cho 2: Đầu vào đúng: 1063, chia cho 2: Đầu vào sai: 1064, chia cho 2: Nhập đúng: 1065, chia cho 2: Nhập sai: 1066, chia cho 2: Nhập đúng: 1067, chia cho 2: Nhập sai: 1068, chia cho 2: Nhập đúng: 1069, chia cho 2: Sai đầu vào: 1070, chia cho 2: Đầu vào đúng: 1071, chia cho 2: Đầu vào sai: 1072, chia cho 2: Đầu vào đúng: 1073, chia cho 2: Đầu vào sai: 1074, chia cho 2: Đầu vào đúng: 1075, chia cho 2: Nhập sai: 1076, chia cho 2: Nhập đúng: 1077, chia cho 2: Nhập sai: 1078, chia cho 2: Nhập đúng: 1079, chia cho 2: Nhập sai: 1080, chia cho 2: Nhập đúng : 1081, chia cho 2: Nhập sai: 1082, chia cho 2: Nhập đúng: 1083, chia cho 2: Nhập sai: 1084, chia cho 2: Nhập đúng: 1085, chia cho 2: Nhập sai: 1086, chia cho 2: Nhập đúng: 1087, chia cho 2:Nhập sai: 1088, chia cho 2: Nhập đúng: 1089, chia cho 2: Nhập sai: 1090, chia cho 2: Nhập đúng: 1091, chia cho 2: Nhập sai: 1092, chia cho 2: Nhập đúng: 1093, chia cho 2: Nhập sai: 1094, chia cho 2: Nhập đúng: 1095, chia cho 2: Nhập sai: 1096, chia cho 2: Nhập đúng: 1097, chia cho 2: Nhập sai: 1098, chia cho 2: Đúng đầu vào: 1099, chia cho 2: Nhập sai: 1100, chia cho 2: Nhập đúng: 1101, chia cho 2: Nhập sai: 1102, chia cho 2: Nhập đúng: 1103, chia cho 2: Nhập sai: 1104, chia cho 2: Đầu vào đúng: 1105, chia cho 2: Đầu vào sai: 1106, chia cho 2: Đầu vào đúng: 1107, chia cho 2: Đầu vào sai: 1108, chia cho 2: Đầu vào đúng: 1109, chia cho 2: Đầu vào sai : 1110, chia cho 2: Nhập đúng: 1111, chia cho 2: Nhập sai: 1112, chia cho 2: Nhập đúng: 1113, chia cho 2: Nhập sai: 1114, chia cho 2: Nhập đúng: 1115, chia cho 2: Nhập sai: 1116, chia cho 2:Đầu vào đúng: 1117, chia cho 2: Đầu vào sai: 1118, chia cho 2: Đầu vào đúng: 1119, chia cho 2: Đầu vào sai: 1120, chia cho 2: Đầu vào đúng: 1121, chia cho 2: Đầu vào sai: 1122, chia cho 2: Nhập đúng: 1123, chia cho 2: Nhập sai: 1124, chia cho 2: Nhập đúng: 1125, chia cho 2: Nhập sai: 1126, chia cho 2: Nhập đúng: 1127, chia cho 2: Sai đầu vào: 1128, chia cho 2: Đầu vào đúng: 1129, chia cho 2: Nhập sai: 1130, chia cho 2: Nhập đúng: 1131, chia cho 2: Nhập sai: 1132, chia cho 2: Nhập đúng: 1133, chia cho 2: Nhập sai: 1134, chia cho 2: Nhập đúng: 1135, chia cho 2: Nhập sai: 1136, chia cho 2: Nhập đúng: 1137, chia cho 2: Nhập sai: 1138, chia cho 2: Nhập đúng : 1139, chia cho 2: Nhập sai: 1140, chia cho 2: Nhập đúng: 1141, chia cho 2: Nhập sai: 1142, chia cho 2: Nhập đúng: 1143, chia cho 2: Nhập sai: 1144, chia cho 2: Nhập đúng: 1145, chia cho 2:Đầu vào sai: 1146, chia cho 2: Đầu vào đúng: 1147, chia cho 2: Đầu vào sai: 1148, chia cho 2: Đầu vào đúng: 1149, chia cho 2: Đầu vào sai: 1150, chia cho 2: Đầu vào đúng: 1151, chia cho 2: Nhập sai: 1152, chia cho 2: Nhập đúng: 1153, chia cho 2: Nhập sai: 1154, chia cho 2: Nhập đúng: 1155, chia cho 2: Nhập sai: 1156, chia cho 2: Đúng đầu vào: 1157, chia cho 2: Nhập sai: 1158, chia cho 2: Nhập đúng: 1159, chia cho 2: Nhập sai: 1160, chia cho 2: Nhập đúng: 1161, chia cho 2: Nhập sai: 1162, chia cho 2: Nhập đúng: 1163, chia cho 2: Nhập sai: 1164, chia cho 2: Nhập đúng: 1165, chia cho 2: Nhập sai: 1166, chia cho 2: Nhập đúng: 1167, chia cho 2: Nhập sai : 1168, chia cho 2: Nhập đúng: 1169, chia cho 2: Nhập sai: 1170, chia cho 2: Nhập đúng: 1171, chia cho 2: Nhập sai: 1172, chia cho 2: Nhập đúng: 1173, chia cho 2: Nhập sai: 1174, chia cho 2:Đầu vào đúng: 1175, chia cho 2: Đầu vào sai: 1176, chia cho 2: Đầu vào đúng: 1177, chia cho 2: Đầu vào sai: 1178, chia cho 2: Đầu vào đúng: 1179, chia cho 2: Đầu vào sai: 1180, chia cho 2: Nhập đúng: 1181, chia cho 2: Nhập sai: 1182, chia cho 2: Nhập đúng: 1183, chia cho 2: Nhập sai: 1184, chia cho 2: Nhập đúng: 1185, chia cho 2: Sai đầu vào: 1186, chia cho 2: Đầu vào đúng: 1187, chia cho 2: Nhập sai: 1188, chia cho 2: Nhập đúng: 1189, chia cho 2: Nhập sai: 1190, chia cho 2: Nhập đúng: 1191, chia cho 2: Nhập sai: 1192, chia cho 2: Nhập đúng: 1193, chia cho 2: Nhập sai: 1194, chia cho 2: Nhập đúng: 1195, chia cho 2: Nhập sai: 1196, chia cho 2: Nhập đúng : 1197, chia cho 2: Nhập sai: 1198, chia cho 2: Nhập đúng: 1199, chia cho 2: SaiĐầu vào đúng: 1179, chia cho 2: Đầu vào sai: 1180, chia cho 2: Đầu vào đúng: 1181, chia cho 2: Đầu vào sai: 1182, chia cho 2: Đầu vào đúng: 1183, chia cho 2: Đầu vào sai: 1184, chia cho 2: Nhập đúng: 1185, chia cho 2: Nhập sai: 1186, chia cho 2: Nhập đúng: 1187, chia cho 2: Nhập sai: 1188, chia cho 2: Nhập đúng: 1189, chia cho 2: Sai đầu vào: 1190, chia cho 2: Đầu vào đúng: 1191, chia cho 2: Nhập sai: 1192, chia cho 2: Nhập đúng: 1193, chia cho 2: Nhập sai: 1194, chia cho 2: Nhập đúng: 1195, chia cho 2: Nhập sai: 1196, chia cho 2: Nhập đúng: 1197, chia cho 2: Nhập sai: 1198, chia cho 2: Nhập đúng: 1199, chia cho 2: SaiĐầu vào đúng: 1179, chia cho 2: Đầu vào sai: 1180, chia cho 2: Đầu vào đúng: 1181, chia cho 2: Đầu vào sai: 1182, chia cho 2: Đầu vào đúng: 1183, chia cho 2: Đầu vào sai: 1184, chia cho 2: Nhập đúng: 1185, chia cho 2: Nhập sai: 1186, chia cho 2: Nhập đúng: 1187, chia cho 2: Nhập sai: 1188, chia cho 2: Nhập đúng: 1189, chia cho 2: Sai đầu vào: 1190, chia cho 2: Đầu vào đúng: 1191, chia cho 2: Nhập sai: 1192, chia cho 2: Nhập đúng: 1193, chia cho 2: Nhập sai: 1194, chia cho 2: Nhập đúng: 1195, chia cho 2: Nhập sai: 1196, chia cho 2: Nhập đúng: 1197, chia cho 2: Nhập sai: 1198, chia cho 2: Nhập đúng: 1199, chia cho 2: SaiĐầu vào đúng: 1187, chia cho 2: Nhập sai: 1188, chia cho 2: Nhập đúng: 1189, chia cho 2: Nhập sai: 1190, chia cho 2: Nhập đúng: 1191, chia cho 2: Nhập sai: 1192, chia cho 2: Nhập đúng: 1193, chia cho 2: Nhập sai: 1194, chia cho 2: Nhập đúng: 1195, chia cho 2: Nhập sai: 1196, chia cho 2: Nhập đúng: 1197, chia cho 2: Sai đầu vào: 1198, chia cho 2: Đầu vào đúng: 1199, chia cho 2: SaiĐầu vào đúng: 1187, chia cho 2: Nhập sai: 1188, chia cho 2: Nhập đúng: 1189, chia cho 2: Nhập sai: 1190, chia cho 2: Nhập đúng: 1191, chia cho 2: Nhập sai: 1192, chia cho 2: Nhập đúng: 1193, chia cho 2: Nhập sai: 1194, chia cho 2: Nhập đúng: 1195, chia cho 2: Nhập sai: 1196, chia cho 2: Nhập đúng: 1197, chia cho 2: Sai đầu vào: 1198, chia cho 2: Đầu vào đúng: 1199, chia cho 2: Sai


Hơn nữa, chia cho các số khác (giả sử, 7) cũng tốt:

import numpy as np


def layer_1_z(x, w1, b1):
    return 1 / w1 * x + b1


def layer_2(x, w1, b1, w2, b2):
    y1 = layer_1_z(x, w1, b1)
    y2 = y1 - np.floor(y1)
    return w2 * y2 + b2


def layer_2_activation(x, w1, b1, w2, b2):
    y2 = layer_2(x, w1, b1, w2, b2)
    # return 1 / (1 + np.exp(-y2))
    return (y2 > 0) * 1


def loss(param):
    w1, b1, w2, b2 = param
    x = np.arange(0, 1000, 1)
    y_hat = layer_2_activation(x, w1, b1, w2, b2)
    y_true = (x % 7 > 0) * 1
    return sum(np.square(y_hat - y_true))


# %%

from sko.GA import GA

ga = GA(func=loss, n_dim=4, size_pop=50, max_iter=100, lb=[1, 0, 1, 0], ub=[32, 1, 2, 1], precision=1)
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

for x in range(1001, 1200):
    y_hat = layer_2_activation(x, *best_x)
    print('input:{},divide by 7:{}'.format(x, y_hat == 0))

đầu vào: 1001, chia cho 7: Đầu vào đúng: 1002, chia cho 7: Nhập sai: 1003, chia cho 7: Nhập sai: 1004, chia cho 7: Nhập sai: 1005, chia cho 7: Nhập sai: 1006, chia cho 7: Nhập sai: 1007, chia cho 7: Nhập sai: 1008, chia cho 7: Nhập đúng: 1009, chia cho 7: Nhập sai: 1010, chia cho 7: Nhập sai: 1011, chia cho 7: Nhập sai : 1012, chia cho 7: Nhập sai: 1013, chia cho 7: Nhập sai: 1014, chia cho 7: Nhập sai: 1015, chia cho 7: Nhập đúng: 1016, chia cho 7: Nhập sai: 1017, chia cho 7: Nhập sai: 1018, chia cho 7: Nhập sai: 1019, chia cho 7: Nhập sai: 1020, chia cho 7: Nhập sai: 1021, chia cho 7: Nhập sai: 1022, chia cho 7: Nhập đúng: 1023, chia cho 7: Nhập sai: 1024, chia cho 7: Nhập sai: 1025, chia cho 7: Nhập sai: 1026, chia cho 7: Nhập sai: 1027, chia cho 7: Nhập sai: 1028, chia cho 7 : Nhập sai: 1029, chia cho 7:Đầu vào đúng: 1030, chia cho 7: Nhập sai: 1031, chia cho 7: Nhập sai: 1032, chia cho 7: Nhập sai: 1033, chia cho 7: Nhập sai: 1034, chia cho 7: Nhập sai: 1035, chia cho 7: Nhập sai: 1036, chia cho 7: Nhập đúng: 1037, chia cho 7: Nhập sai: 1038, chia cho 7: Nhập sai: 1039, chia cho 7: Nhập sai: 1040, chia cho 7: Sai đầu vào: 1041, chia cho 7: Nhập sai: 1042, chia cho 7: Nhập sai: 1043, chia cho 7: Nhập đúng: 1044, chia cho 7: Nhập sai: 1045, chia cho 7: Nhập sai: 1046, chia cho 7: Nhập sai: 1047, chia cho 7: Nhập sai: 1048, chia cho 7: Nhập sai: 1049, chia cho 7: Nhập sai: 1050, chia cho 7: Nhập đúng: 1051, chia cho 7: Nhập sai : 1052, chia cho 7: Nhập sai: 1053, chia cho 7: Nhập sai: 1054, chia cho 7: Nhập sai: 1055, chia cho 7: Nhập sai: 1056, chia cho 7: Nhập sai: 1057, chia cho 7: Nhập đúng: 1058,chia cho 7: Nhập sai: 1059, chia cho 7: Nhập sai: 1060, chia cho 7: Nhập sai: 1061, chia cho 7: Nhập sai: 1062, chia cho 7: Nhập sai: 1063, chia cho 7: Sai đầu vào: 1064, chia cho 7: Đầu vào đúng: 1065, chia cho 7: Nhập sai: 1066, chia cho 7: Nhập sai: 1067, chia cho 7: Nhập sai: 1068, chia cho 7: Nhập sai: 1069, chia cho 7: Nhập sai: 1070, chia cho 7: Nhập sai: 1071, chia cho 7: Nhập đúng: 1072, chia cho 7: Nhập sai: 1073, chia cho 7: Nhập sai: 1074, chia cho 7: Nhập sai : 1075, chia cho 7: Nhập sai: 1076, chia cho 7: Nhập sai: 1077, chia cho 7: Nhập sai: 1078, chia cho 7: Nhập đúng: 1079, chia cho 7: Nhập sai: 1080, chia cho 7: Nhập sai: 1081, chia cho 7: Nhập sai: 1082, chia cho 7: Nhập sai: 1083, chia cho 7: Nhập sai: 1084, chia cho 7: Nhập sai: 1085, chia cho 7: Nhập đúng: 1086, chia cho 7:Nhập sai: 1087, chia cho 7: Nhập sai: 1088, chia cho 7: Nhập sai: 1089, chia cho 7: Nhập sai: 1090, chia cho 7: Nhập sai: 1091, chia cho 7: Nhập sai: 1092, chia cho 7: Nhập đúng: 1093, chia cho 7: Nhập sai: 1094, chia cho 7: Nhập sai: 1095, chia cho 7: Nhập sai: 1096, chia cho 7: Nhập sai: 1097, chia cho 7: Sai đầu vào: 1098, chia cho 7: Nhập sai: 1099, chia cho 7: Nhập đúng: 1100, chia cho 7: Nhập sai: 1101, chia cho 7: Nhập sai: 1102, chia cho 7: Nhập sai: 1103, chia cho 7: Nhập sai: 1104, chia cho 7: Nhập sai: 1105, chia cho 7: Nhập sai: 1106, chia cho 7: Nhập đúng: 1107, chia cho 7: Nhập sai: 1108, chia cho 7: Nhập sai : 1109, chia cho 7: Nhập sai: 1110, chia cho 7: Nhập sai: 1111, chia cho 7: Nhập sai: 1112, chia cho 7: Nhập sai: 1113, chia cho 7: Nhập đúng: 1114, chia cho 7: Nhập sai: 1115,chia cho 7: Nhập sai: 1116, chia cho 7: Nhập sai: 1117, chia cho 7: Nhập sai: 1118, chia cho 7: Nhập sai: 1119, chia cho 7: Nhập sai: 1120, chia cho 7: Đúng đầu vào: 1121, chia cho 7: Nhập sai: 1122, chia cho 7: Nhập sai: 1123, chia cho 7: Nhập sai: 1124, chia cho 7: Nhập sai: 1125, chia cho 7: Nhập sai: 1126, chia cho 7: Nhập sai: 1127, chia cho 7: Nhập đúng: 1128, chia cho 7: Nhập sai: 1129, chia cho 7: Nhập sai: 1130, chia cho 7: Nhập sai: 1131, chia cho 7: Nhập sai : 1132, chia cho 7: Nhập sai: 1133, chia cho 7: Nhập sai: 1134, chia cho 7: Nhập đúng: 1135, chia cho 7: Nhập sai: 1136, chia cho 7: Nhập sai: 1137, chia cho 7: Nhập sai: 1138, chia cho 7: Nhập sai: 1139, chia cho 7: Nhập sai: 1140, chia cho 7: Nhập sai: 1141, chia cho 7: Nhập đúng: 1142, chia cho 7: Nhập sai: 1143, chia cho 7: Nhập sai:1144, chia cho 7: Nhập sai: 1145, chia cho 7: Nhập sai: 1146, chia cho 7: Nhập sai: 1147, chia cho 7: Nhập sai: 1148, chia cho 7: Nhập đúng: 1149, chia cho 7 : Nhập sai: 1150, chia cho 7: Nhập sai: 1151, chia cho 7: Nhập sai: 1152, chia cho 7: Nhập sai: 1153, chia cho 7: Nhập sai: 1154, chia cho 7: Nhập sai: 1155 , chia cho 7: Nhập đúng: 1156, chia cho 7: Nhập sai: 1157, chia cho 7: Nhập sai: 1158, chia cho 7: Nhập sai: 1159, chia cho 7: Nhập sai: 1160, chia cho 7: Nhập sai: 1161, chia cho 7: Nhập sai: 1162, chia cho 7: Nhập đúng: 1163, chia cho 7: Nhập sai: 1164, chia cho 7: Nhập sai: 1165, chia cho 7: Nhập sai: 1166, chia cho 7: Nhập sai: 1167, chia cho 7: Nhập sai: 1168, chia cho 7: Nhập sai: 1169, chia cho 7: Nhập đúng: 1170, chia cho 7: Nhập sai: 1171, chia cho 7: Sai đầu vào: 1172, chia cho 7:Đầu vào sai: 1173, chia cho 7: Nhập sai: 1174, chia cho 7: Nhập sai: 1175, chia cho 7: Nhập sai: 1176, chia cho 7: Nhập đúng: 1177, chia cho 7: Nhập sai: 1178, chia cho 7: Nhập sai: 1179, chia cho 7: Nhập sai: 1180, chia cho 7: Nhập sai: 1181, chia cho 7: Nhập sai: 1182, chia cho 7: Nhập sai: 1183, chia cho 7: Đúng đầu vào: 1184, chia cho 7: Nhập sai: 1185, chia cho 7: Nhập sai: 1186, chia cho 7: Nhập sai: 1187, chia cho 7: Nhập sai: 1188, chia cho 7: Nhập sai: 1189, chia cho 7: Nhập sai: 1190, chia cho 7: Nhập đúng: 1191, chia cho 7: Nhập sai: 1192, chia cho 7: Nhập sai: 1193, chia cho 7: Nhập sai: 1194, chia cho 7: Nhập sai : 1195, chia cho 7: Nhập sai: 1196, chia cho 7: Nhập sai: 1197, chia cho 7: Nhập đúng: 1198, chia cho 7: Nhập sai: 1199, chia cho 7: Saichia cho 7: Nhập sai: 1175, chia cho 7: Nhập sai: 1176, chia cho 7: Nhập đúng: 1177, chia cho 7: Nhập sai: 1178, chia cho 7: Nhập sai: 1179, chia cho 7: Sai đầu vào: 1180, chia cho 7: Nhập sai: 1181, chia cho 7: Nhập sai: 1182, chia cho 7: Nhập sai: 1183, chia cho 7: Nhập đúng: 1184, chia cho 7: Nhập sai: 1185, chia cho 7: Nhập sai: 1186, chia cho 7: Nhập sai: 1187, chia cho 7: Nhập sai: 1188, chia cho 7: Nhập sai: 1189, chia cho 7: Nhập sai: 1190, chia cho 7: Nhập đúng : 1191, chia cho 7: Nhập sai: 1192, chia cho 7: Nhập sai: 1193, chia cho 7: Nhập sai: 1194, chia cho 7: Nhập sai: 1195, chia cho 7: Nhập sai: 1196, chia cho 7: Nhập sai: 1197, chia cho 7: Nhập đúng: 1198, chia cho 7: Nhập sai: 1199, chia cho 7: Saichia cho 7: Nhập sai: 1175, chia cho 7: Nhập sai: 1176, chia cho 7: Nhập đúng: 1177, chia cho 7: Nhập sai: 1178, chia cho 7: Nhập sai: 1179, chia cho 7: Sai đầu vào: 1180, chia cho 7: Nhập sai: 1181, chia cho 7: Nhập sai: 1182, chia cho 7: Nhập sai: 1183, chia cho 7: Nhập đúng: 1184, chia cho 7: Nhập sai: 1185, chia cho 7: Nhập sai: 1186, chia cho 7: Nhập sai: 1187, chia cho 7: Nhập sai: 1188, chia cho 7: Nhập sai: 1189, chia cho 7: Nhập sai: 1190, chia cho 7: Nhập đúng : 1191, chia cho 7: Nhập sai: 1192, chia cho 7: Nhập sai: 1193, chia cho 7: Nhập sai: 1194, chia cho 7: Nhập sai: 1195, chia cho 7: Nhập sai: 1196, chia cho 7: Nhập sai: 1197, chia cho 7: Nhập đúng: 1198, chia cho 7: Nhập sai: 1199, chia cho 7: SaiNhập sai: 1178, chia cho 7: Nhập sai: 1179, chia cho 7: Nhập sai: 1180, chia cho 7: Nhập sai: 1181, chia cho 7: Nhập sai: 1182, chia cho 7: Nhập sai: 1183, chia cho 7: Nhập đúng: 1184, chia cho 7: Nhập sai: 1185, chia cho 7: Nhập sai: 1186, chia cho 7: Nhập sai: 1187, chia cho 7: Nhập sai: 1188, chia cho 7: Sai đầu vào: 1189, chia cho 7: Nhập sai: 1190, chia cho 7: Nhập đúng: 1191, chia cho 7: Nhập sai: 1192, chia cho 7: Nhập sai: 1193, chia cho 7: Nhập sai: 1194, chia cho 7: Nhập sai: 1195, chia cho 7: Nhập sai: 1196, chia cho 7: Nhập sai: 1197, chia cho 7: Nhập đúng: 1198, chia cho 7: Nhập sai: 1199, chia cho 7: SaiNhập sai: 1178, chia cho 7: Nhập sai: 1179, chia cho 7: Nhập sai: 1180, chia cho 7: Nhập sai: 1181, chia cho 7: Nhập sai: 1182, chia cho 7: Nhập sai: 1183, chia cho 7: Nhập đúng: 1184, chia cho 7: Nhập sai: 1185, chia cho 7: Nhập sai: 1186, chia cho 7: Nhập sai: 1187, chia cho 7: Nhập sai: 1188, chia cho 7: Sai đầu vào: 1189, chia cho 7: Nhập sai: 1190, chia cho 7: Nhập đúng: 1191, chia cho 7: Nhập sai: 1192, chia cho 7: Nhập sai: 1193, chia cho 7: Nhập sai: 1194, chia cho 7: Nhập sai: 1195, chia cho 7: Nhập sai: 1196, chia cho 7: Nhập sai: 1197, chia cho 7: Nhập đúng: 1198, chia cho 7: Nhập sai: 1199, chia cho 7: Saichia cho 7: Nhập sai: 1185, chia cho 7: Nhập sai: 1186, chia cho 7: Nhập sai: 1187, chia cho 7: Nhập sai: 1188, chia cho 7: Nhập sai: 1189, chia cho 7: Sai đầu vào: 1190, chia cho 7: Đầu vào đúng: 1191, chia cho 7: Nhập sai: 1192, chia cho 7: Nhập sai: 1193, chia cho 7: Nhập sai: 1194, chia cho 7: Nhập sai: 1195, chia cho 7: Nhập sai: 1196, chia cho 7: Nhập sai: 1197, chia cho 7: Nhập đúng: 1198, chia cho 7: Nhập sai: 1199, chia cho 7: Saichia cho 7: Nhập sai: 1185, chia cho 7: Nhập sai: 1186, chia cho 7: Nhập sai: 1187, chia cho 7: Nhập sai: 1188, chia cho 7: Nhập sai: 1189, chia cho 7: Sai đầu vào: 1190, chia cho 7: Đầu vào đúng: 1191, chia cho 7: Nhập sai: 1192, chia cho 7: Nhập sai: 1193, chia cho 7: Nhập sai: 1194, chia cho 7: Nhập sai: 1195, chia cho 7: Nhập sai: 1196, chia cho 7: Nhập sai: 1197, chia cho 7: Nhập đúng: 1198, chia cho 7: Nhập sai: 1199, chia cho 7: Saichia cho 7: Đầu vào đúng: 1198, chia cho 7: Đầu vào sai: 1199, chia cho 7: Saichia cho 7: Đầu vào đúng: 1198, chia cho 7: Đầu vào sai: 1199, chia cho 7: Sai


Giải trình:

Tôi nhận được 2 giải pháp khác nhau. Cả hai đều tốt:
1. sin là kích hoạt
2. sàn (hoặc int) là kích hoạt

Không thể tìm thấy các trọng số tốt nhất bằng cách sử dụng độ dốc và tôi sử dụng thuật toán di truyền (từ scikit-opt )


Xin chào Man, chào mừng bạn đến CV và cảm ơn bạn đã trả lời chi tiết của bạn. Bạn có thể vui lòng thêm một số giải thích cho mã bạn đã viết?
Ferdi

Tôi nhận được 2 giải pháp tốt, xem tại đây , 1. sin là kích hoạt 2. tầng (hoặc int) là kích hoạt
guofei9987
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.