![]() |
1 |
Fault treeの自動生成 (9) |
![]() |
Posts Tagged with "AI"
既に発行済みのブログであっても適宜修正・追加することがあります。We may make changes and additions to blogs already published.
![]() |
31 |
Fault treeの自動生成 (8) |
![]() |
SAPHIREでこれらのMARDファイルをロードすると、図918.1のようなFTが生成されます。

次にSolveで論理圧縮をかけ、View CutSetによりカットセットを表示させます。

表918.1に示すとおり、頂上事象の確率は $\img[-1.35em]{/images/withinseminar.png}$ となります。
2020年にSaphireを使用した以前の記事では頂上事象の確率は3.380E-03でした。若干異なるのは丸め誤差や内部精度が変わったのかもしれません。
さらにExcelの結果である228.5 [FIT]と異なるのは、Excelは不信頼度を$\lambda T_\text{lifetime}$で計算しましたが、ツールはより正確な式である$1-e^{-\lambda T_\text{lifetime}}$で計算していることと丸め誤差の2つによるもののようです。
なお、本稿はRAMS 2027に投稿予定のため一部を秘匿していますが、論文公開後の2027年2月頃に開示予定です。
![]() |
30 |
Fault treeの自動生成 (7) |
![]() |
ChatGPTに前項のRBDを読ませ、頂上事象をMETHOD1としてMARDを生成してもらいました。それを示します。
METHOD1.MARD
TEST_Subs\METHOD1.BED
TEST_Subs\METHOD1.BEI
TEST_Subs\METHOD1.FTD
TEST_Subs\METHOD1.FTL
TEST_Subs\METHOD1.GTD
METHOD1.BED
*Saphire 8.2.9
TEST =
* Name , Descriptions , Project
P1 ,P1desc ,TEST
MCU1 ,MCU1desc ,TEST
D1 ,D1desc ,TEST
I1 ,I1desc ,TEST
M1 ,M1desc ,TEST
SC1 ,SC1desc ,TEST
CA1 ,CA1desc ,TEST
SA1 ,SA1desc ,TEST
P2 ,P2desc ,TEST
MCU2 ,MCU2desc ,TEST
D2 ,D2desc ,TEST
I2 ,I2desc ,TEST
M2 ,M2desc ,TEST
SC2 ,SC2desc ,TEST
CA2 ,CA2desc ,TEST
SA2 ,SA2desc ,TEST
METHOD1.BEI
*Saphire 8.2.9
TEST =
* Name ,FdT,UdC,UdT,UdValue,Prob,Lambda,Tau,Mission,Init,PF,UdValue2,Calc. Prob,Freq,Analysis Type,Phase Type,Project
P1 ,3, , ,0.000E+000,0.000E+000,2.330E-007,0,1.500E+004, , ,0.000E+000,3.495E-003, ,RANDOM,CD,TEST
MCU1,3, , ,0.000E+000,0.000E+000,8.180E-007,0,1.500E+004, , ,0.000E+000,1.227E-002, ,RANDOM,CD,TEST
D1 ,3, , ,0.000E+000,0.000E+000,1.090E-007,0,1.500E+004, , ,0.000E+000,1.635E-003, ,RANDOM,CD,TEST
I1 ,3, , ,0.000E+000,0.000E+000,5.990E-007,0,1.500E+004, , ,0.000E+000,8.985E-003, ,RANDOM,CD,TEST
M1 ,3, , ,0.000E+000,0.000E+000,1.000E-006,0,1.500E+004, , ,0.000E+000,1.500E-002, ,RANDOM,CD,TEST
SC1 ,3, , ,0.000E+000,0.000E+000,1.000E-006,0,1.500E+004, , ,0.000E+000,1.500E-002, ,RANDOM,CD,TEST
CA1 ,3, , ,0.000E+000,0.000E+000,5.100E-008,0,1.500E+004, , ,0.000E+000,7.650E-004, ,RANDOM,CD,TEST
SA1 ,3, , ,0.000E+000,0.000E+000,1.000E-006,0,1.500E+004, , ,0.000E+000,1.500E-002, ,RANDOM,CD,TEST
P2 ,3, , ,0.000E+000,0.000E+000,2.330E-007,0,1.500E+004, , ,0.000E+000,3.495E-003, ,RANDOM,CD,TEST
MCU2,3, , ,0.000E+000,0.000E+000,8.180E-007,0,1.500E+004, , ,0.000E+000,1.227E-002, ,RANDOM,CD,TEST
D2 ,3, , ,0.000E+000,0.000E+000,1.090E-007,0,1.500E+004, , ,0.000E+000,1.635E-003, ,RANDOM,CD,TEST
I2 ,3, , ,0.000E+000,0.000E+000,5.990E-007,0,1.500E+004, , ,0.000E+000,8.985E-003, ,RANDOM,CD,TEST
M2 ,3, , ,0.000E+000,0.000E+000,1.000E-006,0,1.500E+004, , ,0.000E+000,1.500E-002, ,RANDOM,CD,TEST
SC2 ,3, , ,0.000E+000,0.000E+000,1.000E-006,0,1.500E+004, , ,0.000E+000,1.500E-002, ,RANDOM,CD,TEST
CA2 ,3, , ,0.000E+000,0.000E+000,5.100E-008,0,1.500E+004, , ,0.000E+000,7.650E-004, ,RANDOM,CD,TEST
SA2 ,3, , ,0.000E+000,0.000E+000,1.000E-006,0,1.500E+004, , ,0.000E+000,1.500E-002, ,RANDOM,CD,TEST
METHOD1.FTD
TEST =
* Name , Description, SubTree, Alternate, Project
METHOD1 ,Method1TopDef,, ,TEST
METHOD1.FTL
TEST,METHOD1 =
METHOD1 OR MCS01 MCS02 MCS03 MCS04 MCS05 MCS06 MCS07 MCS08 MCS09 MCS10 MCS11 MCS12 MCS13 MCS14 MCS15 MCS16 MCS17 MCS18 MCS19 MCS20 MCS21 MCS22 MCS23 MCS24 MCS25 MCS26 MCS27 MCS28 MCS29 MCS30 MCS31 MCS32 MCS33 MCS34 MCS35 MCS36 MCS37 MCS38 MCS39 MCS40
MCS01 AND P1 P2
MCS02 AND P1 MCU2
MCS03 AND P1 D2
MCS04 AND P1 I2
MCS05 AND P1 M2
MCS06 AND P1 SC2
MCS07 AND MCU1 P2
MCS08 AND MCU1 MCU2
MCS09 AND MCU1 D2
MCS10 AND MCU1 I2
MCS11 AND MCU1 M2
MCS12 AND MCU1 SC2
MCS13 AND D1 P2
MCS14 AND D1 MCU2
MCS15 AND D1 D2
MCS16 AND D1 I2
MCS17 AND D1 M2
MCS18 AND D1 SC2
MCS19 AND I1 P2
MCS20 AND I1 MCU2
MCS21 AND I1 D2
MCS22 AND I1 I2
MCS23 AND I1 M2
MCS24 AND I1 SC2
MCS25 AND M1 P2
MCS26 AND M1 MCU2
MCS27 AND M1 D2
MCS28 AND M1 I2
MCS29 AND M1 M2
MCS30 AND M1 SC2
MCS31 AND SC1 P2
MCS32 AND SC1 MCU2
MCS33 AND SC1 D2
MCS34 AND SC1 I2
MCS35 AND SC1 M2
MCS36 AND SC1 SC2
MCS37 AND CA1 CA2
MCS38 AND CA1 SA2
MCS39 AND SA1 CA2
MCS40 AND SA1 SA2
METHOD1.GTD
TEST=
* Name , Description, Project
METHOD1,Method1TopGate,,TEST
MCS01,PairP1P2,,TEST
MCS02,PairP1MCU2,,TEST
MCS03,PairP1D2,,TEST
MCS04,PairP1I2,,TEST
MCS05,PairP1M2,,TEST
MCS06,PairP1SC2,,TEST
MCS07,PairMCU1P2,,TEST
MCS08,PairMCU1MCU2,,TEST
MCS09,PairMCU1D2,,TEST
MCS10,PairMCU1I2,,TEST
MCS11,PairMCU1M2,,TEST
MCS12,PairMCU1SC2,,TEST
MCS13,PairD1P2,,TEST
MCS14,PairD1MCU2,,TEST
MCS15,PairD1D2,,TEST
MCS16,PairD1I2,,TEST
MCS17,PairD1M2,,TEST
MCS18,PairD1SC2,,TEST
MCS19,PairI1P2,,TEST
MCS20,PairI1MCU2,,TEST
MCS21,PairI1D2,,TEST
MCS22,PairI1I2,,TEST
MCS23,PairI1M2,,TEST
MCS24,PairI1SC2,,TEST
MCS25,PairM1P2,,TEST
MCS26,PairM1MCU2,,TEST
MCS27,PairM1D2,,TEST
MCS28,PairM1I2,,TEST
MCS29,PairM1M2,,TEST
MCS30,PairM1SC2,,TEST
MCS31,PairSC1P2,,TEST
MCS32,PairSC1MCU2,,TEST
MCS33,PairSC1D2,,TEST
MCS34,PairSC1I2,,TEST
MCS35,PairSC1M2,,TEST
MCS36,PairSC1SC2,,TEST
MCS37,PairCA1CA2,,TEST
MCS38,PairCA1SA2,,TEST
MCS39,PairSA1CA2,,TEST
MCS40,PairSA1SA2,,TEST
ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。
![]() |
26 |
Fault treeの自動生成 (6) |
![]() |
RBD
順に手法1, 手法2, 手法3とFTを自動生成させます。入力はRBD(Reliability Block Diagram)です。まず冗長系EPSの2nd SM無しのモデル(手法1)を作成させます。

