我想将2D稀疏矩阵转换为3D矩阵,因为我需要将其作为conv1d层的输入,该层需要3D张量
下面是conv1d层的输入
from scipy.sparse import hstack
other_features_train = hstack((X_train_state_ohe, X_train_teacher_ohe, X_train_grade_ohe, X_train_category_ohe, X_train_subcategory_ohe,X_train_price_norm,X_train_number_norm))
other_features_cv = hstack((X_cv_state_ohe, X_cv_teacher_ohe, X_cv_grade_ohe,X_cv_category_ohe,X_cv_subcategory_ohe,X_cv_price_norm,X_cv_number_norm))
other_features_test = hstack((X_test_state_ohe, X_test_teacher_ohe, X_test_grade_ohe,X_test_category_ohe,X_test_subcategory_ohe,X_test_price_norm,X_test_number_norm))
print(other_features_train.shape)
print(other_features_cv.shape)
print(other_features_test.shape)
列车形状、cv和试验数据
(49041, 101)
(24155, 101)
(36052, 101)
这是我的模型架构
tf.keras.backend.clear_session()
vec_size = 300
input_model_1 = Input(shape=(300,),name='essay')
embedding = Embedding(vocab_size_essay, vec_size, weights=[word_vector_matrix], input_length = max_length, trainable=False)(input_model_1)
lstm = LSTM(16)(embedding)
flatten_1 = Flatten()(lstm)
input_model_2 = Input(shape=(101, ),name='other_features')
conv_layer1 = Conv1D(32, 3, strides=1, padding='valid', kernel_initializer='glorot_uniform', activation='relu')(input_model_2)
conv_layer2 = Conv1D(32, 3, strides=1, padding='valid', kernel_initializer='glorot_uniform', activation='relu')(conv_layer1)
conv_layer3 = Conv1D(32, 3, strides=1, padding='valid', kernel_initializer='glorot_uniform', activation='relu')(conv_layer2)
flatten_2 = Flatten()(conv_layer3)
concat_layer = concatenate(inputs=[flatten_1, flatten_2],name='concat')
dense_layer_1 = Dense(units=32, activation='relu', kernel_initializer='he_normal', name='dense_layer_1')(concat_layer)
dropout_1 = Dropout(0.2)(dense_layer_1)
dense_layer_2 = Dense(units=32, activation='relu', kernel_initializer='he_normal', name='dense_layer_2')(dropout_1)
dropout_2 = Dropout(0.2)(dense_layer_2)
dense_layer_3 = Dense(units=32, activation='relu', kernel_initializer='he_normal', name='dense_layer_3')(dropout_2)
output = Dense(units=2, activation='softmax', kernel_initializer='glorot_uniform', name='output')(dense_layer_3)
model_3 = Model(inputs=[input_model_1,input_model_2],outputs=output)
当我尝试给出2d数组时,我得到了这个错误
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-18-44c8f6f0caa7> in <module>
9
10 input_model_2 = Input(shape=(101, ),name='other_features')
---> 11 conv_layer1 = Conv1D(32, 3, strides=1, padding='valid', kernel_initializer='glorot_uniform', activation='relu')(input_model_2)
12 conv_layer2 = Conv1D(32, 3, strides=1, padding='valid', kernel_initializer='glorot_uniform', activation='relu')(conv_layer1)
13 conv_layer3 = Conv1D(32, 3, strides=1, padding='valid', kernel_initializer='glorot_uniform', activation='relu')(conv_layer2)
~\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py in __call__(self, inputs, *args, **kwargs)
810 # are casted, not before.
811 input_spec.assert_input_compatibility(self.input_spec, inputs,
--> 812 self.name)
813 graph = backend.get_graph()
814 with graph.as_default(), backend.name_scope(self._name_scope()):
~\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\input_spec.py in assert_input_compatibility(input_spec, inputs, layer_name)
175 'expected ndim=' + str(spec.ndim) + ', found ndim=' +
176 str(ndim) + '. Full shape received: ' +
--> 177 str(x.shape.as_list()))
178 if spec.max_ndim is not None:
179 ndim = x.shape.ndims
ValueError: Input 0 of layer conv1d is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 101]
model_3.summary()
model_3.compile(loss = "binary_crossentropy", optimizer=Adam()
编译模型
model_3.compile(loss = "binary_crossentropy", optimizer=Adam(), metrics=["accuracy"])
符合模型
model_3.fit(train_features,y_train_ohe,batch_size=16,epochs=10,validation_data=(cv_features,y_cv_ohe))
train_features = [train_text, other_features_train]
cv_features = [cv_text, other_features_cv]
test_featues = [test_text, other_features_test]
文本特征
train_text = X_train['essay'].tolist()
cv_text = X_cv['essay'].tolist()
test_text = X_test['essay'].tolist()
token = Tokenizer()
token.fit_on_texts(train_text)
vocab_size_essay = len(token.word_index) + 1
print("No. of unique words = ", vocab_size_essay)
encoded_train_text = token.texts_to_sequences(train_text)
encoded_cv_text = token.texts_to_sequences(cv_text)
encoded_test_text = token.texts_to_sequences(test_text)
#print(encoded_test_text[:5])
max_length = 300
train_text = pad_sequences(encoded_train_text, maxlen=max_length, padding='post')
cv_text = pad_sequences(encoded_cv_text, maxlen=max_length, padding='post')
test_text = pad_sequences(encoded_test_text, maxlen=max_length, padding='post')
print("\n")
print(train_text.shape)
print(cv_text.shape)
print(test_text.shape)
文本特征的形状
No. of unique words = 41468
(49041, 300)
(24155, 300)
(36052, 300)
所以,我想在
(49041,101,1)
(24155,101,1)
(36052,101,1)
请建议怎么做
您只需使用
np.reshape
https://numpy.org/doc/1.18/reference/generated/numpy.reshape.html
另外,您需要更改这一行
input_model_2 = Input(shape=(101, 1),name='other_features')
Conv1D需要的是三维数据,而不是二维数据
解决方案
这里的解决方案需要明确以下几个概念。我将解释这些概念 在下面的章节中
keras
模型进行何种修改以允许稀疏输入矩阵numpy
数组转换为3Dnumpy
数组scipy.sparse.coo_matrix
用于2Dnumpy
数组sparse.COO
用于3Dnumpy
数组使用稀疏矩阵作为
tf.keras
模型的输入一个选项是使用以下命令将稀疏输入矩阵转换为非稀疏(密集)格式:
todense()
方法。这使得矩阵成为一个规则的numpy
数组。参见kaggle的讨论, [3]和[4]另一种选择是通过以下方式为稀疏和密集输入编写自己的自定义层: 子类化
tf.keras.layers.Layer
类。见这篇文章[2]看起来
tensorflow.keras
现在允许使用稀疏权重进行模型训练。所以 在某些地方,它有能力处理稀疏性。您可能需要浏览文档, [1]在这方面向numpy阵列添加新轴
您可以使用
np.newaxis
将另一个轴添加到numpy数组,如下所示输出:
话虽如此,请查看参考资料部分的链接
稀疏阵列
由于稀疏数组的非零值非常少,因此在转换时会使用常规numpy数组 在稀疏数组中,以几种稀疏格式存储:
csr_matrix
:非零值和索引的行数组csc-matrix
:非零值和索引的按列数组coo-matrix
:一个有三列的表Scipy稀疏矩阵需要2D输入矩阵
然而,上述三种稀疏矩阵的实现 将二维非稀疏矩阵视为输入
来自3D非稀疏输入矩阵的稀疏矩阵
是的,您可以使用^{} 库执行此操作。
它还支持
scipy.sparse
和numpy
数组。将稀疏矩阵转换为 非稀疏(密集)格式(这不是神经网络中的密集层),使用todense()
方法Source
PyTorch:
torch.sparse
🔥 ⭐PyTorch库还提供了使用Space张量的方法
文档
torch.sparse
:https://pytorch.org/docs/stable/sparse.html#sparse-coo-docs参考资料
Train sparse TensorFlow models with Keras
How to design deep learning models with sparse inputs in Tensorflow Keras
Neural network for sparse matrices
Training Neural network with scipy sparse matrix?
Documentation of ^{} library
相关问题 更多 >
编程相关推荐