Numpy 特定形状的Keras初始值设定项

Numpy 特定形状的Keras初始值设定项,numpy,keras,keras-2,Numpy,Keras,Keras 2,我制作了一个小型keras模型,并使用以下代码获得模型的权重: from keras.models import Sequential from keras.layers import Dense, Flatten,Conv2D, MaxPooling2D input_shape = (28, 28, 1) model = Sequential() model.add(Conv2D(1, kernel_size=(2, 2), activation='relu'

我制作了一个小型keras模型,并使用以下代码获得模型的权重:

from keras.models import Sequential
from keras.layers import Dense, Flatten,Conv2D, MaxPooling2D
input_shape = (28, 28, 1)
model = Sequential()
model.add(Conv2D(1, kernel_size=(2, 2),
                 activation='relu',
                 input_shape=input_shape,trainable=False))
model.add(MaxPooling2D(pool_size=(16,16)))
model.add(Flatten())
model.add(Dense(3, activation='softmax',trainable=False))
a=model.get_weights()
from keras.initializers import glorot_uniform
W1 = glorot_uniform((a,))
现在,我想使用keras初始值设定项将权重初始化为a的相同形状,我使用以下代码:

from keras.models import Sequential
from keras.layers import Dense, Flatten,Conv2D, MaxPooling2D
input_shape = (28, 28, 1)
model = Sequential()
model.add(Conv2D(1, kernel_size=(2, 2),
                 activation='relu',
                 input_shape=input_shape,trainable=False))
model.add(MaxPooling2D(pool_size=(16,16)))
model.add(Flatten())
model.add(Dense(3, activation='softmax',trainable=False))
a=model.get_weights()
from keras.initializers import glorot_uniform
W1 = glorot_uniform((a,))
我的方法正确吗?如果它是错误的,请向我建议解决方案,如果它是正确的,那么为什么我不能看到重量,它显示:

<keras.initializers.VarianceScaling at 0x7f65746ba128>

关于
获取权重()

方法
model.get_weights()
将返回numpy数组的列表。因此,您必须注意创建一个具有相同数量数组、相同顺序和相同形状的列表

在这个模型中,列表中似乎有4个数组,卷积核和偏差加上密集核和偏差。每个都有不同的形状

关于初始值设定者:

初始值设定项是将
形状
作为输入并返回
张量
的函数

您会看到
VarianceScaling
,因为它可能是函数的名称。应使用形状调用函数以获得结果:

weights = [glorot_uniform()(npArray.shape) for npArray in a]   
它们将是keras张量,而不是numpy数组。您应该
K.eval(arr)
将它们作为numpy数组

如果使用
model.set_weights()
,则使用numpy数组传递列表(与
get_weights()
中的数字相同,形状相同)

初始值设定项的标准用法:

但实际上,初始值设定项用于直接创建层,如果不想指定种子和其他初始值设定项参数,可以只使用字符串:

from keras.models import Sequential
from keras.layers import Dense, Flatten,Conv2D, MaxPooling2D
input_shape = (28, 28, 1)
model = Sequential()
model.add(Conv2D(1, kernel_size=(2, 2),
                 activation='relu',
                 input_shape=input_shape,
                 trainable=False,
                 kernel_initializer='glorot_uniform', #example with string
                 bias_initializer='zeros'))
model.add(MaxPooling2D(pool_size=(16,16)))
model.add(Flatten())
model.add(Dense(3, 
                activation='softmax',
                trainable=False, 
                kernel_initializer=glorot_uniform(seed=None), #example creating a function
                bias_initializer='zeros'))

阅读更多关于这里的信息

关于
获取权重()

方法
model.get_weights()
将返回numpy数组的列表。因此,您必须注意创建一个具有相同数量数组、相同顺序和相同形状的列表

在这个模型中,列表中似乎有4个数组,卷积核和偏差加上密集核和偏差。每个都有不同的形状

关于初始值设定者:

初始值设定项是将
形状
作为输入并返回
张量
的函数

您会看到
VarianceScaling
,因为它可能是函数的名称。应使用形状调用函数以获得结果:

weights = [glorot_uniform()(npArray.shape) for npArray in a]   
它们将是keras张量,而不是numpy数组。您应该
K.eval(arr)
将它们作为numpy数组

如果使用
model.set_weights()
,则使用numpy数组传递列表(与
get_weights()
中的数字相同,形状相同)

初始值设定项的标准用法:

但实际上,初始值设定项用于直接创建层,如果不想指定种子和其他初始值设定项参数,可以只使用字符串:

from keras.models import Sequential
from keras.layers import Dense, Flatten,Conv2D, MaxPooling2D
input_shape = (28, 28, 1)
model = Sequential()
model.add(Conv2D(1, kernel_size=(2, 2),
                 activation='relu',
                 input_shape=input_shape,
                 trainable=False,
                 kernel_initializer='glorot_uniform', #example with string
                 bias_initializer='zeros'))
model.add(MaxPooling2D(pool_size=(16,16)))
model.add(Flatten())
model.add(Dense(3, 
                activation='softmax',
                trainable=False, 
                kernel_initializer=glorot_uniform(seed=None), #example creating a function
                bias_initializer='zeros'))

阅读更多关于这里的信息

weights=[glorot_uniform()(npArray.shape)用于a中的npArray]
这行代码对我有很大帮助@Daniel。thnnParray和nparray
nparray
之间的区别只是一个变量名。我使用这个名称只是为了记住这个变量是一个numpy数组。从'weights=[glorot_uniform()(npArray.shape)for a中的npArray]`我想将glorot_uniform替换为numpy数组,如下代码:
unif=glorot_uniform()X=K.eval(unif((1,11)))Z=[X()(npArray.shape)for a中的npArray]
但获取错误
TypeError:“numpy.ndarray”对象不可调用
若要重塑numpy数组,请执行
X.reformate(someShape)
--在该列表中,您可以尝试:
权重=[X.reformate(W.shape)表示X,W表示zip(arraysFromOtherProgram,a)]
权重=[glorot\u uniform()(npArray.shape)表示a中的npArray]这句话对我有很大帮助@Daniel。thnnParray和nparray
nparray
之间的区别只是一个变量名。我使用这个名称只是为了记住这个变量是一个numpy数组。从'weights=[glorot_uniform()(npArray.shape)for a中的npArray]`我想将glorot_uniform替换为numpy数组,如下代码:
unif=glorot_uniform()X=K.eval(unif((1,11)))Z=[X()(npArray.shape)for a中的npArray]
但获取错误
TypeError:“numpy.ndarray”对象不可调用
若要重塑numpy数组,请执行
X.restrape(someShape)
--在该列表中,您可以尝试:
权重=[X.restrape(W.shape)for X,W In-zip(arraysFromOtherProgram,a)]