Keras 如何设置卷积2D的权重?

Keras 如何设置卷积2D的权重?,keras,Keras,我想设置卷积2D层的权重: conv=Convolution2D(conv\u out\u大小、窗口大小、嵌入大小、, border_mode='same', 激活='relu', 重量=重量, name='conv{:d}.格式(i))(in_x) 但我不确定这里会发生什么。我试过几种方法,但大多数时候我都失败了 ValueError: You called `set_weights(weights)` on layer "conv_0" with a weight list of len

我想设置
卷积2D
层的权重:

conv=Convolution2D(conv\u out\u大小、窗口大小、嵌入大小、,
border_mode='same',
激活='relu',
重量=重量,
name='conv{:d}.格式(i))(in_x)
但我不确定这里会发生什么。我试过几种方法,但大多数时候我都失败了

ValueError: You called `set_weights(weights)` on layer "conv_0" with a  weight list of length 1, but the layer was expecting 2 weights. 

我不知道这到底意味着什么

您应该通过set_weights方法将numpy数组传递给卷积层

请记住,卷积层的权重不仅是每个单独滤波器的权重,还包括偏差。因此,如果你想设置你的权重,你需要添加一个额外的维度

例如,如果要将1x3x3过滤器设置为除中心元素外的所有权重均为零,则应将其设置为:

w = np.asarray([ 
    [[[
    [0,0,0],
    [0,2,0],
    [0,0,0]
    ]]]
    ])
然后设置它

对于可以运行的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import numpy as np
np.random.seed(1234)
from keras.layers import Input
from keras.layers.convolutional import Convolution2D
from keras.models import Model
print("Building Model...")
inp = Input(shape=(1,None,None))
output   = Convolution2D(1, 3, 3, border_mode='same', init='normal',bias=False)(inp)
model_network = Model(input=inp, output=output)
print("Weights before change:")
print (model_network.layers[1].get_weights())
w = np.asarray([ 
    [[[
    [0,0,0],
    [0,2,0],
    [0,0,0]
    ]]]
    ])
input_mat = np.asarray([ 
    [[
    [1.,2.,3.],
    [4.,5.,6.],
    [7.,8.,9.]
    ]]
    ])
model_network.layers[1].set_weights(w)
print("Weights after change:")
print(model_network.layers[1].get_weights())
print("Input:")
print(input_mat)
print("Output:")
print(model_network.predict(input_mat))
尝试更改卷积填充器中的中心元素(示例中为2)

代码的作用:

首先建立一个模型

inp = Input(shape=(1,None,None))
output   = Convolution2D(1, 3, 3, border_mode='same', init='normal',bias=False)(inp)
model_network = Model(input=inp, output=output)
打印原始权重(使用正态分布初始化,init='normal')

创建所需的权重张量w和一些输入矩阵

w = np.asarray([ 
    [[[
    [0,0,0],
    [0,2,0],
    [0,0,0]
    ]]]
    ])
input_mat = np.asarray([ 
    [[
    [1.,2.,3.],
    [4.,5.,6.],
    [7.,8.,9.]
    ]]
    ])
设定重量并打印出来

model_network.layers[1].set_weights(w)
print("Weights after change:")
print(model_network.layers[1].get_weights())
最后,使用它生成带有predict的输出(predict自动编译您的模型)

示例输出:

Using Theano backend.
Building Model...
Weights before change:
[array([[[[ 0.02357176, -0.05954878,  0.07163535],
         [-0.01563259, -0.03602944,  0.04435815],
         [ 0.04297942, -0.03182618,  0.00078482]]]], dtype=float32)]
Weights after change:
[array([[[[ 0.,  0.,  0.],
         [ 0.,  2.,  0.],
         [ 0.,  0.,  0.]]]], dtype=float32)]
Input:
[[[[ 1.  2.  3.]
   [ 4.  5.  6.]
   [ 7.  8.  9.]]]]
Output:
[[[[  2.   4.   6.]
   [  8.  10.  12.]
   [ 14.  16.  18.]]]]

哦,谢谢!我不清楚。文件中没有具体说明砝码形状的具体要求。谢谢你的例子!
print(model_network.predict(input_mat))
Using Theano backend.
Building Model...
Weights before change:
[array([[[[ 0.02357176, -0.05954878,  0.07163535],
         [-0.01563259, -0.03602944,  0.04435815],
         [ 0.04297942, -0.03182618,  0.00078482]]]], dtype=float32)]
Weights after change:
[array([[[[ 0.,  0.,  0.],
         [ 0.,  2.,  0.],
         [ 0.,  0.,  0.]]]], dtype=float32)]
Input:
[[[[ 1.  2.  3.]
   [ 4.  5.  6.]
   [ 7.  8.  9.]]]]
Output:
[[[[  2.   4.   6.]
   [  8.  10.  12.]
   [ 14.  16.  18.]]]]