Çift ve tek sayıları ayırt etmek için bir Sinir Ağı eğitin


14

Soru: Bir NN'yi yalnızca sayıların kendileri olarak girerek tek ve çift sayıları ayırt etmek üzere eğitmek mümkün müdür?

Aşağıdaki veri kümesi var:

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

İki giriş nöronu (biri değişken sayı, diğeri önyargı nöronu), gizli katmandaki dokuz nöron ve çok basit bir genetik algoritma kullanarak bir çıkış nöronu ile bir NN yetiştirdim: her çağda iki ağırlık seti "dövüşü "birbirlerine karşı; en yüksek hataya sahip olanı kaybeder ve yerini kazananın değiştirilmiş bir versiyonu alır.

Betik, AND, OR ve XOR operatörleri gibi basit sorunları kolayca çözer, ancak tek ve çift sayıları kategorilere ayırmaya çalışırken takılır. Şu anda yapmayı başardığı en iyi şey 100 üzerinden 53 rakamı tanımlamak ve birkaç saat sürdü. Girişleri normalleştirip düzenlememem fark etmiyor gibi görünüyor.

Hile yapmak istedim sadece veri önceden işlenmiş ve bir girdi olarak% 2 NN beslemek ama bunu yapmak istemiyorum; NN modülo operatörü (ben dahil her işlevi yaklaşmak gerekir inanıyoruz ). Neyi yanlış yapıyorum?


1
Bir sinir ağı ile "mod" fonksiyonuna yaklaşmaya çalıştığınız anlaşılıyor. Bu benim en sevdiğim problem sınıflarından biri - "bir tavuğu küreye yaklaştırmak ne zaman doğru". Sonlu eleman modelleri bunun için harika bir yerdir. Sinir ağını sorduğumda, "temel" olarak düşünmeyi seviyorum. Kesin cevabın 2'ye bölündüğünü ve klasik ağ vektör çarpma ve sigmoid fonksiyonlarken kesildiğini biliyoruz. NN'ler en iyi enterpolasyon için kullanılır, ekstrapolasyon için kullanılmaz.
EngrStudent

4
Bence sorunuz şu anda kabul edilen cevaptan daha derine iniyor. Aşağıdaki genelleştirmeyi düşünün: n mod k'yi hesaplayacak bir nöral ağ (sadece beyinde meydana gelmesi beklenen işlemleri kullanarak) oluşturun, burada n ve k girdileridir. Bunun sabit boyutlu bir ileri beslemeli ağ ile mümkün olup olmadığını merak ediyorum.
user66081

Yanıtlar:


7

Herhangi bir makine öğrenimi görevinde olduğu gibi, girdilerinizin temsili ne kadar iyi öğrendiğiniz ve genelleştirdiğinizde çok önemli bir rol oynar.

Bence temsil ile ilgili problem, fonksiyonun (modulo) oldukça doğrusal olmaması ve bu problem için seçtiğiniz giriş gösterimlerinde düzgün olmamasıdır.

Aşağıdakileri deneyeceğim:

  1. Daha iyi bir öğrenme algoritması deneyin (geri yayılma / gradyan inişi ve değişkenleri).

  2. Sayıları sabit uzunluklu kesinlik kullanarak ikili olarak göstermeyi deneyin.

  3. Giriş temsilciliğiniz bir b-bit sayı ise, eğitim setinizin küçük veya büyük sayılara karşı önyargısız olmasını sağlarım. Düzgün ve bağımsız olarak aralığından rastgele seçilen sayılara sahip olun .[0,2b1]

  4. Yaptığınız gibi, çok katmanlı bir ağ kullanın (daha fazla katman kullanmadan önce 2 katmanı deneyin: yani gizli + çıktı).

  5. Ayrı bir eğitim + test seti kullanın. Egzersiz setindeki performansınızı değerlendirmeyin.


Doğal logaritmayı hesaplamak gibi girdiler üzerinde dönüşüm yapmanın değerli olabileceğini düşünüyordum.
EngrStudent

