Keras layer.set#u权重不';不要修改图层。为什么?

Keras layer.set#u权重不';不要修改图层。为什么?,keras,Keras,当我初始化并将权重加载到模型时,输出的准确率为67% model.load\u权重(路径+'results/finetune\u train\u last\u layer.h5') 批次=模型。获取批次(路径,随机播放=假,批次大小=128,类模式=无) preds=模型预测发生器(批次、批次、nb样本) 匹配项=0 对于猜测,zip中的ans(np.argmax(preds,axis=1),batches.classes): 如果guess==ans: 匹配项+=1 打印(“%s/%s%”(匹

当我初始化并将权重加载到模型时,输出的准确率为67%

model.load\u权重(路径+'results/finetune\u train\u last\u layer.h5')
批次=模型。获取批次(路径,随机播放=假,批次大小=128,类模式=无)
preds=模型预测发生器(批次、批次、nb样本)
匹配项=0
对于猜测,zip中的ans(np.argmax(preds,axis=1),batches.classes):
如果guess==ans:
匹配项+=1
打印(“%s/%s%”(匹配项,len(batches.class)))
532/792
层已正确加载。这与我在保存这些重量之前的上一轮训练中获得的精确度相同

但是,当我尝试创建一个新模型,该模型与
模型中的最后一层具有相同的层,并复制权重时,它们没有相同的权重。这怎么可能

no\u drop\u model=Sequential([
MaxPoolig2D(输入_形状=(512,14,14)),
展平(),
稠密(4096,活化='relu'),
辍学(0.),
稠密(4096,活化='relu'),
辍学(0.),
密集型(120,激活='softmax')
])
对于ndl,zip中的fcl(无拖放模式层,模式层[31:]):
打印(类型(ndl)、类型(fcl))
ndl.set_weights(fcl.get_weights())
如果ndl.get_weights():
打印(np.array_equiv(ndl.get_weights(),fcl.get_weights()))
输出:

(<class 'keras.layers.pooling.MaxPooling2D'>, <class 'keras.layers.pooling.MaxPooling2D'>)
(<class 'keras.layers.core.Flatten'>, <class 'keras.layers.core.Flatten'>)
(<class 'keras.layers.core.Dense'>, <class 'keras.layers.core.Dense'>)
False
(<class 'keras.layers.core.Dropout'>, <class 'keras.layers.core.Dropout'>)
(<class 'keras.layers.core.Dense'>, <class 'keras.layers.core.Dense'>)
False
(<class 'keras.layers.core.Dropout'>, <class 'keras.layers.core.Dropout'>)
(<class 'keras.layers.core.Dense'>, <class 'keras.layers.core.Dense'>)
False
(,)
(, )
(, )
假的
(, )
(, )
假的
(, )
(, )
假的

model.get_weights()
的返回值是numpy数组的列表,而不是单个数组。您应该像这样比较权重:

def create_model():
i=输入((2,))
o=密度(3)(i)
返回模型(i,o)
model1=创建_模型()
model2=创建_模型()
对于zip中的w1、w2(model1.get_-weights(),model2.get_-weights()):
打印(np.数组_当量(w1,w2))
模型2.设置权重(模型1.获取权重()
打印“之后的权重:”
对于zip中的w1、w2(model1.get_-weights(),model2.get_-weights()):
打印(np.数组_当量(w1,w2))
这将产生以下输出:

False
True
Weights after:
True
True

权重列表中的第二个元素对应于初始化为零的偏差值,因此在复制权重之前,这些值是相同的。

模型的返回值。get_weights()是numpy数组的列表,而不是单个数组。您应该像这样比较权重:

def create_model():
i=输入((2,))
o=密度(3)(i)
返回模型(i,o)
model1=创建_模型()
model2=创建_模型()
对于zip中的w1、w2(model1.get_-weights(),model2.get_-weights()):
打印(np.数组_当量(w1,w2))
模型2.设置权重(模型1.获取权重()
打印“之后的权重:”
对于zip中的w1、w2(model1.get_-weights(),model2.get_-weights()):
打印(np.数组_当量(w1,w2))
这将产生以下输出:

False
True
Weights after:
True
True

权重列表中的第二个元素对应于初始化为零的偏差值,因此在复制权重之前,这些值是相同的。

Nice!这样做也更干净。谢谢你的回复,很好!这样做也更干净。谢谢你的回复。