偶数と奇数を区別するためにニューラルネットワークをトレーニングする


14

質問:数字自体を入力としてのみ使用して、奇数と偶数を区別するようにNNをトレーニングすることは可能ですか?

次のデータセットがあります。

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

2つの入力ニューロン(変数が1つ、もう1つがバイアスニューロン)、隠れ層の9つのニューロン、非常に単純な遺伝的アルゴリズムを使用して1つの出力ニューロンでNNをトレーニングしました。各エポックで、2組の重み「ファイト" 互いに対して; エラーが最も大きいものが失われ、勝者の修正バージョンに置き換えられます。

このスクリプトは、AND、OR、XOR演算子などの単純な問題を簡単に解決しますが、奇数と偶数を分類しようとすると行き詰まります。今のところ、100のうち53の数字を特定するのが最善で、数時間かかりました。入力を正規化してもしなくても、違いはないようです。

不正行為をしたい場合は、データを前処理して、%2を入力としてNNにフィードすることもできますが、それはしたくありません。NNは、モジュロ演算子を含むすべての関数を近似できる必要があります(信じています)。私は何を間違えていますか?


1
「mod」関数をニューラルネットワークで近似しようとしているようです。これは、私のお気に入りの問題のクラスの1つです。「鶏を球体に近づけるのが適切な場合はいつですか」。有限要素モデルは最適な場所です。ニューラルネットワークについてこれを尋ねるとき、私は「基礎」の観点で考えるのが好きです。正確な答えには2による除算と切り捨てが含まれる一方、古典的なネットワークはベクトル乗算とシグモイド関数です。NNは外挿ではなく内挿に最適です-ドメインは制限されていますか?
EngrStudent-モニカの復元

4
あなたの質問は、現在受け入れられている答えよりも深くなると思います。次の一般化を検討してください。nmod kを計算するニューラルネットワークを構築します(脳で発生することが予想される操作のみを使用)。ここで、nとkは入力です。固定サイズのフィードフォワードネットワークでこれが可能かどうか疑問に思います。
user66081

回答:


7

他の機械学習タスクと同様に、入力の表現は、学習と一般化の程度において重要な役割を果たします。

表現の問題は、関数(モジュロ)が非常に非線形であり、この問題に対して選択した入力表現では滑らかではないことだと思います。

私は次を試してみます:

  1. より良い学習アルゴリズムを試してください(逆伝播/勾配降下法とその変形)。

  2. 固定長の精度を使用して、バイナリで数値を表現してみてください。

  3. 入力表現がbビット数である場合、トレーニングセットが小さい数または大きい数に偏っていないことを確認します。均一である数値を有し、独立して範囲からランダムに選択された[02b1]

  4. 完了したら、マルチレイヤーネットワークを使用します(最初に2つのレイヤーを試してください。つまり、非表示+出力を使用してから、さらにレイヤーを使用します)。

  5. 別のトレーニング+テストセットを使用します。トレーニングセットでのパフォーマンスを評価しないでください。


自然対数の計算など、入力に対して変換を実行することは価値があると考えていました。
EngrStudent-モニカの

かもしれない。実際、ここでの答えを知っていれば(モジュロ2は最後のビットです)、生の数のバイナリ表現は非常にうまく機能します。入力の最後のビットを出力に接続するだけです。:)モジュロ(2のべき乗ではない)がニューラルネットワークでうまく機能するかどうかを確認するのは興味深いでしょう。うまくいかないかもしれません。
ヴィマル

こんにちは@Vimal、答えてくれてありがとう。入力をバイナリで表現するのが常に良いアイデアか、それがたまたまこの特定のケースで役立つかどうかを知っていますか?
エドガーダービー

@AnnoysParrot-「銀の弾丸」はありません。bestは異なる相互に排他的なものを意味する可能性があるため、単一の普遍的な最適表現はありません。この場合、バイナリ表現は便利ですが、そうでない場合はたくさんあります。視覚データの詳細な学習を検討してください。一意の入力ビットごとに個別の入力ニューロンがある場合、5メガピクセルの画像には約256 * 520万の入力が必要になります。
EngrStudent-モニカの復活