このMCSをとると、上流に関してチャネル1側とチャネル2側の個々の組み合わせが6x6=36通り、下流も同様に2x2=4通り、計40通りとなることが分かります。従ってあらかじめexcelにより正解値を求めておくと、図916.2のように、頂上侵害確率は3.428E-03、PMHFは228.5 [FIT]となります。

見方の例として、図の左上のSC1(チャネル1側エレメント)とSC2(チャネル2側エレメント)のペアを取ります。SC1とSC2において、それぞれ故障率は1000[FIT]、車両寿命間の不信頼度確率は1.500e-2、それらの積は2.250e-4となります。それらの40個の積項の和が頂上事象侵害確率であり、3.428e-3です。それを車両寿命で割るとPMHFが228.5[FIT]と算出できます。
このexcelによる結果を、検証のために正解値として保持しておきます。
なお、本稿はRAMS 2027に投稿予定のため一部を秘匿していますが、論文公開後の2027年2月頃に開示予定です
![]() |
25 |
Fault treeの自動生成 (5) |
![]() |
理論背景
過去記事#213や過去記事#217で記載しましたが、冗長の場合のFT(fault tree)構築方式については以下の3通りが考えられます。
- 手法1: 2nd SM無しのFT
- 手法2: 2nd SM有りのFT
- 手法3: 規格式どおりの$\tau$の効果を入れたFT
弊社論文においては冗長系における2nd SMの効果まで書かれていませんでしたが、過去記事#217を参考にして、冗長の場合の不稼働確率を以下に示します。
$$ \begin{eqnarray} \Pr\{\text{TOP Unavailable}\}=M_\text{PMHF}\cdot T_\text{L}&=&(\lambda_\text{E1}T_\text{L})(\lambda_\text{E2}T_\text{L}) \img[-1.35em]{/images/withinseminar.png}\\ &=&(\lambda_\text{E1}T_\text{L})(\lambda_\text{E2}T_\text{L})C_\text{1, 2} \end{eqnarray} $$ ただし $$ K_\text{MPF}=1-(1-K_\text{E1,MPF})(1-K_\text{E2,MPF}) $$ $C_\text{1, 2}$はE1, E2に依存する定数で、 $$ C_\text{1, 2}\equiv \img[-1.35em]{/images/withinseminar.png} $$ ここで、上記のFT構成方法と対応させれば、
- 手法1: $C_\text{1, 2}=1$--- 2nd SMの効果無し、最悪見積もり
- 手法2: $C_\text{1, 2}=1-K_\text{MPF}=(1-K_\text{E1,MPF})(1-K_\text{E2,MPF})$---- 2nd SMの合成カバレージ分だけ故障率を減少させる
- 手法3: $C_\text{1, 2}=(1-K_\text{MPF})+K_\text{MPF}\cdot \frac{\tau}{T_\text{L}}$---- 2nd SMの合成カバレージ分だけ故障率を減少させるが、一方2nd SMの検査周期内は検査されないためDPFとなる確率が若干存在し、その分を補正する
ここで、ChatGPTからヒントを貰いました。手法2においてはこのように3 ANDを構成するのではなく、E1, E2の故障率をカバレージ残余で割り引けば良いとのこと。以下、これが成り立つことを証明します。
$$ \Pr\{\text{TOP Unavailable}\}=(\lambda_\text{E1}T_\text{L})(\lambda_\text{E2}T_\text{L})(1-K_\text{MPF})\\ =(\lambda_\text{E1}T_\text{L})(\lambda_\text{E2}T_\text{L})(1-K_\text{E1,MPF})(1-K_\text{E2,MPF})\\ =\left((1-K_\text{E1,MPF})\lambda_\text{E1}T_\text{L}\right) \left((1-K_\text{E2,MPF})\lambda_\text{E2}T_\text{L}\right)\quad(証明終) $$ このように手法2をとれば3 ANDにしなくても故障率を割り引くだけで済みますが、明示的に3 ANDにして2nd SMの効果を入れていることを表す方針とします。
なお、本稿はRAMS 2027に投稿予定のため一部を秘匿していますが、論文公開後の2027年2月頃に開示予定です
![]() |
24 |
Fault treeの自動生成 (4) |
![]() |
過去記事ではFTを手で作成しました。その元となる論文を脚注$\dagger$に示します。ここでは生成AIで作成するトライアルを行います。
題材は完全冗長系のEPSです。なお本論文において車両寿命は15,000時間、2nd SMの検査時間は3,420時間とします(本来4,320時間=半年間のはずだが過去記事の誤り)。図914.1にEPSシステム構成図を示します。