Olabilir. Aslında, buradaki cevabı bilmek (modulo 2 sadece son bittir), ham sayının ikili gösterimi son derece iyi çalışır. Sadece girişin son bitini çıkışa bağlayın. :) Modulo'nun (2'nin gücü değil) bir sinir ağı ile iyi çalışıp çalışmadığını görmek ilginç olurdu. Bu da işe yaramayabilir.
Vimal

Merhaba @Vimal, cevap için teşekkür ederim. İkili dosyadaki girdileri temsil etmenin her zaman iyi bir fikir olup olmadığını ya da bu özel durumda işe yaradığını biliyor musunuz?
Edgar Derby

@AnnoysParrot - "gümüş mermi" yoktur. Tek bir evrensel en iyi temsil yoktur, çünkü en iyisi farklı ve birbirini dışlayan şeyler anlamına gelebilir. İkili gösterim bu durumda yararlıdır, ancak olmadığı yerlerde bol miktarda vardır. Görsel veriler üzerinde derin öğrenmeyi düşünün. Her benzersiz giriş biti için ayrı bir giriş nöronunuz varsa, 5 Megapiksel bir görüntü için yaklaşık 256 * 5,2 milyon girişe ihtiyacınız olacaktır.
EngrStudent

2
@EngrStudent ile anlaşın. Birçok ön bilgi, uygun bir girdi gösterimi ve ayrıca sinir ağı topolojisinin kendisinin tasarlanmasıyla ilgilidir. Bir sinir ağı kabaca bir dijital devrenin sürekli, ayırt edilebilir bir eşdeğeri olduğundan, toplama / çarpma / bölme / modulo / vb. İçin dijital devrelerden ilham alarak ağın topolojisini uyarlayabilirsiniz. Topolojiden önce (tamamen bağlı bir katman yerine), konvektörlerin doğal görüntüler için nasıl iyi çalıştığı gibi daha hızlı eğitim, daha iyi genelleme vb.
Vimal

6

Tek sayıları ve çift sayıları sınıflandırmayı öğrenmek zor bir sorundur. Basit bir desen sonsuza kadar tekrar eder. 2,4,6,8 ..... 1,3,5,7 .....

Sin (x) ve cos (x) gibi doğrusal olmayan aktivasyon fonksiyonları benzer şekilde davranır. Bu nedenle, nöronlarınızı tanh veya relu gibi popüler aktivasyon fonksiyonları yerine günah ve cos uygulamak için değiştirirseniz, sanırım bu sorunu tek bir nöron kullanarak oldukça kolay bir şekilde çözebilirsiniz.

Doğrusal dönüşümler her zaman doğrusal olmayan dönüşümlerden önce gelir. Bu nedenle, tek bir nöron, a & b'nin doğru kombinasyonu için 0'ları ve 1'leri alternatif olarak istediğimiz frekansta bu durumda 1 olan istediğimiz frekansta verecek olan günahı (ax + b) öğrenecektir.

Sinir ağlarımda daha önce günah veya koz denemedim. Yani, özür dilerse çok kötü bir fikir olur.


5

Bu yüzden şu anda sinir ağları ile çalışıyorum ve sizinle aynı sorunla karşılaştım. Yaptığım şey, giriş numarasını sayının ikili gösterimine eşit bir dizi olarak temsil etmekti. Yaptığımız şey sınıflandırmak olduğundan çıktımı tek bir değer olarak değil, bir dizi olarak temsil ettim. örn:

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
]

Bu yardımcı olur umarım!


1
Cevabınıza tam olarak modeli burada oluşturdum stackoverflow.com/questions/53671491/…
prosti

Süper! Bu, verilerin temsilinin herhangi bir ML algoritması için ne kadar önemli olduğunu gösterir. Ondalık gösterimi kullandığımda tam olarak% 50 doğruluk elde ettim, ancak bu fikri izleyerek görünmeyen verilerde bile% 100 doğruluk elde ettim. Teşekkürler. İşte uygulama: colab.research.google.com/drive/…
Kaushal28

2
İkili olarak, sayılar bile her zaman 0 ile ve tek sayılar her zaman 1 ile biter. Modelin çalışması şaşırtıcı değildir, çünkü son basamağın değerini tükürmeyi öğrenmesi muhtemeldir.
Syncrossus

