我想实现一个带有稀疏输入层的分类器。我的数据有大约 60 个维度,我想检查特征重要性。为此,我希望第一层具有对角权重矩阵(我想对其应用 L1 核正则化器),所有非对角线都应该是不可训练的零。因此,每个输入通道一对一连接,密集层将混合输入变量。我检查了在 NN 中指定连接(在 keras 中)和层之间的自定义连接 Keras。后一个我不能使用,因为 Lambda 层不引入可训练的权重。
然而,这样的事情不会影响实际的权重矩阵:
class MyLayer(Layer):
def __init__(self, output_dim,connection, **kwargs):
self.output_dim = output_dim
self.connection=connection
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
self.kernel=tf.linalg.tensor_diag_part(self.kernel)
self.kernel=tf.linalg.tensor_diag(self.kernel)
super(MyLayer, self).build(input_shape) # Be sure to call this at the end
def call(self, x):
return K.dot(x, self.kernel)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
Run Code Online (Sandbox Code Playgroud)
当我训练模型并打印权重时,我没有得到第一层的对角矩阵。
我究竟做错了什么?
调用包含或不包含模型顶层的 VGG16 模型有什么区别?我想知道,为什么在不包括顶层的情况下调用模型时,模型摘要中没有显示层的输入参数。我通过以下两种方式使用了 VGG16 模型:
from keras.applications import vgg16
model = vgg16.VGG16(weights='imagenet', include_top=False)
print(model.summary)
Run Code Online (Sandbox Code Playgroud)
模型中层的形状不显示任何输入即(无,无,无,64),请参见下文
Layer (type) Output Shape Param
===================================================================
block1_conv1 (Conv2D) (None, None, None, 64) 1792
block1_conv2 (Conv2D) (None, None, None, 64) 36928
block1_pool (MaxPooling2D) (None, None, None, 64) 0
Run Code Online (Sandbox Code Playgroud)
但是,以下代码返回输入参数
from keras.applications import vgg16
model = vgg16.VGG16()
print(model.summary)
Run Code Online (Sandbox Code Playgroud)
层的形状,在这种情况下,返回输入参数
Layer (type) Output Shape Param
==================================================================
block1_conv1 (Conv2D) (None, 224, 224, 64) 1792
block1_conv2 (Conv2D) (None, 224, 224, 64) 36928
block1_pool (MaxPooling2D) (None, 112, 112, 64) 0
Run Code Online (Sandbox Code Playgroud)
我试图理解为什么会这样,请发表评论
作为练习,我只需要使用密集层来执行文本分类。我想利用词嵌入,问题是数据集是 3D 的(样本、句子的词、嵌入维度)。我可以将 3D 数据集输入密集层吗?
谢谢
text-classification keras word-embedding keras-layer natural-language-processing
我想定义我的自定义池化层,而不是像 MaxPooling 层那样返回最大值,它会输出 k 个最大值和 k 个最小值。
我使用 Tensorflow 作为后端。我需要对输出向量进行排序。
我正在考虑这样做:
from keras.layers.pooling import _Pooling1D
class MinMaxPooling1D(_Pooling1D):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MinMaxPooling1D, self).__init__(**kwargs)
def _pooling_function(self, inputs, **kwargs):
sorted_ = tf.contrib.framework.sort(inputs, axis = -1)
print(sorted_)
return np.concatenate((sorted_[:,:,:self.output_dim/2], sorted_[:,:,-self.output_dim/2:]))
Run Code Online (Sandbox Code Playgroud)
但后来我得到:
Tensor("min_max_pooling1d_1/sort/Neg_1:0", shape=(?, 1, 1, ?), dtype=float32)
ValueError: zero-dimensional arrays cannot be concatenated
Run Code Online (Sandbox Code Playgroud)
MinMaxPooling1D 层应用于 (None, 1, 10) 形状输出。
我当时正在考虑在 MinMaxPooling1D 之前添加一个 Flatten 层,但随后有一个维度问题:
ValueError: Input 0 is incompatible with layer min_max_pooling1d_5: expected ndim=3, found ndim=2
Run Code Online (Sandbox Code Playgroud) 这是我尝试保存并加载模型后的代码:
model.save('path_to_my_model.h5')
del model
model = tf.keras.models.load_model('path_to_my_model.h5', custom_objects={'Wraparound2D': Wraparound2D})
import tensorflow.keras.backend as K
inp = model.input # input placeholder
outputs = [layer.output for layer in model.layers] # all layer outputs
functor = K.function(inp, outputs) # evaluation function
layer_outs = functor([X_test, 1.])
# Plot activations of different neurons in different layers
all_layer_activations = list()
min_max_scaler = lambda x : (x - np.min(x))/(np.max(x) - np.min(x))
# min_max_scaler = lambda x : (x - np.mean(x))
for j in range(1, 5):
if j==1:
layer_im …Run Code Online (Sandbox Code Playgroud)我使用的是从这个回购协议Mask_RCNN包:https://github.com/matterport/Mask_RCNN。
我尝试使用这个包训练我自己的数据集,但它在开始时给了我一个错误。
2020-11-30 12:13:16.577252: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcuda.so.1
2020-11-30 12:13:16.587017: E tensorflow/stream_executor/cuda/cuda_driver.cc:314] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
2020-11-30 12:13:16.587075: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (7612ade969e5): /proc/driver/nvidia/version does not exist
2020-11-30 12:13:16.587479: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN)to use the following CPU instructions in performance-critical operations: AVX2 FMA
To enable them in other operations, rebuild …Run Code Online (Sandbox Code Playgroud) 我尝试从tensorflow.keras.layers导入 CuDnnLSTM以提高训练速度,但出现此错误。我知道 Keras 2.0.8 和 python 3.5 的用户也提出了类似的问题。
我的配置是tensorflow版本2.0.0-beta1和Python 3.6.10。
这就是我尝试过的: from tensorflow.keras.layers import CuDNNLSTM
我收到此错误, ImportError:无法导入名称“CuDNNLSTM”
请问有人知道如何修复此错误吗?提前致谢!
python-3.x deep-learning tensorflow recurrent-neural-network keras-layer
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Embedding, Dense, Dropout, Reshape, Merge,
BatchNormalization, TimeDistributed, Lambda, Activation, LSTM, Flatten,
Convolution1D, GRU, MaxPooling1D
from keras.regularizers import l2
from keras.callbacks import Callback, ModelCheckpoint, EarlyStopping
from keras import initializers
from keras import backend as K
from keras.optimizers import SGD
Run Code Online (Sandbox Code Playgroud)
ImportErrorTraceback (most recent call last)
<ipython-input-104-b13df7676198> in <module>()
16 from keras.regularizers import l2
17 from keras.callbacks import Callback, ModelCheckpoint, EarlyStopping
---> …Run Code Online (Sandbox Code Playgroud) 我正在用顺序模型研究keras。
model = Sequential()
model.add(Embedding(max_features, 128, input_length=text_max_words))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
Run Code Online (Sandbox Code Playgroud)
Flatten在这里做什么?
我有一个我无法解决的问题。
我想将具有完全连接的 MLP 的 CNN 模型实现到我的具有 2589 个蛋白质的蛋白质数据库。每个蛋白质有 1287 行 69 列作为输入和 1287 行和 8 列作为输出。实际上有 1287x1 的输出,但我使用了一种热编码作为类标签,以便在我的模型中使用交叉熵损失。
我也想要
如果我们认为图像我有一个 3d 矩阵 ** X_train = (2589, 1287, 69) for input** 和y_train =(2589, 1287, 8) output,我的意思是输出也是矩阵。
在我的 keras 代码下面:
model = Sequential()
model.add(Conv2D(64, kernel_size=3, activation="relu", input_shape=(X_train.shape[1],X_train.shape[2])))
model.add(Conv2D(32, kernel_size=3, activation="relu"))
model.add(Flatten())
model.add(Dense((8), activation="softmax"))
Run Code Online (Sandbox Code Playgroud)
但是我遇到了关于密集层的错误:
ValueError: Error when checking target: expected dense_1 to have 2 dimensions, but got array with shape (2589, 1287, 8)
Run Code Online (Sandbox Code Playgroud)
好的,我知道 Dense 应该采用正整数单位(Keras 文档中的解释。)。但是我如何实现矩阵输出到我的模型?
我试过了:
model.add(Dense((1287,8), activation="softmax")) …Run Code Online (Sandbox Code Playgroud) 我发现keras.backendor 中有很多相同的名称keras.layers,例如keras.backend.concatenate和keras.layers.Concatenate。我隐约知道一个是张量,另一个是层。但是,当代码太大时,那么多函数使我感到困惑,即张量或层。有人有解决这个问题的好主意吗?
我发现的一种方法是首先在一个函数中定义所有占位符,但是该函数将其视为变量可能会在最后返回层,而另一个函数将这一层视为变量可能会返回另一个变量。
我正在从事一个天文图像分类项目,目前正在使用 keras 构建 CNN。
我正在尝试构建一个预处理管道,以使用 keras/tensorflow 层来增强我的数据集。为了简单起见,我想实现二面体组的随机变换(即,对于方形图像,90 度旋转和翻转),但似乎tf.keras.preprocessing.image.random_rotation只允许在遵循均匀分布的连续选择范围。
我想知道是否有一种方法可以从指定度数列表中进行选择,在我的例子中是 [0, 90, 180, 270]。
keras tensorflow keras-layer image-preprocessing image-augmentation
我听很多人谈论一些原因,但他们从未真正回答是否应该修复。我检查了数据集是否存在泄漏,并从 TFRecords 数据集中随机抽取 20% 作为验证集。我开始怀疑我的模型有太多正则化层。我是否应该减少正则化以使验证线位于训练线之上?或者这真的很重要吗?
neural-network tensorflow keras-layer dropout overfitting-underfitting
keras-layer ×13
keras ×11
tensorflow ×9
python ×2
3d ×1
dropout ×1
flatten ×1
importerror ×1
keras-2 ×1
keras-lambda ×1
max-pooling ×1
natural-language-processing ×1
python-3.x ×1
tf.keras ×1