从csv文件导入权重:层权重形状(672、7)与提供的权重形状(1、1、672、7)不兼容

时间:2018-07-26 15:54:42

标签: python keras

我正在用Keras编写深度学习网络,之前已经在Matlab中进行了测试。为了避免进行所有学习,我将Matlab中最后一层的权重和偏差导出为.csv文件,并希望在我的网络中使用它们-因此我的网络将仅根据给定的权重测试分数,而不是整个学习。

代码:

import os
os.environ['KERAS_BACKEND'] = 'tensorflow'
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten, Input
from keras.layers import Convolution2D, MaxPooling2D
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
#from keras import backend as K
from keras.preprocessing import image

print("\n")
print("\n")
trained_weights = []
trained_bias = []

trained_weights = np.loadtxt('Weights.csv', delimiter=';')
trained_bias = np.loadtxt('Bias.csv', delimiter=';')

network_weights = np.array([[trained_weights]])
network_bias = np.array([[trained_bias]])
network_outputs = np.array([['a','c','d','e','f','g','h']])

# Load test image
img = load_img('note_a.png')
note = image.img_to_array(img)
#note = np.expand_dims(note, axis=0)
note = np.reshape(note, [1, 50, 30, 3])

# Model architecture
model = Sequential()

# Layer 1
model.add(Convolution2D(12, (6, 6), batch_size=1, input_shape=(50, 30, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2))

# Layer 2
model.add(Convolution2D(24, (6, 6), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2))

# Layer 3
model.add(Convolution2D(48, (6, 6), activation='relu'))

model.add(Flatten())

layer2=Dense(7, weights=[network_weights, network_bias], activation='softmax')
model.add(layer2)

model.summary()
print("\n")
print("\n")

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy'])

#model.fit((note,network_outputs), batch_size=32, nb_epoch=10, verbose=1)
#score = model.evaluate(note, network_outputs)

我正在尝试使用

model.set_weights([network_outputs])

,但似乎只将权重分配给网络的第一层,因此我只将权重分配给了最后一层。结果是以下错误:

  

ValueError:图层权重形状(672、7)与提供的权重形状(1、1、672、7)不兼容

这对我来说很混乱。如何通过执行 weights = [network_weights,network_bias] 来获得4个维度?是因为network_weights的尺寸为[1,672],并且network_bias = [1,7]等于[1,1,672,7]?

以及如何正确调整此权重参数的大小?

1 个答案:

答案 0 :(得分:1)

np.array([[trained_weights]])会根据数据创建一个由2个空维度包围的数组,因此最终形状为(1、1,x,y)。您的trained_bias也一样。应用[network_weights, network_bias]会再次使您的2个数组周围具有一个明显不匹配的维度。

我认为您只需要使用类似的东西来清理所有不必要的环境即可

weights=[trained_weights, trained_bias]