Большое спасибо за вашу помощь!Я на самом деле решил перейти на tf 2.0, и написание функций там НАМНОГО проще, хотя это немного дороже с точки зрения эффективности, я всегда могу очень легко переключаться с массивов np на тензоры и обратно, поэтому я просто написал все это в формате numpy arrayи переключил его обратно.Таким образом, входы и выходы для всех моих функций являются тензорами, но внутри функций я переключаю их на пустые массивы и, прежде чем вернуть их обратно, переключаю обратно на тензоры, но у меня все еще есть ошибка.Код выглядит так:
model.compile(optimizer='rmsprop',loss=custom_loss(pic),
loss_weights=[None],metrics=['accuracy'])
def my_loss(y_true, y_pred):
return loss(y_pred,pic)
def custom_loss(pic):
return my_loss
И когда я на самом деле пытаюсь запустить функции потерь (не в файле model.com) следующим образом:
my_loss(x0,x0)
, я получаю следующее:
orig shape x: (1, 2501)
shape x: (2501,)
shape pic: (100, 100)
shape a: ()
shape ms: (2500,)
r_size: 50
c_size: 50
<tf.Tensor: id=261, shape=(), dtype=float64, numpy=6.741635588952273>
Таким образом, я получаю вывод тензора с потерей, которую я хотел.(напечатаны вещи, которые помогут понять ошибку) ОДНАКО, когда я пытаюсь запустить команду компиляции, я получаю это:
orig shape x: ()
(...a bunch of unneccessary stuff...)
----> 4 x=np.reshape(x,(2501,1))
5 x=np.reshape(x,(2501,))
6 pic=np.array(pic)
/usr/local/lib/python3.6/dist-packages/numpy/core/fromnumeric.py in reshape(a,
newshape, order)
290 [5, 6]])
291 """
--> 292 return _wrapfunc(a, 'reshape', newshape, order=order)
293
294
/usr/local/lib/python3.6/dist-packages/numpy/core/fromnumeric.py in
_wrapfunc(obj, method, *args, **kwds)
54 def _wrapfunc(obj, method, *args, **kwds):
55 try:
---> 56 return getattr(obj, method)(*args, **kwds)
57
58 # An AttributeError occurs if the object does not have
ValueError: cannot reshape array of size 1 into shape (2501,1)
Как будто компилятор не понимает, что y_pred будет иметь размервывод моей модели.
Моя модель:
model = tf.keras.Sequential()
#add model layers
model.add(layers.Conv2D(64, kernel_size=3,activation='linear',input_shape=
(inputs_shape_0,inputs_shape_1,1)))
#model.add(LeakyReLU(alpha=0.3))
model.add(layers.Conv2D(32, kernel_size=3,activation='linear'))
#model.add(LeakyReLU(alpha=0.3))
model.add(layers.Flatten())
model.add(layers.Dense(2501, activation='linear'))
Есть идеи как это исправить?Я также посмотрю тестовый код, который вы мне прислали, чтобы получить представление.
Спасибо!