ArrayFireで配列を飽和しようとしています。私は、0.75より大きいすべての値を1.0に飽和させ、0.25未満を0.0に飽和させたい。私は次の式を使用しています。Arrayfireの条件付きエラー
a(a > 0.75) = 1.0;
a(a < 0.25) = 0.0;
これはaf ::配列型です。それはしばらくの間動作しますが、0.75より大きい値がない配列を取得するとすぐに、次の例外が発生します。
terminate called after throwing an instance of 'af::exception'
what(): ArrayFire Exception (Invalid input size:203):
In function verifyDims
In file src/api/c/data.cpp:36
Invalid dimension for argument 1
Expected: ndims >= 1
In function af::array af::constant(T, const af::dim4&, af::dtype) [with T = double; af::dtype = af_dtype]
In file src/api/cpp/data.cpp:28
私がaf::print("", a > 0.75);
と呼ぶと、クラッシュする前に次の出力が得られます。
[10 1 1 1]
0
0
0
0
0
0
0
0
0
0
は、それが何らかの形でこの配列は、(非が0.75以上であるので、それがあるべき)すべてゼロであることを見て、その後、次元がゼロであると言っていますか?それは私が間違ってやっていることか、コードのバグですか?
次のコードはそれを修正するようですが、この解決策はいくらか非効率です。
af::array bellow = a[levels - 1] < 0.25f;
af::array above = a[levels - 1] > 0.75f;
if(af::anyTrue<bool>(above))
a[levels - 1](above) = 0.75f;
if(af::anyTrue<bool>(bellow))
a[levels - 1](bellow) = 0.25f;
機能全体を見たいと思う人のために、私はグラデーションをニューラルネットワークでうまくやっています。 aは実際にはaf :: array型の配列です。私は質問を簡素化するためにそれを残しました。
void train(const float* in, const float* expected_out, float learning_rate)
{
std::unique_ptr<af::array[]> a(new af::array[levels]),
z(new af::array[levels]), d(new af::array[levels]);
af::array in_array(inputs, in);
af::array y(dims[levels - 1], expected_out);
z[0] = af::matmul(weights[0], in_array) + biases[0];
a[0] = sigma(z[0]);
for(size_t i = 1; i < levels; i++)
{
z[i] = af::matmul(weights[i], a[i - 1]) + biases[i];
a[i] = sigma(z[i]);
}
a[levels - 1](a[levels - 1] < 0.25f) = 0.0f;
a[levels - 1](a[levels - 1] > 0.75f) = 1.0f;
d[levels - 1] = (y - a[levels - 1]) * sigma_prime(z[levels - 1]);
for(size_t i = levels - 1; i-- > 0;)
d[i] = af::matmul(weights[i + 1].T(), d[i + 1]) * sigma_prime(z[i]);
for(size_t i = 0; i < levels; i++)
{
biases[i] += learning_rate * d[i];
weights[i] += learning_rate * af::matmul(d[i], (i ? a[i - 1] : in_array).T());
}
}
エラーの原因となるコードを追加してください。 – hyde
私はそれをコードの最初の部分でした。 – chasep255
'a(a> 0.75)= 1.0; a(a <0.25)= 0.0; ' – chasep255