2
ここで@EngrStudentに同意します。多くの事前知識は、適切な入力表現の設計と、ニューラルネットワークトポロジ自体の設計に使用されます。ニューラルネットワークはおおよそ連続的で微分可能なデジタル回路に相当するため、加算/乗算/除算/モジュロなどのデジタル回路からのインスピレーションを使用して、ネットワークのトポロジを適合させることができます。トポロジに関するこの事前の接続(完全に接続されたレイヤーの代わりに)は、自然な画像に対してconvnetsがうまく機能したように、トレーニングの高速化、一般化の向上などにつながります。
ヴィマル

6

奇数と偶数を分類することを学ぶことは難しい問題です。単純なパターンは無限に繰り返されます。2,4,6,8 ..... 1,3,5,7 .....

sin(x)やcos(x)などの非線形活性化関数も同様に動作します。したがって、tanhやreluなどの一般的な活性化関数の代わりにsinとcosを実装するようにニューロンを変更すると、単一のニューロンを使用してこの問題をかなり簡単に解決できると思います。

線形変換は常に非線形変換に先行します。したがって、単一のニューロンはsin(ax + b)を学習し、a&bの適切な組み合わせに対して、必要な周波数(この場合は1)で交互に0と1を出力します。

これまでにニューラルネットワークでsinやcosを試したことはありません。それで、それが非常に悪い考えであるならば、おologiesびします。


5

だから私は今、ニューラルネットで作業していて、あなたと同じ問題に遭遇しました。私がやったことは、入力された数値を、数値のバイナリ表現に等しい値を持つ配列として表現することでした。私たちがしていることは分類なので、出力を単一の値ではなく配列として表しています。例:

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
]

お役に立てれば!


1
まさにあなたの答えに基づいて、私はここにモデルを作成しましたstackoverflow.com/questions/53671491/…–
prosti

見事!これは、データの表現がどのようなMLアルゴリズムにとって重要であるかを示しています。10進表現を使用すると、正確に50%の精度が得られましたが、この考えに従って、見えないデータでも100%の精度が得られました。ありがとう。実装は次のとおり
drive

2
バイナリでは、偶数は常に0で終わり、奇数は常に1で終わります。モデルが機能することは驚くべきことではありません。最後の桁の値を吐き出すことを学習しただけだからです。
Syncrossus

2

私はここで、同様の問題に苦しんでいた場所に着きます。だから私は自分が管理したものを書きます。

私が知る限り、パーセプトロンはすべての問題を解決することができ、最終的には直線を使用して任意のジオメトリのオブジェクトを分割するために簡略化できます。そして、これはこの種の問題です。紙にバイナリ表現の最後のビットを描画する場合、線を描画することもできます。すべての奇数は片側に、偶数は他にあります。同じ理由で、1層ネットワークでxor問題を解決することは不可能です。

OK。この問題は非常に単純に見えるため、Heavisideのステップをアクティベーション関数として使用してみましょう。自分の番号で少し遊んだ後、ここでの問題はバイアスにあることに気付きました。私は少しグーグルで、私が見つけたのは、幾何学表現にとどまるなら、バイアスは座標系の活性化の場所を変更できることです。

非常に教育的な問題


1

論理ゲートNOT、AND、ORはすべて非常に単純なニューラルネットワーク(NN)で実行できること、および入力として2進数を使用する論理ゲートを備えた完全な算術計算機を構築できることはよく知られています。したがって、基数2で表されるnおよびkの数値について、NNを作成してkを法とするnを計算できる必要があります。

固定k数(たとえば、k = 4)に対してkを法とするnモジュロを計算する場合は、実際に次のことを行う非常に単純なNNを作成できます。桁、あなたは答えを持っています!


0

入力での明示的な「mod 2」の使用を回避する1つの考えは、数をピクセルのシーケンスとして体系化することです。その場合、問題は、セグメントを2つの等しいセグメントに分割できるかどうかを認識することになります。これはマシンビジョンの問題であり、従来のネットワークで学習できます。

反対に、数値が浮動小数点数として格納されている場合、浮動小数点数がおよそ整数であるときを認識するために質問は減少(または一般化)します。


興味深い考え。数値をピクセルに体系化する方法を詳しく説明できますか?
ヤンKukacka

さて、「ベース1」と考えてください。nを体系化するには、nピクセルの黒いバーを描画します。私の推測では、畳み込みカーネルは奇数と偶数のピクセルの違いに気付くでしょう。
アリヴェロ

0

ここでそのようなネットワークを作成しました

@William Gottschalkの表現が基盤でした。