このEPSシステムのRBDを図914.2に示します。

表914.1にRBD中のエレメント記号とエレメント名等を示します。
エレメント記号 | エレメント名 | 故障率[FIT] | SM記号 | SM名 | DC[%] |
---|---|---|---|---|---|
P | Power Module | 233 | None | None | 0 |
MCU | Micro Control Unit | 818 | SM4 | Self test | 99 |
D | Motor Drive Module | 109 | SM2 | Output test | 99 |
I | Failure Isolation Module | 599 | SM1 | Input test | 60 |
M | Aligning Motor | 1000 | SM5 | Motor sensing test | 90 |
SC | Current Sensor | 1000 | SM2 | Output test | 99 |
CA | CAN Communication Module | 51 | SM1 | Input test | 60 |
SA | Angle Sensor | 1000 | SM3 | Sensor compare | 99 |
![]() |
28 |
Pongと強化学習 (81) |
![]() |
PongやBreakoutを観察すると、無駄にパドルが動いています。これはパドル動作にペナルティが無いためでしょうね。そのためにパドル動作(左移動、右移動)自体にペナルティを付加するにはどう改造したら良いですか?
Atariゲーム(例えばBreakoutやPong)においてパドルの動きにペナルティを付けることで、より効率的な動きを促すというアイデアは、特にエージェントが無駄な動きを減らすように学習するのに有効です。こうすることで、エージェントはより戦略的に行動を選択し、必要最小限の動きで最大の効果を達成しようとするでしょう。
ペナルティの実装方法
報酬関数の変更:
- ゲーム環境の報酬関数を変更して、特定の行動(この場合はパドルの左移動や右移動)が行われるたびに小さなペナルティ(例えば-0.01点)を与えます。
環境のカスタマイズ:
gymnasium
やAtari Learning Environment (ALE) を使用している場合、環境のソースコードに手を加える必要があるか、環境をラップするラッパークラスを作成して、報酬を操作します。
カスタム環境ラッパーの実装例
以下はPythonを使用してgymnasium
の環境にペナルティを適用する簡単な例です。この例では、gymnasium
ラッパーを使用してBreakoutやPongの環境に介入し、パドルの動きに対してペナルティを適用します。
import gymnasium as gym
class PenalizePaddleMovement(gym.Wrapper):
def __init__(self, env, penalty=-0.01):
super(PenalizePaddleMovement, self).__init__(env)
self.penalty = penalty
self.last_action = None
def step(self, action):
observation, reward, done, info = self.env.step(action)
if action in [LEFT, RIGHT] and action == self.last_action: # 定義に基づく左右の行動
reward += self.penalty
self.last_action = action
return observation, reward, done, info
def reset(self, **kwargs):
self.last_action = None
return self.env.reset(**kwargs)
# 環境の作成とラッパーの適用
env = gym.make('Breakout-v0')
env = PenalizePaddleMovement(env)
# DQNや他の学習アルゴリズムで使用
このコードでは、PenalizePaddleMovement
クラスが環境をラップし、パドルの連続した移動行動にペナルティを与える機能を追加しています。ここで、LEFT
やRIGHT
はゲーム固有の行動コードに置き換える必要があります。このペナルティは、同じ方向に連続してパドルを動かすときにのみ適用されます。
注意点
- ペナルティの値: ペナルティは非常に小さく設定することが重要です。これは、ペナルティが報酬を完全に打ち消さないようにするためです。
- 行動の定義:
LEFT
やRIGHT
といった具体的な行動は、使用している環境のAPIドキュメントを参照して適切な値に設定してください。 - 実験の検証: 変更を加えた後は、エージェントがまだ適切に学習できるかを確認するために、広範なテストが必要です。
この方法で、パドルの動きにペナルティを適用し、エージェントがより効率的な戦略を学習するよう促すことができます。
![]() |
27 |
Pongと強化学習 (80) |
![]() |
env = ClipRewardEnv(env)
env = gym.wrappers.ResizeObservation(env, (84, 84))
env = gym.wrappers.GrayScaleObservation(env)
env = gym.wrappers.FrameStack(env, 4)
を深掘りしてみます。
ご提示いただいたソースコードから、環境のラップ方法として複数の重要な変更が行われていることがわかります。これらは強化学習、特にDQNのようなアルゴリズムを用いる際に一般的に適用される変更です。それぞれのラッパーがどのような機能を果たしているかを以下に説明します。
1. ClipRewardEnv
このラッパーは環境から得られる報酬をクリップ(制限)します。多くの場合、報酬は+1
, 0
, -1
のようにシンプルな形に変換されます。これにより、報酬のスケールが大きく異なる問題を防ぎ、学習プロセスを安定させることができます。
2. ResizeObservation
ResizeObservation
ラッパーは、環境から得られる観察(画像)を指定されたサイズ(この場合は84x84)にリサイズします。これにより、入力データの次元が減少し、計算負荷が軽減されると同時に、学習がより効率的に行えるようになります。
3. GrayScaleObservation
このラッパーは観察画像をグレースケールに変換します。カラー情報を削除することで、処理するデータ量をさらに削減し、重要な構造的情報にモデルが集中できるようにします。
4. FrameStack
FrameStack
は連続する複数のフレーム(この場合は4フレーム)をスタックし、それを一つの観察として扱います。これにより、モデルは単一の画像からではなく、時間にわたる動きの情報を取得できるため、より複雑な環境のダイナミクスを学習することが可能になります。
5. env.action_space.seed(seed)
環境の行動空間にシードを設定して、再現性のあるランダム性を確保します。これは実験の一貫性を保つために重要です。
総合すると
これらのラッパーを組み合わせることで、学習アルゴリズムがより効率的かつ効果的に環境から学ぶことが可能になります。画像のサイズ変更、色の削減、報酬の正規化、そして時間的な情報の統合は、特に視覚的なデータを扱う場合において、モデルのパフォーマンスを大きく向上させることができます。このような準備を施すことで、ニューラルネットワークや他の機械学習モデルが、原始的なピクセルデータから有用な特徴を抽出しやすくなります。
![]() |
25 |
Pongと強化学習 (79) |
![]() |
Atari_dqnのソースコードについて質問してみます。「def make_env(env_id, seed, idx, capture_video, run_name):という関数について教えてください」
make_env
関数は、Atariゲームを含む環境を構成し、トレーニングのために適合させる一連の手順を包括的に示しています。この関数は特に、強化学習実験で広く使用されるような設定を含んでおり、異なるラッパーや設定を適用しています。ここで使われている具体的なラッパーとその目的について、さらに詳しく解説します。
関数の詳細解説
ビデオ記録:
- この関数は、特定の条件下(
capture_video
がTrue
で、idx
が0の場合)で環境のビデオを記録します。これは主に、学習の進行を視覚的に確認するために利用されます。
- この関数は、特定の条件下(
エピソード統計の記録:
RecordEpisodeStatistics
ラッパーを用いて、各エピソードの統計情報(得点など)を記録します。これにより、トレーニングの効果を定量的に評価することが可能になります。
No-op リセット:
NoopResetEnv
は、エピソードの開始時に最大30ステップの間何もしない(No-Operation, No-op)アクションをランダムに挿入することで、エージェントが単一の開始状態に過剰に適合するのを防ぎます。
Max and Skip:
MaxAndSkipEnv
は、指定された数(ここでは4)のフレームをスキップし、その間の画像の最大値を取ることで観察を行います。これにより、処理を高速化し、時間的な差異を処理しやすくします。
エピソディックライフ:
EpisodicLifeEnv
は、エージェントが失敗したときにゲームが終了したかのように環境をリセットしますが、実際のゲームオーバーまで続きます。これは、エージェントがより慎重な行動を学習するのを助けます。
Fire リセット:
FireResetEnv
は、ゲーム開始時に「FIRE」アクション(多くのAtariゲームで使用される開始アクション)を自動的に行うラッパーです。
報酬のクリップ、観察のリサイズとグレースケール化、フレームのスタック:
- これらのラッパーは上述の通り、学習プロセスを安定させ効率化します。
アクションスペースのシード設定:
- 環境の行動選択にランダム性を導入する際の一貫性を保つために、シードを設定します。
総合的な構成
このmake_env
関数は、特に複雑な環境で学習を行う強化学習モデル(特にDQN)にとって必要な多くの事前処理を自動的に設定します。これにより、モデルがより効果的に学習を進めることが可能となり、開発者は環境の細かい調整に時間
![]() |
22 |
Pongと強化学習 (78) |
![]() |
このコードにReLUを組み込むにはどうするのかを聞いてみます。
ReLU(Rectified Linear Unit)関数は、一般的にニューラルネットワークの活性化関数として使用されます。ReLU関数は入力が0以下の場合は0を出力し、入力が0より大きい場合はその入力をそのまま出力します。ハードウェア(特にBSVでの実装)においてReLUを組み込む場合、各計算ステップの後にこの単純な条件チェックを適用することになります。
以下の例では、畳み込み計算の結果に対してReLUを適用する方法を示します。ここでは、畳み込み演算の結果を格納する前にReLU関数を適用しています。
package ConvolutionFSMwithReLU;
import StmtFSM::*;
interface Conv2D_IF;
method Action start();
method ActionValue#(Bit#(8)) getResult(Int#(32) x, Int#(32) y);
endinterface
module mkConvolutionFSMwithReLU#(parameter Int#(32) width = 84,
parameter Int#(32) height = 84,
parameter Int#(32) kWidth = 8,
parameter Int#(32) kHeight = 8)(Conv2D_IF);
// ここで入力行列、カーネル行列、出力行列を定義
Reg#(Bit#(8)) inputMatrix[0:width-1][0:height-1];
Reg#(Bit#(8)) kernelMatrix[0:kWidth-1][0:kHeight-1];
Reg#(Bit#(8)) resultMatrix[0:width-kWidth][0:height-kHeight];
Reg#(Bool) startFlag <- mkReg(False);
// ReLU関数の定義
function Bit#(8) ReLU(Bit#(32) x);
return (x > 0) ? truncate(x) : 0;
endfunction
// 畳み込み計算のFSM
Stmt main = seq
// x, y のループ
for (x <= 0; x < width - kWidth + 1; x <= x + 1) seq
for (y <= 0; y < height - kHeight + 1; y <= y + 1) seq
// 畳み込み計算
action
Bit#(32) sum = 0;
for (Int#(32) dx = 0; dx < kWidth; dx = dx + 1) begin
for (Int#(32) dy = 0; dy < kHeight; dy = dy + 1) begin
sum = sum + (inputMatrix[x+dx][y+dy] * kernelMatrix[dx][dy]);
end
end
resultMatrix[x][y] = ReLU(sum); // 結果にReLUを適用して格納
endaction
endseq
endseq
endseq;
mkAutoFSM(main);
method Action start();
startFlag <= True;
endmethod
method ActionValue#(Bit#(8)) getResult(Int#(32) x, Int#(32) y);
return resultMatrix[x][y];
endmethod
endmodule
endpackage
この例では、ReLU
関数を定義し、畳み込み計算の結果に適用してから結果をresultMatrix
に格納しています。この方法により、畳み込み後の特徴マップに非線形性を導入し、ニューラルネットワークの表現力を高めることができます。ただし、ReLU
関数の出力ビット幅に注意が必要です。ここでは出力をBit#(8)
にトランケートしていますが、実際のアプリケーションに応じて適切なビット幅を選択する必要があります。
ページ: