如何提高我的神经网络准确性功能,使 keras 惰性评估成为可能

How to improve my neural network accuracy function such that keras lazy evaluation is possible

我目前的神经网络精度函数(和神经网络)如下:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras import models
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
import numpy as np

def predoneacc(y_true, y_pred):
    y_nptrue = y_true.numpy()
    y_nppredinit = y_pred.numpy()

    y_nppred = np.round(y_nppredinit)
    return arr1eq(y_nptrue,y_nppred)

def arr1eq(y_true, y_pred):
    k = 0.0
    count1 = 0.0
    for i in range(len(y_true)):
        for j in range(len(y_true[0])):
            if y_pred[i][j] == 1.0:
                count1 = count1+1.0
                if y_true[i][j] == 1.0:
                    k = k+1.0
    if(count1==0.0): return 0
    else: return k/count1

tap=5

model = keras.Sequential([
    keras.layers.LSTM(300, input_shape=(tap,45)),
    keras.layers.Dense(45, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=[predoneacc], run_eagerly=True)
model.fit(x,y,epochs=150) #x,y data properly given input/output shape required by the network

但是TensorFlow keras tensorflow.keras.models.compile()不能使用这个精度函数,除非设置了run_eagerly=True,因为使用了.numpy()。代码运行到 model.fit(),它抱怨我必须设置 eager evaluation on。所以我想重新编码我的精度函数,以便 .compile() 可以接受精度函数而无需在 .compile().

中设置 run_eagerly=True

出路是什么?我的精度函数目前只是 returns 准确的 1 预测数除以二进制分类问题中 1 预测的总数,输出层激活函数是 sigmoid。

我有tensorflow 2.0.

我认为这样的东西对你有用:

def arr1eq(y_true, y_pred):
  y_pred = tf.round(y_pred)
  count = tf.reduce_sum(tf.cast(tf.equal(tf.where(tf.equal(y_pred, 1.0)), 1), dtype=tf.int32))
  k = tf.reduce_sum(tf.cast(tf.equal(tf.where(tf.equal(tf.cast(y_true, dtype=tf.float32), 1.0)), 1), dtype=tf.int32))
  return tf.where(count==0, tf.constant(0.0), tf.constant(tf.cast(k/count, dtype=tf.float32)))

y_pred 首先四舍五入为最接近的整数,然后我计算检查 y_pred 具有 1.0 值的位置。出现次数汇总在变量 count 中。对 y_true 进行同样的操作而不四舍五入。

这是一个简化版本(抱歉造成任何混淆):

def arr1eq2(y_true, y_pred):
  y_pred = tf.round(y_pred)
  y_pred_indices = tf.where(tf.equal(y_pred, 1.0))
  count = tf.shape(y_pred_indices)[0]
  k = tf.reduce_sum(tf.cast(tf.equal(tf.gather_nd(y_true, y_pred_indices), 1), dtype=tf.int32))
  return tf.where(count==0, tf.constant(0.0), tf.constant(tf.cast(k/count, dtype=tf.float32)))