作者dogs1231992 (河豚)
看板Python
标题[问题] TensorFlow如何设定复杂的loss function?
时间Fri Feb 1 05:02:10 2019
各位大家好,小弟最近想用TensorFlow来完成NN的部分
目前数据都准备好了,TensorFlow的部分则是上网查了一些资料,层及进出都设定好了
只是我遇到一个关於loss function的问题
一般训练都是N个数据进去,M个数据出来,用这M个数据与参考值求误差
但我的状况是:
我有一个三维的资料: N x M x P
里面有 N 个images,每个images有 M 个原子,每个原子有 P 个参数
希望可以利用同一个 (或者依照原子不同而分类成多个) NN
在我输入P个数据後,可以得到答案Ep
同一个image里面所有原子M的Ep加总後会得到一个值 En
全部资料会有N个En,这些En与参考值求误差後即为我的loss
目前卡在不知道该如何将M次计算後的Ep全部加总在一起
------------------------------------------------------------------------------
如果也可以描述成:
我每次都丢一组数据 P 进到NN里面,完成计算後我会得到 N x M 组答案 Ep
我的loss function是将 第0-5个Ep加总在一起 与 参考值1 相减後取平方
将 第6-20个Ep加总在一起 与 参考值2 相减後取平方
最後将所有数据取平均
(初期可以假设每组Ep都是相等数量,但还是会面临到加总的问题)
不知到是否有前辈们知道该如何解决呢? 谢谢Q____Q
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 45.3.74.48
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1548968533.A.407.html
1F:→ djshen: 数学式写出来阿 02/01 08:15
假设系统有2个images, n1 及 n2
n1 包含3个原子 m1_1 m1_2 m1_3 分别是种类 s1 s1 s2,n1的能量是E1
n2 包含3个原子 m2_1 m2_2 m2_3 分别是种类 s1 s2 s2,n2的能量是E2
将所有s1原子放入NN1,可以得到三组Output E1_1 E1_2 E2_1
(假设NN1是 2 x 15 x 1 的NN) (一个隐藏层) (每个s1都有2个参数)
将所有s2原子放入NN2,可以得到三组Output E1_3 E2_2 E2_3
(假设NN2是 8 x 15 x 1 的NN) (一个隐藏层) (每个s2都有8个参数)
loss function = [(E1_1 + E1_2 + E1_3 - E1)^2 + (E2_1 + E2_2 + E2_3 - E2)^2]/2
或者
loss function = average( (sum(En_:) - En)^2 ) n = n1 n2 n3 ......
------------------------------------------------------------------------------
未来如果可能的话希望能把NN1改成 2 x 15 x 3
出来的3个数据(a1 a2 a3)与第一层的2个数据(b1 b2)进行复杂的计算
先假设为:
E1_1 = (a1*b1+a2**b2)/a3
E1_2 = (a1*b1+a2**b2)/a3
E1_3 = 另一个类似的复杂公式
接着重复一样的loss function
------------------------------------------------------------------------------
目前卡在每次进行NN计算後我都只能得到一个值,例如:E1_1
如果是这样的话就没办法进行loss function的计算
想请问是否有什麽方法可以让我把 E1_1 E1_2 E1_3 全部算完後再计算loss function呢?
谢谢 :)
※ 编辑: dogs1231992 (73.251.28.27), 02/01/2019 13:55:17
2F:推 f496328mm: 你loss function要设计的有弹性,不要写死 02/01 14:09
f大您好,我目前参考的是莫烦的范例
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
reduction_indices=[1]))
在他的范例里面由於prediction是直接从NN的结果得到,因此不会有其它计算的问题
想请问您是否有相关关键字或者程式码可以让小弟拜读呢?
我最近找google的资料,几乎都是用上述这类方法来写loss function
还没看到有较为弹性的范例的说
※ 编辑: dogs1231992 (73.251.28.27), 02/01/2019 14:19:05
3F:→ yoyololicon: 你有设定batch size 吗?还是都一个个喂? 02/01 16:29
4F:→ yoyololicon: 老实说你的loss function 看起来蛮蛮基本的,不懂为 02/01 16:31
5F:→ yoyololicon: 何会卡住 02/01 16:31
Y大,我没有设定Batch Size (或者说我不知道我有没有设定)
我的input目前是 4 x 2 的矩阵
(我把两个images的原子共四个放在一起,每个原子有两个参数)
NN为 2 x 15 x 1
输出Ys会是一个 4 x 1 的矩阵
此时我得手动分配第0-1个输出是属於第一个image,第2-3个输出属於第二个image
------------------------------------------------------------------------------
如果可能的话,我希望输入是 2 x 2 x 2 的矩阵
有 2 个images,每个image有 2 个 原子 (或者说最多2个),每个原子有 2 个参数
一次进去一整个image,然後输出整个image的答案
------------------------------------------------------------------------------
如果说把整个矩阵转成下列方法会比较方便的话我也想试试看:
种类 s1 有 4个原子,每个原子有 2个参数,NN1输入是 4 x 2,输出是 4 x 1
种类 s2 有 5个原子,每个原子有 3个参数,NN2输入是 5 x 3,输出是 5 x 1
同时跑完 NN1 及 NN2 之後拿 4 x 1 及 5 x 1的答案进行loss function 的计算
再用这个 loss function 回去训练 NN1 及 NN2 (同时训练?)
※ 编辑: dogs1231992 (45.3.84.194), 02/02/2019 02:39:05
6F:推 yoyololicon: 我会建议你不要用一个个原子去想 而是用image的角度 02/02 07:39
7F:→ yoyololicon: 因为你的目标En单位是每个image 02/02 07:39
8F:→ yoyololicon: 就直接用(N, M, P)大小的矩阵直接去train不用拆开 02/02 07:41
9F:→ yoyololicon: 对应的label为长度(N,)的矩阵 这边N就是batch size 02/02 07:42
Y大,想请问您的意思是是否为:
我的单一个input就是 M x P 的矩阵
输出则为 M个参数 或者 直接把所有输出加总在一起变成一个En?
N个images在训练後就会得到 N个 En
如果是这样的话,想请问是否有办法在输入 M x P 的矩阵时分辨谁要走NN1,谁要走NN2?
第一次接触TensorFlow,还没办法从之前的观念转过来 Q___Q
※ 编辑: dogs1231992 (73.251.28.27), 02/02/2019 12:11:46