2

Buraya benzer bir problemle mücadele edilen yere geldim. Bu yüzden yönettiğimi yazıyorum.

Bildiğim kadarıyla, bir katman algılayıcı her problemi çözebiliyor, bu da sonunda düz çizgi kullanarak herhangi bir geometrideki nesneleri bölmek için basitleştirilebiliyor. Ve bu böyle bir problem. Kağıda ikili gösterimin son bitini çizerseniz, çizgi de çizebilirsiniz ve tüm Tek sayılar bir tarafta ve hatta diğer tarafta bulunur. Aynı nedenden ötürü tek katmanlı bir ağda xor problemini çözmek imkansızdır.

Tamam. Bu sorun çok basit görünüyor, bu yüzden Heaviside adımını aktivasyon fonksiyonu olarak atalım. Numaramla biraz oynadıktan sonra, bu sorunun önyargı ile olduğunu fark ettim. Biraz google'ım ve bulduğum şey, geometri gösterimi ile kalırsanız, önyargı, koordinat sistemindeki aktivasyon yerini değiştirmenizi sağlar.

Çok eğitim sorunu


1

Mantık kapılarının DEĞİL VE VEYA VEYA'nın çok basit sinir ağları (NN) ile yapılabileceği ve giriş olarak ikili sayılar kullanarak mantık kapılarıyla tam bir aritmetik hesap makinesi oluşturabileceğiniz iyi bilinmektedir. Bu nedenle, taban 2'de ifade edilen n ve k sayıları için n modulo k değerini hesaplamak için bir NN oluşturabilmelisiniz.

Sabit bir k numarası için n modulo k hesaplamak istiyorsanız (örneğin k = 4), bunu yapan son derece basit bir NN oluşturabilirsiniz: k tabanındaki n giriş numarasını ifade edin ve en düşük sıra dışındaki tüm rakamları göz ardı edin rakam, ve cevabınız var!


0

Girişte açık "mod 2" kullanımından kaçınan bir fikir, sayıyı bir piksel dizisi olarak kodlamak olabilir, daha sonra sorun, segmentin iki eşit parçaya bölünüp bölünemeyeceğini anlamak için önemlidir. Bu bir yapay görme problemidir ve geleneksel ağlar tarafından öğrenilebilir.

Diğer uçta, sayı bir kayan nokta olarak saklanırsa, soru bir kayan nokta sayısının yaklaşık bir tamsayı olduğunu tanımak için azalır (veya genelleştirir).


İlginç düşünce. Sayıyı piksel olarak nasıl kodlamak istediğinizi açıklayabilir misiniz?
Jan Kukacka

"temel 1" i düşünün. N'yi kodlamak için n piksele sahip siyah bir çubuk çizin. Benim tahminim, evrişim çekirdeklerinin tek ve çift piksel arasındaki farkı fark edeceğidir.
arivero

0

Burada böyle bir ağ kurdum .

@William Gottschalk'ın temsili temeli oluşturdu.

32 girişli ilk gizli katmanda sadece 1 nöron kullanır. Çıkış katmanı, 0 ve 1'in bir sıcak kodlaması için sadece 2 nörona sahiptir.


0

Benim çözümüm

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))

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


Dahası, diğer sayılara (örneğin 7) bölmek de iyidir:

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))

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


Açıklama:

2 farklı çözüm elde ediyorum. İkisi de iyidir:
1. aktivasyon olarak günah
2. aktivasyon olarak zemin (veya int)

Degrade iniş kullanarak en iyi ağırlıkları bulmak imkansız ve genetik algoritma kullanıyorum ( scikit-opt'dan )


Merhaba dostum, CV'ye hoş geldiniz ve detaylı cevabınız için teşekkür ederim. Yazdığınız koda biraz açıklama ekleyebilir misiniz?
Ferdi

2 iyi çözüm alıyorum, buraya bakın , 1. aktivasyon olarak günah 2. aktivasyon olarak kat (veya int)
guofei9987
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.