Я создаю пользовательскую функцию потерь, которая включает в себя много кода и уравнений.Когда я пытаюсь скомпилировать свою модель следующим образом:
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, чтобы оно запустилось.Я знаю, что изображение, которое здесь находится, является объектом тензорного потока, и когда компилятор пытается запустить, у него нет фактической матрицы, а просто заполнитель, вероятно, так что, может быть, в этом проблема?Я собираюсь его скомпилировать, а потом изменить.В любом случае, как я могу это исправить?
Большое спасибо всем, кто пытается понять проблему!