32個の入力を持つ最初の隠れ層で1つのニューロンを使用します。出力層には、0および1のワンホットエンコーディング用に2つのニューロンのみがあります。


0

私の解決策

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

入力:1001、2で割る入力:1002、2で割る入力:1003、2で割る入力:1004、2で割る:真の入力:1005、2で割る入力:1006、割る2:真の入力:1007、2で割る入力:1008、2で割る入力:1009、2で割る入力:1010、2で割る入力:1011、2で割る入力:1012、2で割る:真の入力:1013、2で割る入力:1014、2で割る:真の入力:1015、2で割る:偽の入力:1016、2で割る:真の入力:1017、で割る2:False入力:1018、2で割る:1019、2で割る:False入力:1020、2で割る:True入力:1021、2で割る:Falseで割る:1022、2で割る:True入力: 1023、2で割る入力:1024、2で割る:真の入力:1025、2で割る入力:1026、2で割る:真の入力:1027、2で割る入力:1028、2で割る:真の入力:1029、2で割る:誤入力:1030、2で割る:真の入力:1031、2で割る入力:1032、2で割る:真の入力:1033、2で割る:偽の入力:1034、2で割る:真の入力:1035、 2:False入力で除算:1036、2:Trueで除算:1037、2:False入力で除算:1038、2:Trueで除算入力:1039、2:False入力で除算:1040、2:Trueで除算入力:1041、2で割る入力:1042、2で割る入力:1043、2で割る入力:1044、2で割る:真の入力:1045、2で割る入力:1046、割る2:2による入力:1047、2による分割入力:1048、2による分割:True入力:1049、2による分割入力:False入力:1050、2による分割:True入力:1051、2による分割入力:False :1052、2で割る:真の入力:1053、2で割る:偽の入力:1054、2で割る:真の入力:1055、2で割る:偽の入力:1056、2で割る:真の入力:1057、割る2:偽の入力:1058、2で割る:真の入力:1059、2で割る入力:060、2で割る:真の入力:1061、2で割る入力:1062、2で割る:真の入力:1063、2で割る入力:1064、 2:2で割る入力:1065、2で割る入力:1066、2で割る入力:1067、2で割る:偽入力:1068、2で割る入力:1069、2で割る:偽入力:1070、2で割る入力:1071、2で割る入力:1072、2で割る入力:1073、2で割る入力:False入力:1074、2で割る入力:1075、除算2:False入力:1076で除算、2:True入力:1077で除算、2:False入力で除算:1078、2:True入力で除算:1079、2:False入力で除算:1080、2:True入力で除算:1081、2で割る入力:1082、2で割る入力:1083、2で割る入力:1084、2で割る:真の入力:1085、2で割る入力:1086、で割る2:真の入力:1087、2で割る:誤入力:1088、2で割る:真の入力:1089、2で割る入力:090、2で割る:真の入力:1091、2で割る:偽の入力:1092、2で割る:真の入力:1093、 2:False入力で割る:1094、2:True入力で割る:1095、2:False入力で割る:1096、2:Trueで割る入力:1097、2:False入力で割る:1098、2:Trueで割る入力:1099、2で割る入力:1100、2で割る:真の入力:1101、2で割る入力:1102、2で割る:真の入力:1103、2で割る入力:1104、割る2:真の入力:1105、2で割る入力:1106、2で真の入力:1107、2で割る入力:108、2で割る:真の入力:1109、2で割る入力:1110、2で割る:真の入力:1111、2で割る:1112、2で割る:真の入力:1113、2で割る:偽の入力:1114、2で割る:真の入力:1115、で割る2:偽入力:1116、2で割る:真の入力:1117、2で割る入力:118、2で割る:真の入力:1119、2で割る入力:120、2で割る:真の入力:1121、2で割る入力:122、 2で割る:真の入力:1123、2で割る入力:124、2で割る:真の入力:1125、2で割る:偽の入力:1126、2で割る:真の入力:1127、2で割る:偽入力:1128、2で割る:真の入力:1129、2で割る:入力1130、2で割る:真の入力:1131、2で割る:偽の入力:1132、2で割る:真の入力:1133、割る2:False入力で1134、2:True入力で割る:1135、2:False入力で割る:1136、2:True入力で割る:1137、2:False入力で割る:1138、2:True入力で割る:1139、2で割る入力:1140、2で割る:真の入力:1141、2で割る入力:1142、2で割る:真の入力:1143、2で割る:偽の入力:1144、で割る2:真の入力:1145、2で割る:誤入力:1146、2で割る:真の入力:1147、2で割る入力:1148、2で割る:真の入力:1149、2で割る:偽の入力:1150、2で割る:真の入力:1151 2:False入力で分割:1152、2:True入力で分割:1153、2:False入力で分割:1:1、2で分割:True入力:1155、2で分割:False入力:1156、2で分割:True入力:1157、2で割る入力:1158、2で割る:真の入力:1159、2で割る入力:1160、2で割る:真の入力:1161、2で割る入力:1621、割る2:真の入力:1163、2で割る入力:1164、2で真の入力:1165、2で割る入力:1166、2で割る:真の入力:1167、2で割る入力:1168、2で割る:真の入力:1169、2:偽の入力:1170、2で割る:真の入力:1171、2で割る:偽の入力:1172、2で割る:真の入力:1173、で割る2:偽入力:1174、2で割る:真の入力:1175、2で割る入力:1176、2で割る入力:真の入力:1177、2で割る入力:1178、2で割る:真の入力:1179、2で割る入力:1180、 2:True入力:1181で除算、2:False入力で除算:1182、2:True入力で除算:1183、2:Falseで除算入力:1184、2で除算:True入力:1185、2:Falseで除算入力:1186、2で割る入力:1187、2で割る入力:1188、2で割る入力:1189、2で割る:誤入力:1190、2で割る入力:1191、除算2:False入力で1192、2:True入力で除算:1193、2:False入力で除算:1194、2:True入力で除算:1195、2:False入力で除算:1196、2:True入力で除算:1197、2で割る入力:1198、2で割る:真の入力:1199、2で割る:偽真の入力:1179、2で割る入力:1180、2で割る:真の入力:1181、2で割る入力:1182、2で割る:真の入力:1183、2で割る入力:1184、 2で割る:真の入力:1185、2で割る入力:1186、2で割る:真の入力:1187、2で割る:偽の入力:1188、2で割る:真の入力:1189、2で割る:偽入力:1190、2で割る入力:1191、2で割る入力:1192、2で割る入力:1193、2で割る:偽の入力:1194、2で割る:真の入力:1195、割る2:False入力:1196、2:True入力で分割:1197、2:False入力で分割:1198、2:True入力:1199、2:Falseで分割真の入力:1179、2で割る入力:1180、2で割る:真の入力:1181、2で割る入力:1182、2で割る:真の入力:1183、2で割る入力:1184、 2で割る:真の入力:1185、2で割る入力:1186、2で割る:真の入力:1187、2で割る:偽の入力:1188、2で割る:真の入力:1189、2で割る:偽入力:1190、2で割る入力:1191、2で割る入力:1192、2で割る入力:1193、2で割る:偽の入力:1194、2で割る:真の入力:1195、割る2:False入力:1196、2:True入力で分割:1197、2:False入力で分割:1198、2:True入力:1199、2:Falseで分割真の入力:1187、2で割る入力:1188、2で割る:真の入力:1189、2で割る入力:1190、2で割る:真の入力:1191、2で割る入力:1192、 2で割る:真の入力:1193、2で割る入力:1194、2で割る:真の入力:1195、2で割る入力:1196、2で割る:真の入力:1197、2で割る:偽入力:1198、2で割る:真の入力:1199、2で割る:偽真の入力:1187、2で割る入力:1188、2で割る:真の入力:1189、2で割る入力:1190、2で割る:真の入力:1191、2で割る入力:1192、 2で割る:真の入力:1193、2で割る入力:1194、2で割る:真の入力:1195、2で割る入力:1196、2で割る:真の入力:1197、2で割る:偽入力:1198、2で割る:真の入力:1199、2で割る:偽


さらに、他の数値(たとえば、7)による除算も適切です。

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

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


説明:

2つの異なるソリューションがあります。彼らは両方とも良いです:
1.アクティベーションとしての罪
2. アクティベーションとしての床(または整数)

勾配降下を使用して最適な重みを見つけることは不可能であり、遺伝的アルゴリズムを使用します(scikit-optから)


こんにちは、CVへようこそ。詳細な回答をありがとうございます。書いたコードに説明を追加してください。
フェルディ

私は2つの良い解決策を手に入れました。ここを参照してください。1.アクティベーションとしてのsin 2.アクティベーションとしてのfloor(またはint)
guofei9987
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.