我想设置一个Convolution2D图层的权重:
conv = Convolution2D(conv_out_size, window_size, embedding_size,
border_mode='same',
activation='relu',
weights=weights,
name='conv_{:d}'.format(i))(in_x)
Run Code Online (Sandbox Code Playgroud)
但我不确定这里的预期.我尝试了几件事,但大多数时候我都会尝试
ValueError: You called `set_weights(weights)` on layer "conv_0" with a weight list of length 1, but the layer was expecting 2 weights.
Run Code Online (Sandbox Code Playgroud)
不确定这究竟意味着什么.
小智 12
您应该通过set_weights方法将numpy数组传递给卷积层.
请记住,卷积层的权重不仅是每个单独滤波器的权重,还包括偏差.因此,如果您想设置权重,则需要添加额外的维度.
例如,如果要设置一个除了中心元素之外所有权重为零的1x3x3过滤器,则应该进行以下操作:
w = np.asarray([
[[[
[0,0,0],
[0,2,0],
[0,0,0]
]]]
])
Run Code Online (Sandbox Code Playgroud)
然后设置它.
对于您可以运行的代码:
#!/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))
Run Code Online (Sandbox Code Playgroud)
尝试更改卷积填充器中的中心元素(示例中为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)
Run Code Online (Sandbox Code Playgroud)
打印原始权重(使用正态分布初始化,init ='normal')
print (model_network.layers[1].get_weights())
Run Code Online (Sandbox Code Playgroud)
创建所需的权重张量w和一些输入input_mat
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.]
]]
])
Run Code Online (Sandbox Code Playgroud)
设置你的重量并打印它们
model_network.layers[1].set_weights(w)
print("Weights after change:")
print(model_network.layers[1].get_weights())
Run Code Online (Sandbox Code Playgroud)
最后,用它来生成带预测的输出(预测自动编译你的模型)
print(model_network.predict(input_mat))
Run Code Online (Sandbox Code Playgroud)
示例输出:
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.]]]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6342 次 |
| 最近记录: |