Получение ошибки с моей пользовательской функцией потерь в Керасе - PullRequest
1 голос
/ 25 июня 2019

Я создаю пользовательскую функцию потерь, которая включает в себя много кода и уравнений.Когда я пытаюсь скомпилировать свою модель следующим образом:

model.compile (оптимизатор = 'rmsprop', потеря = custom_loss (рис.), Метрики = ['точность'])

я получаюошибка, которую я пытаюсь понять, как исправить.

Кроме того, мне также пришлось изменить что-то внутри функции, чтобы она работала, и я также заинтересован в том, чтобы вернуть ее обратно, поэтому у меня естьвсего две проблемы.

Задача 1:

Я получаю сообщение об ошибке, хотя я удостоверился, что во время пользовательской функции потери я распечатал что-то, чтобы сообщить, где была получена ошибка, и похоже, что она былав состоянии пройти через всю функцию потерь до команды возврата.Однако ошибка, которую я получил, была

'numpy.float64' object has no attribute 'get_shape'

, и более подробная ошибка была:

AttributeError                            Traceback (most recent call 
last)
<ipython-input-254-fe4381ab64e0> in <module>()
----> 1 model.compile(optimizer='rmsprop',loss=custom_loss(pic), metrics= 
['accuracy'])

2 frames
/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in 
compile(self, optimizer, loss, metrics, loss_weights, sample_weight_mode, 
weighted_metrics, target_tensors, **kwargs)
    340                 with K.name_scope(self.output_names[i] + 
'_loss'):
    341                     output_loss = weighted_loss(y_true, y_pred,
--> 342                                                 sample_weight, 
mask)
343                 if len(self.outputs) > 1:
344                     self.metrics_tensors.append(output_loss)

/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in 
weighted(y_true, y_pred, weights, mask)
    415         if weights is not None:
    416             # reduce score_array to same ndim as weight array
--> 417             ndim = K.ndim(score_array)
    418             weight_ndim = K.ndim(weights)
    419             score_array = K.mean(score_array,

/usr/local/lib/python3.6/dist- 

packages / keras / backend / tenorflow_backend.py в ndim (x) 617 `` `618 "" "-> 619 dims = x.get_shape () ._ dims 620, если dims не None: 621 return len (dims)

Функция потерь очень длинная, и я включаю в эту версию некоторыепечатный материал, потому что, возможно, это поможет вам понять, в чем проблема:

'''def dl_loss(x,pic):

print('orig shape(x): ',x.shape)
x=tf.reshape(x,[2501,1])
print('try shape(x): ',x.shape)


a=x[0]
print('tfshape(a): ',a.shape)
print('shape(a): ',np.shape(a))
ms=x[1:]
print('tfshape(ms): ',np.shape(ms))




frac=2 
ms_reshaped=tf.reshape(ms,[int(np.shape(pic)[0]/frac),int(np.shape(pic) 
[0]/frac)])
print('got here')
ms=upsample(ms_reshaped,2) #THIS IS MY OWN FUNCTION THAT I ALSO NEED HELP 
WITH
print('finished upsampling')


h=np.shape(pic)[0]
w=np.shape(pic)[1]
print('hot h and w')

cur_noisy=(a*np.ones(np.shape(pic)))*(np.ones(np.shape(pic))+ms)
print('got noisy pic')

cur_clean=pic/(1.000000000001+ms)
print('got clean pic')


avg_m=np.mean(ms)
std_m=np.std(ms)

l_4=0.6*shannon_entropy(np.around(cur_clean,3))
if std_m<0.1:
#   print('in')
    l_4=5*l_4  
print('got l_4')


F_new=im2freq(cur_clean)
F_noisy=im2freq(pic)
print('got fourriers')



l_1=abs(avg_m)
print('got l1')


l_2=-(np.sum(abs(F_noisy[int(np.round(0.5*h)):,int(np.round(0.5*w)):]))
        -np.sum(abs(F_new[int(np.round(0.5*h)):,int(np.round(0.5*w)):])))

l_2=l_2/10000
print('got l2')


m_max=np.max(ms)
m_min=np.min(ms)
std=(m_max-m_min)/3


perc_pix_in_1_std = len(np.where(np.logical_and(ms>(avg_m-std), 
ms<(avg_m+std)))[0])/(np.shape(pic)[0]*np.shape(pic)[1])



l_3=(0.95-perc_pix_in_1_std) #because we're expecting m to be normally 
distributed
print('got l3')
print('final shape: ',np.shape(l_1+l_2+l_4))

return (l_1+l_3+l_4)'''

, что я получаю из этого, это: orig shape (x): (?, 2501) try shape (x): (2501, 1) tfshape (a): (1,) shape (a): (1,) tfshape (мс): (2500, 1) получил r_size: 50 c_size: 50 закончил повышающую дискретизацию hot h, и w получил шумную картинку, получил чистуюрис получил l_4 получил четыре рыцаря получил l1 получил l2 получил l3 окончательную форму: ()

, что означает, что ему удалось пройти весь путь через функцию.

Пользовательские потери, которые я ввел вкомпилятор был '' 'def custom_loss (рис.):

def my_loss(y_true, y_pred):
return dl_loss(y_pred,pic)

return my_loss'''

Проблема 2:

'''ms=upsample(ms_reshaped,2) #THIS IS MY OWN FUNCTION THAT I ALSO NEED 
HELP WITH
print('finished upsampling')'''

фактическое определение upsample:' '' def upsample (pic, frac): frac =яnt (frac) r_siz = np.shape (pic) [0] print ('r_size:', r_siz) c_siz = np.shape (pic) [1] print ('c_size:', c_siz) new_pic = np.zeros ((frac r_siz, frac c_siz)) для i в диапазоне (r_siz): для j в диапазоне (c_siz):

# new_pic [frac i: frac i+ frac, frac j: frac j + frac] = pic [i, j] * np.ones ((frac, frac))

new_pic[frac*i:frac*i+frac,frac*j:frac*j+frac]=3*np.ones((frac,frac))
return new_pic'''

Мне пришлось изменить рис [i, j] просто к некоторому случайному числу 3, чтобы оно запустилось.Я знаю, что изображение, которое здесь находится, является объектом тензорного потока, и когда компилятор пытается запустить, у него нет фактической матрицы, а просто заполнитель, вероятно, так что, может быть, в этом проблема?Я собираюсь его скомпилировать, а потом изменить.В любом случае, как я могу это исправить?

Большое спасибо всем, кто пытается понять проблему!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...