tensorflow 模型計(jì)算中,預(yù)測錯(cuò)誤;權(quán)重參數(shù)加載
tensorflow 模型計(jì)算主要代碼(正確代碼)
linear1_kernel_initializer = tf.constant_initializer(numpy.transpose(data["linear1.weight"]))
linear1_bias_initializer = tf.constant_initializer(numpy.transpose(data["linear1.bias"]))
linear1 = layers.Dense(units=400, activation=tf.nn.relu, kernel_initializer=linear1_kernel_initializer, use_bias=True, bias_initializer=linear1_bias_initializer, input_shape=(48,))
linear2_kernel_initializer = tf.constant_initializer(numpy.transpose(data["linear2.weight"]))
linear2_bias_initializer = tf.constant_initializer(numpy.transpose(data["linear2.bias"]))
linear2 = layers.Dense(units=400, activation=tf.nn.relu, kernel_initializer=linear2_kernel_initializer, use_bias=True, bias_initializer=linear2_bias_initializer)
linear3_kernel_initializer = tf.constant_initializer(numpy.transpose(data["linear3.weight"]))
linear3_bias_initializer = tf.constant_initializer(numpy.transpose(data["linear3.bias"]))
linear3 = layers.Dense(units=2, activation=None, kernel_initializer=linear3_kernel_initializer, use_bias=True, bias_initializer=linear3_bias_initializer)
model = tf.keras.Sequential([linear1, linear2, linear3])
input = numpy.ones((2, 48), dtype=float)
predict = model.predict(input)
print(predict[0:100,:])
原本權(quán)重參數(shù)采用以下代碼
linear1_kernel_initializer = tf.constant_initializer(data["linear1.weight"])
linear1_bias_initializer = tf.constant_initializer((data["linear1.bias"])
但模型預(yù)測值與Matlab計(jì)算值有誤。后經(jīng)過測試定位到 layers.Dense 此處,然后創(chuàng)建 layers.Dense時(shí)設(shè)置use_bias=False參數(shù),不去考慮偏差參數(shù)。改變初始權(quán)重參數(shù)方式:
input_size = 2
units_p = 3
data = numpy.array([1, 1, 2, 2, 2, 3], dtype=float)
linear1_kernel_initializer = tf.constant_initializer(data)
linear1 = layers.Dense(units=units_p, activation=None, kernel_initializer=linear1_kernel_initializer, use_bias=False, input_shape=(input_size,))
#變化data
data = numpy.array([1, 2, 3, 1, 2, 3], dtype=float)
#或者
data = numpy.array([1, 2, 3, 1, 2, 3], dtype=float).reshape(3, 2)
通過這樣的方式,才發(fā)現(xiàn) linear1_kernel_initializer = tf.constant_initializer(data)
中的 data
有問題,通過對預(yù)測結(jié)果的分析,發(fā)現(xiàn) tf.constant_initializer()
會將傳遞過來的數(shù)據(jù)拉成一維,再根據(jù) units
和 不同層
來變更數(shù)據(jù)矩陣大小,所以傳入tf.constant_initializer()
的數(shù)據(jù)只要總大小是對的就可以傳入,而不需要shape一致。
所以,既然之前的數(shù)據(jù)預(yù)測結(jié)果有誤,那就是數(shù)據(jù)排列有誤,將 data 數(shù)據(jù)進(jìn)行矩陣轉(zhuǎn)置 再 傳入到tf.constant_initializer() 函數(shù)中
問題成功解決。
同時(shí)我想說明的是,pytorch
的torch.nn.Linear
是W x + b
而 tensorflow
的 layers.Dense
是 x W + b
。文章來源:http://www.zghlxwxcb.cn/news/detail-658646.html
tensorflow這種情況可以形象的表達(dá)為 流動的關(guān)系,input -> HL1 -> HL2 -> output
(HL1為隱藏層1)
input 卷上 W1 + b1 => HL1結(jié)果
HL1結(jié)果 卷上 W2 + b2 => HL2結(jié)果
HL2結(jié)果 卷上 W3 + b3 => outpu文章來源地址http://www.zghlxwxcb.cn/news/detail-658646.html
到了這里,關(guān)于tensorflow 模型計(jì)算中,預(yù)測錯(cuò)誤;權(quán)重參數(shù)加載的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!